Как мне обратиться к ячейке в Excel через переменную и получить доступ ко всем ее свойствам в Visual Basic? - PullRequest
0 голосов
/ 06 марта 2012

Я работаю над макросом в Excel, которому нужно перебрать весь столбец и найти кластеры ненулевых данных, сложить данные и сохранить результат рядом с упомянутым кластером. Затем он продолжает вниз по столбцу в поисках других кластеров и делает то же самое.

При этом я пытаюсь сохранить ссылку на «целевую» ячейку (где будет добавлено добавление кластера) в переменной, а затем использую эту переменную для доступа к свойству «value» ячейки. чтобы я мог внести в него изменения.

Вот код:

 Sub addNonZeroes()

 Dim targetCell

 ' 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
         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

1 Ответ

1 голос
/ 06 марта 2012

Источник ошибки кода

Ошибка возникает из-за того, что ваш 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

...