Несоответствие Byref при использовании ячейки в качестве аргумента диапазона - PullRequest
0 голосов
/ 04 августа 2020

В следующей подпрограмме VBA Excel я хочу, чтобы диапазон ячеек выполнял другую подпрограмму с именем Valuation:

Sub Code_1()


With Range("a1:f50")
     Set c = .Find("target", LookIn:=xlValues)
     If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            Valuation c
            Set c = .FindNext(c)
        Loop While c.Address <> firstAddress
     End If
End With

End Sub

Подпрограмма оценки:

Sub Valuation(cell As Range)

cell.Value = 7
          
End Sub

Тем не менее, когда я запустите код, я получаю сообщение: Несоответствие типа аргумента ByRef. Почему?

1 Ответ

3 голосов
/ 04 августа 2020

Лучшая практика - всегда объявлять переменные. Добавьте Option Explicit в верхнюю часть модуля. Затем от go до Инструменты > Параметры и отметьте Требовать объявления переменной , чтобы Option Explicit автоматически добавлялся в дальнейшем.

Поскольку c не объявлен, это Variant, а не Range.

Обратите внимание, что неявное ByRef, вероятно, должно быть явным ByVal.

Option Explicit

Sub Code_1()

    Dim c As Range
    ...
    Dim firstAddress As String
    ...

End Sub

Sub Valuation(ByVal cell As Range)
    ...
End Sub

И, как указано в ответе на ваш предыдущий вопрос, вам необходимо отрегулировать l oop, если вы заменяете значение после того, как оно было найдено, т.е. измените:

Do
    Valuation c
    Set c = .FindNext(c)
Loop While c.Address <> firstAddress  '<~ this will error when there are no matches left

до

Do While Not c Is Nothing
    Valuation c
    Set c = .FindNext(c)
Loop 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...