Как: определить диапазон, а затем последнюю ячейку в диапазоне и вставить адрес абсолютной ячейки в формулу R1C1 - PullRequest
0 голосов
/ 25 марта 2019

Давний юркер, первый постер, так как это мой первый настоящий макрос VBA, и я столкнулся с препятствием, которое мне не удалось преодолеть.

У меня есть книга Excel с таблицами, отформатированными следующим образом:

Worksheet Example

Я пытался написать некоторый код, который будет заполнять столбец "% веса" формулой, которая будет делить значение смежногоячейка в столбце «Вес» по значению ячейки, которая содержит функцию суммы ниже каждого диапазона ячеек.

У меня на листе десятки таблиц, разделенных на несколько пустых строк, все отформатированные по вертикали,Мне нужно, чтобы ячейки идентифицировали правильную ячейку суммы и поделили ячейку смещения на значение.

Я пробовал приведенный ниже код.

В основном я пытался выполнить цикл For Each через "% Веса »и укажите, когда соседняя ячейка в поле« Вес »не была пустой.Затем он определил бы ячейку смещения, установив переменную диапазона, а затем установил другую переменную, чтобы идентифицировать последнюю ячейку в диапазоне, следовательно, идентифицируя ячейку, содержащую формулу суммы.

Я знаю, что моя логика If работаетТем не менее, как я должен был заполнить столбец «% вес» со значением «1», если была соседняя ячейка, и это работало.

Я получаю ошибку 424 или несоответствие типов.

Проблемы с блоком кода:

Dim cell As Range, rng2 As Range, sideweight As Range, TargetWeight As Range
Dim TargetWeightr As Long, Dim TargetWeightc As Long

rng2 = Range("D1:D" & LR)


For Each cell In rng2
    If cell.Offset(0, -1).Value <> "" Then
    Set sidewight = cell.Offset(0, -1)
    Set TargetWeight = sideweight.End(xlDown)
    Set TargetWeightr = TargetWeight.Address.Row
    Set TargetWeightc = TargetWeight.Address.Column
    'cell.FormulaR1C1 = "=RC[-1]/R[" & TargetWeightr & "]C[" & TargetWeightc & "]"
    End If
Next cell

Весь макрос для контекста:

Sub WeightCalculations2()

Application.ScreenUpdating = False


Dim rng As Range, cell As Range, rng2 As Range, rA As Range, totalweight As Range, totalweightrng As Range
Dim sideweight As Range, TargetWeight As Range
Dim LR As Long, TargetWeightr As Long, TargetWeightC As Long

Dim ws As Worksheet

Set ws = ActiveSheet

With ActiveSheet
    LR = Cells(Rows.Count, "A").End(xlUp).Row
End With

Set rng = ws.Range("I2:I" & LR)
Set rng2 = ws.Range("J2:J" & LR)

For Each cell In rng
    If cell.Offset(0, -1).Value = "EA" Then cell.FormulaR1C1 = "=RC[-2]*RC[3]"
    If cell.Offset(0, -1).Value = "LB" Then cell.FormulaR1C1 = "=RC[-2]*1"
Next cell

For Each cell In rng
    If WorksheetFunction.IsError(cell) Then cell.Formula = "=1*0"
Next cell



For Each rA In Columns("I").SpecialCells(xlFormulas).Areas
    rA.Cells(rA.Cells.Count + 1).Formula = "=SUM(" & rA.Address & ")"
Next rA


For Each cell In rng2
    If cell.Offset(0, -1).Value <> "" Then
    Set sidewight = cell.Offset(0, -1)
    Set TargetWeight = sideweight.End(xlDown)
    Set TargetWeightr = TargetWeight.Address.Row
    Set TargetWeightC = TargetWeight.Address.Column
    'cell.FormulaR1C1 = "=RC[-1]/R[" & totalweightrn & "]C[" & totalweightcn & "]"
    End If
Next cell


End Sub

Ожидаемый результат: Программа заполняет ячейки в столбце «% Вес» формулой, разделяющей значениесоответствующая ячейка смещения в столбце «Веса» на значение ячейки, содержащей сумму для соответствующего диапазона ячеек.

Фактический результат: ошибка 424 и / или ошибка несовпадения.

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

1 Ответ

0 голосов
/ 25 марта 2019
  • TargetWeight.Address.Row должно быть TargetWeight.Row
  • TargetWeight.Address.Column должно быть TargetWeight.Column
  • Когда вы создаете адрес в стиле xlR1C1, n внутри [n] является относительной настройкой строки или столбца. RC[-1] означает та же строка, один столбец слева . Вам нужен абсолютный адрес, и у вас есть абсолютные строки и столбцы в виде длинных целых чисел, поэтому R" & totalweightr & "C" & totalweightc
  • Вы не Set целочисленные значения, вы назначаете их с =. Вы только Set объекты, такие как диапазоны, ячейки, таблицы и т. Д.

    For Each cell In rng2
        If cell.Offset(0, -1).Value <> "" Then
            Set sidewight = cell.Offset(0, -1)
            Set TargetWeight = sideweight.End(xlDown)
            TargetWeightr = TargetWeight.Row
            TargetWeightc = TargetWeight.Column
            cell.FormulaR1C1 = "=RC[-1]/R" & TargetWeightr & "C" & TargetWeightc
        End If
    Next cell
    

Вы также можете забыть обо всех манипуляциях и просто использовать TargetWeight.Address в стиле xlR1C1.

For Each cell In rng2
    If cell.Offset(0, -1).Value <> "" Then
        Set sideweight = cell.Offset(0, -1)
        Set TargetWeight = sideweight.End(xlDown)
        cell.FormulaR1C1 = "=RC[-1]/" & TargetWeight.Address(referencestyle:=xlR1C1)
    End If
Next cell
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...