Есть ли способ найти значение и установить его в качестве ссылки в формуле? - PullRequest
0 голосов
/ 29 марта 2019

У меня есть 7-значное родительское значение, указанное в столбце A, которое мне нужно использовать в формуле в столбце E. За родительским значением следует случайное число из 4-значных дочерних значений, и оно будет сброшено с новым родительским значением.Мне нужно сослаться на родительскую строку в формуле, которая является дочерним кол-во / родительским кол-во, не зная точного интервала между дочерними строками.

Я довольно новичок в VBA и 100% самоучка.Я никогда не использовал переменную в формуле раньше.Я собрал следующий код, но у меня возникли проблемы со ссылками на мой ключ и размещением формулы переменной.

Sub FindRatio()
'

'
    Range("D2").Select
    Application.CutCopyMode = False
    'This is setting a Key in column D to Flag the parent
    '1= parent , 0 = child
    ActiveCell.FormulaR1C1 = "=IF(LEN(RC[-3])>4,""1"",""0"")"
     Dim LastRow As Long
     'A = ID column
         LastRow = Range("C" & Rows.Count).End(xlUp).Row
         Range("D2").AutoFill Destination:=Range("D2:D" & LastRow)

With Range("D2:D" & LastRow)
    Set c = .Find(1, LookIn:=xlValues)
   If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            'formula to make child qty/parent qty
            c.Value = ActiveCell.FormulaR1C1 = "=RC[-2]/R[-1]C[-2]"
            Set c = .FindNext(c)
        Loop While Not c Is Nothing
    End If
End With

End Sub

Ячейка A2 имеет 7-значный родительский идентификатор с количеством в C2.Дочерний идентификатор будет находиться в следующих ячейках A3: A7 с количествами, указанными в ячейках C3: C7, причем второй родительский элемент начинается в строке 8 в ячейке A8.Я пытаюсь сделать код в ячейке E3 (первый дочерний элемент) be = C3 / C2, а в ячейке E4 (второй дочерний элемент) be = C4 / C2.Это будет продолжаться через E7, а затем сбросить родительское количество после следующего родительского идентификатора.Ячейка E9 должна быть = C9 / C8.

1 Ответ

0 голосов
/ 29 марта 2019

Следующая подпрограмма должна вычислить необходимые вам соотношения:

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 Это всегда хорошая идея, чтобы быть осторожным с вашим отступом.Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...