1

我得到了一个正在工作的 VBA 函数,但我不明白它是如何工作的,希望能得到你的帮助,因为在它的编写方式上,微积分真的很长(基本算术 * 15 000 行)

我的问题来自 Double 变量 Qty_Level 的定义,定义如下:

Dim Qty_Level(30) As Double

我从来没有见过像这样定义的变量,像函数一样带有一对括号。这是我的代码:

Sub cumul()

    Dim i As Long
    Dim j As Integer
    Dim Qty_level(30) As Double
    Dim Col_Niveau As Integer
    Dim Col_Quantite As Integer
    Dim Col_Resultat As Integer

    i = InputBox("Veuillez indiquer le numéro de la première à analyser (numéro de     ligne Excel)", "Ligne de départ")
   Col_Niveau = InputBox("Veuillez indiquer le numéro de la colonne contenant les niveaux", "Niveaux")
   Col_Quantite = InputBox("Veuillez indiquer le numéro de la colonne contenant les quantités", "Quantités")
   Col_Resultat = InputBox("Veuillez indiquer le numéro de la colonne contenant les résultats", "Résultats")

   Do While IsEmpty(Cells(i, Col_Niveau)) = False

   If IsNumeric(Cells(i, Col_Quantite)) = True Then

        Qty_level(Cells(i, Col_Niveau).Value) = Cells(i, Col_Quantite).Value
        Cells(i, Col_Resultat).Value = 1

        For j = 1 To Cells(i, Col_Niveau).Value
            Cells(i, Col_Resultat).Value = Cells(i, Col_Resultat).Value * Qty_level(j)
        Next j

    End If

    i = i + 1

Loop


End Sub

我不明白这是如何工作的,尤其是For循环如何与Double(j)

4

2 回答 2

4

当您定义一个带有括号和其中的值的数组时,它会创建一个包含那么多元素的数组。使用 30 作为最大元素值对其进行标注意味着对于 0 到 30 之间的变量(因为默认情况下数组将从 0 开始),您最多可以在数组中存储 31 个值。将其标注为双精度数(根据 MSDN)允许您存储 Visual Basic 中可用的最大和最小数字。

循环似乎做的是根据级别列中的数字从数量列中提取数量值,然后将到目前为止存储的每个数量值相乘,将其存储到结果单元格中。

因此,如果您的数量是 2、4、6、5,当您处于第 3 级时,您的结果单元格应显示 48,第 4 级应显示 240。从 1 循环到级别值允许它遍历存储的全部数量双精度数组中的数量,它只包含数字。级别列只能包含 1 到 30 之间的数字,否则会从 qty_level 数组中得出错误。

于 2013-10-14T13:18:51.013 回答
3

With Dim Qty_Level(30) As Double you're declaring a static array called Qty_Level containing 31 elements of type Double (double-precision floating-point), with lower bound 0 and upper bound 30. (Unless you wrote Option Base 1 at the top of your module, in which case your lower bound is 1 and there are 30 elements total, but I doubt it.)

I see that in your current loop, you're starting your iteration at j = 1 which means you never actually access element 0. So it's better practice to explicitly specify your lower bound:

Dim QtyLevel(1 To 30) As Double
于 2013-10-14T13:18:03.837 回答