Источник ошибки кода
Ошибка возникает из-за того, что ваш targetCell на самом деле не определен.
Вы должны:
- определить вашу переменную и введите it
- , используйте ключевое слово
Set
, чтобы назначить объект
Вот ваш адаптированный код:
Sub addNonZeroes()
Dim targetCell As Range
' Select cell E5, *first line of data*.
Range("E5").Select
' Set Do loop to stop when an empty cell is reached.
Do Until IsEmpty(ActiveCell)
If ActiveCell.Value <> 0 Then
Set targetCell = ActiveCell.Offset(1, 0)
Do Until ActiveCell.Value = 0
'ERROR OCCURS HERE
targetCell.Value = ActiveCell.Value + targetCell.Value
ActiveCell.Offset(0, 1).Select
Loop
End If
' Step down 1 row from present location.
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Использование Select и Offset - плохая идея
Тем не менее, вы должны учитывать , не используя Select and Offset , потому что это очень медленно.
Лучшим способом был бы такойof loop:
Dim c As Range
For Each c in Range("E5:E100")
If c.Value <> 0 Then
'do whatever
End If
Next c
Использование диапазона в массиве - это очень VBA-способ
Обратите внимание, что вы можете использовать Variant для хранения каждого значения диапазона в массиве, что-то вроде этого:
Dim arr As Variant, i As Integer
arr = Range("E5:E100").Value
For i = LBound(arr , 2) To UBound(arr , 2)
'check for any empty value
Next i
См. Эту ветку для дополнительных примеров: Массив из Range в Excel VBA