2013-10-14 3 views
1

Мне была предоставлена ​​функция VBA, которая работает, но я не понимаю, как она работает, и будет благодарна вам за помощь, потому что, как она была написана, исчисление действительно длинное (базовая арифметика * 15 000 строк)VBA Excel - переменная «Double» as function

Моя проблема исходит из определения двойной переменной 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

'Dim Qty_level (30) Как Double' объявляет Qty_level как массив из 30 элементов Double. –

+1

@PatriciaShanahan на самом деле как массив из 31 элемента :) – varocarbas

+0

yep 31 добро пожаловать в VBA –

ответ

3

С Dim Qty_Level(30) As Double вы объявляющего статический массив называется Qty_Level, содержащий 31 элементов типа Double (с плавающей запятой с двойной точностью), с нижней границей 0 и верхней границей 30. (Если вы не написали Option Base 1 в верхней части вашего модуля, в этом случае ваша нижняя граница равна 1 и всего 30 элементов, но я сомневаюсь.)

Я вижу это в вас r, вы начинаете свою итерацию в j = 1, что означает, что вы никогда не получаете доступ к элементу 0. Так что лучше практика, чтобы явно указать нижнюю границу:

Dim QtyLevel(1 To 30) As Double 
+0

Симпатично объяснено + 1 для 'Option Base 1' :) –

+0

Да, вы заслуживаете зеленый V тоже, но я чувствовал, что Ratafia нужно поощрять немного больше! Спасибо за замечание, хотя это может быть очень полезно! –

+0

@alexc: чтобы поощрять участника, вы всегда можете повышать, но ответ, который вы должны выбрать, всегда должен быть тем, который на самом деле отвечает на ваш вопрос ;-), чтобы гарантировать, что будущие посетители узнают, кто на самом деле помог вам в случае, если они тот же вопрос ... –

4

При определении массива со скобками и значение внутри них, он создает массив с таким количеством элементов, содержащихся в нем. Измеряя его на 30, поскольку максимальное значение элемента означает, что для переменной между 0 и 30 (поскольку массив будет начинаться с 0 по умолчанию), вы можете сохранить до 31 значения внутри массива. Измерение его как двойного (в соответствии с MSDN) позволяет хранить самые большие и наименьшие числа, доступные в Visual Basic.

То, что, по-видимому, представляет собой цикл, - это вытащить значение количества из столбца количества, исходя из числа в столбце уровней, а затем умножить каждое значение хранимой величины до сих пор, сохраняя его в ячейке результатов.

Так что если ваши количества равны 2, 4, 6, 5, когда вы находитесь на уровне 3, ваша результирующая ячейка должна показать 48, а уровень 4 должен показывать 240. Зацикливание от 1 до значения уровней позволяет ему проходить через все количество хранимых величин в двойной массиве, которое просто содержит числа. Столбец уровней должен содержать только числа от 1 до 30, в противном случае это приведет к ошибке из массива qty_level.

+3

+ 1 Для получения дополнительной мили, чтобы объяснить :) –