2

我试图找出最简洁的方式来显示,例如,初始值说300asx和关键路径说1.5as y。这两个值都可以通过在工作表上的输入进行更改。

连同这些价值观,我们拥有a和的资源b。在这种情况下,a将填充200一行中的单元格b并将填充100.

正如我之前提到的,x并且y可以改变,比如说,如果y2a填充150b填充150。如果y1则仅a填充300

目前我正在使用 If 语句,但我觉得这很混乱,可能会导致无穷无尽的代码,以涵盖所有可能的结果,我需要一个更好的解决方案。

这是我目前正在实现的一个简单示例:

Private Sub Example()

    Dim ActiveWB As Worksheet
    Set ActiveWB = ActiveWorkbook.Sheets("Sheet1")
    Dim cell As Range
    Dim a, b, x, y As Double

    x = ActiveWB.Range("A1").Value
    y = ActiveWB.Range("A2").Value
    a = x / y
    b = x - a

        For Each cell In ActiveWB.Range(Cells(3, 1), Cells(3, a))

            If (cell.Column >= 0) And (cell.Column <> x) Then

                If (y = 1) And (a > 0) Then
                   cell.Value = "a"
                    a = a - 1

                ElseIf (y > 1) And (y < 2) And (a > 0) Then
                   cell.Value = "a"
                   a = a - 1
                   If (b > 0) Then
                        cell.Offset(1, 0).Value = "b"
                        b = b - 1
                   End If

               ElseIf (y >= 2) And (y < 2.5) And (a > 0) Then
                   cell.Value = "a"
                   a = a - 1
                   If (b > 0) Then
                        cell.Offset(1, 0).Value = "b"
                        b = b - 1
                   End If

                '..... and so on......

                End If

            End If

        Next cell

End Sub

任何建议将不胜感激。感谢您的时间。Y。

4

2 回答 2

5

首先,应分别为每个变量声明类型:

Dim a, b, x, y As Double

变成:

Dim a As Double, b As Double, x As Double, y As Double

或者(这是我更喜欢的):

Dim a As Double
Dim b As Double
Dim x As Double
Dim y As Double

其次,如果您的 a 和 b 仅用于确定范围宽度,那么它们最好不是浮点类型。改为使用整数(小于 2^15)或长整数:

Dim a As Integer
Dim b As Integer
Dim x As Double
Dim y As Double

那么你对 a 和 b 的赋值就不能保持现在的状态,而应该是这样的:

a = Int(x / y)
b = Int(x - a)

然后我希望您的 x 和 y 值限制为工作表中的值 > 0 和 x > y。如果没有,那么首先在你的脚本中测试它......

现在最后以及您最初的问题),如果您愿意,您可以为完整的单元格范围分配一个值:

If a > 0 Then Range(Cells(3, 1), Cells(3, a)).Value = "a"
If b > 0 Then Range(Cells(4, 1), Cells(4, b)).Value = "b"

我不明白你为什么从 a 和 b 中取 1,所以如果这真的增加了一些东西,请详细说明一般逻辑......

于 2013-10-15T14:28:15.993 回答
2

我可能不完全理解复杂性,但根据您分享的内容,您可以用以下内容替换您的 for 循环以达到相同的结果:

ActiveWB.Range(Cells(3, 1), Cells(3, a)).Value = "a"
If b > 0 then
    ActiveWB.Range(Cells(4, 1), Cells(4, b)).Value = "b"
End If
于 2013-10-15T14:21:30.823 回答