0

我正在尝试在 VBA 数组中模拟我在 Excel 中轻松完成的操作,但我无法让它运行。我认为这与计算的性质有关,这取决于计算行的顺序。我将附上一个带有 VBA 代码的 Excel 工作表,但也会在此处包含它。

这个简化的例子是一个更大的数组的替代品,它有大约 50 行和 80 列的计算。一个特定的列具有一组计算,这些计算取决于该行相对于选定行的位置 - 如果行号较高,则应用一组计算,该计算基于上一行的值;如果行号较低,则应用另一组计算,使用 NEXT 行中的值。这个简化的示例如下所示:

在此处输入图像描述

三个蓝色列来自 VBA。接下来的两个白色列是在 Excel 中完成的相同计算(它们执行得更快!)。

您可以看到第二个蓝色列有一组值,这些值在第 4 行上方向上计算,在第 4 行下方向下计算。基本上在单元格 C2 中有一个输入,称为 Select Row,它确定“中间”行是哪个,它输入在该行的单元格 C3 (46) 中输入值,然后在每个后续行中,它将上一行的值乘以相同的 46。反过来,对于“中间”行下方的每一行,每行将下一行乘以 46 . 这是一堆其他复杂三角计算的替身。这对于 Excel 来说是微不足道的,它似乎并不关心哪个单元格取决于什么,它只是返回正确的值,但在 VBA 中却非常困难——无论如何对我来说。

我已经能够通过迭代整个计算列足够的时间来填充依赖于 NEXT 行值的单元格的值来解决这个问题,这些值在第一遍是空的,因为 NEXT 行还没有一个值。我可能没有以最有效的方式做到这一点,如果您有更好的想法,我会很高兴听到它。

但真正的问题是,在另一列中,我想使用进程返回的值。在第三个蓝色列的 Excel 版本中,F 列中的每一行从 E 列中 NEXT 行中的值减去 E 列中该行中的值(F 中的第一个单元格与它正在使用的两个单元格一起以黄色突出显示)。无论该行相对于“选择行”输入编号的位置,它都会执行此操作。我无法在 VBA 的数组中制作一个可以在我的数组中使用的版本。

我尝试了很多方法,但我所做的似乎没有任何效果。不知何故,在数组中循环,从属列 3 从不返回值,我得到一个下标超出范围错误。我尝试了几种策略,但都没有奏效,而且我没有想法。我附上了我用过的 VBA 代码:

Sub SimplifiedExample()

Dim myArray(1 To 10, 1 To 3) As Double
    'for this example the first column is just the index value i, the second is a calculation that depends on the row, and the third refers to another calculation based on the result of the second
Dim selectrow As Integer
    'represents an input value from a User Form, but just coded in here for this example
Dim valuefromAnotherArray As Double
    'represents something calculated elsewhere and referenced here

Dim n As Integer 'iteration counter
Dim i As Integer 'index counter
Dim x As Integer 'yet another counter!


    selectrow = Range("C2") 'user input
    valuefromAnotherArray = Range("C3") 'represents the result of a calculation elsewhere
    
'Because some of the rows depend on the value in the NEXT row which hasn't been calculated yet,
'the sub needs to be repeated as many times as there are rows < select row
'so there is an iteration counter and a normal row counter
For n = LBound(myArray) To selectrow
    For i = LBound(myArray) To UBound(myArray)
        myArray(i, 1) = i
        
        Select Case myArray(i, 1)
        'This bit does the up and down calculation that depends on the row's position relative to select row
            Case Is = selectrow
                myArray(i, 2) = valuefromAnotherArray
            Case Is > selectrow
                myArray(i, 2) = myArray(i - 1, 2) * valuefromAnotherArray 'represents a complex calculation
            Case Is < selectrow
                myArray(i, 2) = myArray(i + 1, 2) * valuefromAnotherArray
        End Select

        'Approach A - This doesn't work in this position. It throws a Subscript Out Of Range error.
        'myArray(i, 3) = myArray(i + 1, 2) - myArray(i, 2)
        
        Debug.Print myArray(i, 1), myArray(i, 2) ',myarray(i,3) doesn't work yet
        Cells(i + 5, 2).Value = myArray(i, 1)
        Cells(i + 5, 3).Value = myArray(i, 2)
        Cells(i + 5, 4).Value = myArray(i, 3) 'doesn't work
    Next i
Next n

'Approach B
'Tried adding another counter to cycle through the values produced above and actually use them in the rest of the array
'but throws another Subscript Out Of Range error, so it doesn't work here either
    'For x = LBound(myArray) To UBound(myArray)
    '    myArray(x, 3) = myArray(x + 1, 2) - myArray(x, 2)
    '    Cells(x + 5, 4).Value = myArray(x, 3)
    'Next x

 End Sub

这是一个包含 VBA 的 Excel 文件的链接。 链接到 Excel 中的简化示例 我认为可能有比我在这里展示的更简单的方法来完成所有这些操作。感谢您提供的任何帮助,请记住,我希望将其集成到 50 x 80 2D 阵列中。谢谢!

4

1 回答 1

0

这不会完成同样的事情:

编辑第 3 列

Sub test()
    Dim ws As Worksheet
    Dim i As Long, startRow As Long, inputRow As Long
    Dim inputFromOtherArray As Double
    
    Set ws = ThisWorkbook.Worksheets("sheet_name")
    
    startRow = 15
    inputFromOtherArray = 46
    inputRow = 4
    With ws
        For i = 0 To 9
            .Cells(startRow + i, 3).Value = inputFromOtherArray ^ (Abs(inputRow - (i + 1)) + 1)
        Next i
        
        For i = 0 To 8
            .Cells(startRow + i, 4).Value = .Cells(startRow + i + 1, 3).Value - .Cells(startRow + i, 3).Value
        Next i
        
        .Cells(startRow + 9, 4).Value = -.Cells(startRow + i, 3).Value
    End With
End Sub
于 2020-10-14T13:25:20.483 回答