Несоответствие типов аргументов VBA ByRef несовместимо? - PullRequest
0 голосов
/ 16 января 2019

Я пишу короткий скрипт на VBA, который печатает и сравнивает временные метки в разных ячейках. Код работает нормально, однако меня смущает несоответствие «несоответствия типов изобилия ByRef». Мой код ниже.

Function nextrow()
With ActiveSheet
    nextrow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
    End With

End Function
____

Private Sub buttonclick(nr As Integer)
With ActiveSheet
    .Cells(nr, 2) = Now
    If nr = 2 Then Exit Sub
        dur = .Cells(nr, 2) - .Cells(nr - 1, 2)
        .Cells(nr - 1, 3) = dur
    End With

End Sub
____

Private Sub distract2()
nr = nextrow

If nr = 2 Then Exit Sub
    buttonclick nr - 1

End Sub

Если вы посмотрите на distract2, вы заметите, что я не определил nr как целое число, но даже при этом он без проблем проходит до buttonclick.

Однако, когда я удаляю -1 после nr, VBA выдает ошибку ByRef.

Два вопроса:

  • Кто-нибудь знает, почему это происходит?
  • Лучше dim nr as Integer или нет?

1 Ответ

0 голосов
/ 16 января 2019

Поскольку вы имеете дело со строками, я бы рекомендовал использовать Long вместо Integer. Вы получаете эту ошибку, потому что в Private Sub buttonclick(nr As Integer) она ожидает Integer, и вы передаете Variant

Изменить Private Sub buttonclick(nr As Integer) на Private Sub buttonclick(nr As Long)

и используйте это

Private Sub distract2()
    Dim nr As Long
    Dim nVal As Long

    nr = nextrow

    If nr = 2 Then Exit Sub

    nVal = nr - 1

    buttonclick nVal
End Sub

Однако, когда я удаляю -1 после nr, VBA выдает ошибку ByRef. Два вопроса: кто-нибудь знает, почему это произошло? Лучше тускнеть как Integer или нет?

Когда вы сохраняете -1, оно вычитает значение на 1, и результат имеет тип Integer, и, следовательно, вы не получите ошибку. Если бы nr было 104857, это дало бы ошибку. Интересное чтение

Да, лучше сменить ваши переменные на соответствующий тип данных. Однако в вашем случае это должно быть Long вместо Integer, как указано выше

Ваш полный код можно записать как

Option Explicit

Private Sub distract2()
    Dim nr As Long
    Dim nVal As Long

    nr = nextrow

    If nr = 2 Then Exit Sub

    nVal = nr - 1

    buttonclick nVal
End Sub

Function nextrow() As Long
    With ActiveSheet
        nextrow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
    End With
End Function

Private Sub buttonclick(nr As Long)
    With ActiveSheet
        .Cells(nr, 2) = Now
        If nr = 2 Then Exit Sub
        .Cells(nr - 1, 3) = .Cells(nr, 2) - .Cells(nr - 1, 2)
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...