Есть ли способ переназначить переменную Range на другой диапазон? - PullRequest
0 голосов
/ 10 января 2020

Я очень новичок в VBA, начав программировать его вчера. Я пишу программу обработки данных, которая требует отслеживания двух ячеек, по одной в каждой таблице. Код, который воспроизводит ошибки, которые я испытываю, приведен ниже. Когда я вызываю sub moveCell () в sub Processor (), ничего не происходит с DIRow и DIColumn, и код выдает ошибку 1004 в указанной строке. Я попытался использовать DICell = DICell.Offset (), но он возвращает ту же ошибку.

Как я могу переопределить переменную Range, чтобы она была другой ячейкой?

'<<Main Processor Code>>'
Sub Processor()

Dim PDRow As Integer
Dim PDColumn As Integer
Dim DIRow As Integer
Dim DIColumn As Integer

PDRow = 1
PDColumn = 1
DIRow = 1
DIColumn = 1

Dim PDCell As Range
Dim DICell As Range

Set PDCell = Worksheets("Processed Data").Cells(PDRow, PDColumn)
Set DICell = Worksheets("Data Input").Cells(DIRow, DIColumn)

Call moveCell(2, 0, "Data Input")

End Sub

'<<Function which moves the cell which defines the range>>'
Sub moveCell(r As Integer, c As Integer, sheet As String)
    If sheet = "Processed Data" Then
        PDRow = PDRow + r
        PDColumn = PDColumn + c
        Set PDCell = Worksheets("Data Input").Cells(PDRow, PDColumn)
    ElseIf sheet = "Data Input" Then
        DIRow = DIRow + r '<<<<<<This line does nothing to DIRow's value
        DIColumn = DIColumn + c
        Set DICell = Worksheets("Data Input").Cells(DIRow, DIColumn) '<<<<<<This line causes error 1004
    End If
End Sub

1 Ответ

1 голос
/ 10 января 2020

Насколько я могу судить, вместо этого вы можете использовать быструю функцию. Похоже, что нет никаких различий в ваших результатах оператора If в функции moveCell(), за исключением того, какой лист вы используете.

Мы можем сделать это проще, обратившись к Range, который вы Вы переходите к moveCell.

Option Explicit ' forces you to declare all variables
Sub something()

Dim PDCell As Range
Set PDCell = Worksheets("Processed Data").Cells(1, 1)

Dim DICell As Range
Set DICell = Worksheets("Data Input").Cells(1, 1)

PDCell.Select ' can remove
Set PDCell = moveCell(2, 0, PDCell, PDCell.Worksheet.Name)
PDCell.Select ' can remove

Worksheets(DICell.Worksheet.Name).Activate ' can remove
DICell.Select ' can remove
Set DICell = moveCell(5, 0, DICell, DICell.Worksheet.Name)
DICell.Select ' can remove

End Sub

Function moveCell(rowsToMove As Long, colsToMove As Long, cel As Range, ws As String) As Range
Set moveCell = Worksheets(ws).Cells(cel.Row + rowsToMove, cel.Column + colsToMove)
End Function

Я добавил несколько строк, которые вам не нужны (которые я пометил комментарием позже), но это покажет вам, как работает подпрограмма. Вы можете шаг за шагом набрать F8 , чтобы увидеть его пошагово.

Редактировать: Хотя, вам вообще не нужна отдельная функция . Просто используйте OFFSET().

Set PDCell = ...whatever originally
Set PDCell = PDCell.Offset([rows],[cols])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...