Следующая подпрограмма должна вычислить необходимые вам соотношения:
Sub QuantityRatios()
Dim N As Long
Dim i As Long
Dim ParentQuantity As Long
N = ActiveSheet.UsedRange.Rows.Count
For i = 2 To N
If Len(Cells(i, 1)) = 7 Then
' This is a parent row, record note its quantity
ParentQuantity = Cells(i, 3)
Else
' This is a child row, divide its quantity by the parent's to get
' the ratio.
Cells(i, 5) = Cells(i, 3) / ParentQuantity
End If
Next i
End Sub
Или, если вы предпочитаете, чтобы ячейки содержали формулы вместо значений, эта подпрограмма должна дать вам то, что вы хотите:
Sub QuantityRatioFormulae()
Dim N As Long
Dim i As Long
Dim ParentRow As Long
N = ActiveSheet.UsedRange.Rows.Count
For i = 2 To N
If Len(Cells(i, 1)) = 7 Then
' This 1is a parent row, record which row it is.
ParentRow = i
Else
Dim difference As Long
' Get the number of rows between this child and its parent.
difference = ParentRow - i
' This is a child row, populate column E with a formula to calculate
' its
Cells(i, 5).FormulaR1C1 = "=RC[-2]/R[" & CStr(difference) & "]C[-2]"
End If
Next i
End Sub
Давайте рассмотрим их построчно, начиная с первого (QuantityRatios):
Dim N as Long
Dim i as Long
Dim ParentQuantity as Long
Объявления переменных не являются строго необходимыми в VBA, но многие считают их хорошей формой,Здесь мы объявляем три переменные: N
, i
и ParentQuantity
.Все они имеют тип Long
, в котором хранится длинное целое число (целое число).Я работаю с предположением, что ваши количества являются целыми числами.Если нет, используйте тип Double
для ваших количественных переменных.N
будет количеством строк в вашей таблице.Мы будем использовать i
для итерации цикла For
.ParentQuantity
будет хранить количество последнего родителя, с которым мы столкнулись, по мере того, как мы будем проходить таблицу строка за строкой.
N = ActiveSheet.UsedRange.Rows.Count
ActiveSheet
относится к текущему рабочему листу в Excel.Excel отслеживает часть листа, которая содержит данные, и вы можете получить к ним доступ с помощью .UsedRange
.Вы можете получить строки диапазона, используя .Rows
и, далее, счет с .Count
.Сложите все это вместе, и у нас будет выражение для вычисления количества строк в используемом диапазоне текущих таблиц - круто.Мы будем использовать это позже.
For i = 2 to N
Мы уже выяснили, сколько строк в вашей таблице, и сохранили это число в N
.Судя по описанию вашей проблемы, данные начинаются со строки 2 (возможно, у вас есть заголовки столбцов в строке 1?).Итак, чтобы перемещаться по вашей таблице строка за строкой, мы хотим начать со строки 2 и закончить строкой N. Циклы For
отлично подходят для такого рода проблем.В цикле i
всегда будет иметь значение строки, которую мы в данный момент просматриваем.
If Len(Cells(i, 1)) = 7 Then
У нас здесь много чего происходит.Давайте начнем с функции Cells
.Range
- это отличный способ получить доступ к ячейке на рабочем листе, если вы заранее знаете ее адрес (например, «E2» или «D5»).Если вы этого не сделаете, вы можете использовать Cells
.Все, что вам нужно сделать, это дать ему номер строки и номер столбца, и вы сможете получить доступ к этой ячейке.Вот что мы делаем здесь: мы говорим, что хотим увидеть значение в строке i
(помните, что i
содержит индекс текущей строки) и в столбце 1 (он же столбец A), который содержит parent / childценности.Вызов Len
для этого значения даст нам длину значения.Если это 7, мы знаем, что это родительская строка.В противном случае это дочерний ряд.Следующая строка кода, которая будет выполнена, будет зависеть от этого.
ParentQuantity = Cells(i, 3)
Опять же, мы используем Cells
для доступа к рабочему листу.В частности, столбец 3 (столбец C) i
-ой строки, которая является количеством родителя.Это будет сохранено в ParentQuantity
для последующего использования.
Cells(i, 5) = Cells(i, 3) / ParentQuantity
Если текущая строка является дочерней, то эта строка выполняется.Доступ к количеству осуществляется аналогичным образом (Cells(i, 3)
), а затем делится на ParentQuantity
, который содержит количество последнего найденного нами родителя.Это значение является отношением и помещается в столбец 5 (столбец E).
В качестве альтернативы, если вы хотите, чтобы ячейки содержали формулы, а не только значения, вы можете отметить индекс строки родительского элемента при прохождении (ParentRow
во втором примере).Конкатенация строк "=RC[-2]/R["
, "-1"
и "]C[-2]"
даст пригодную формулу "=RC[-2]/R[-1]C[-2]"
.Поэтому мы можем просто изменить эту середину "-1"
на то, что мы хотимВ частности, мы хотим, чтобы это была разница между индексом текущей строки и строкой последнего родителя.
Надеюсь, что это вам поможет.Удачи, продолжая узнавать о VBA!
PS Это всегда хорошая идея, чтобы быть осторожным с вашим отступом.Ура!