2016-09-23 3 views
1

В Excel 2010 я пытаюсь передать «Target» из события Worksheet_Change в подпрограмму. Sub проверяет, произошло ли изменение в определенном диапазоне и делает некоторые вещи, если это произойдет. Проблема, с которой я сталкиваюсь, заключается в том, что цель, похоже, ведет себя по-другому в том, что в вызывающей процедуре. Например, в вызывающей процедуре я могу использовать Target внутри пересечения, когда я передаю его в подпрограмму и делаю то же самое, что получаю ошибку времени выполнения (1004). Мой код ниже, я был бы признателен, если кто-нибудь сможет сообщить мне, что я делаю неправильно.Передача цели в Sub в Excel VBA

«Код на листе - это на нескольких листах

Private Sub Worksheet_Change(ByVal Target As Range) 
     SubRout Target 
End Sub 

» Код в модуле

Sub SubRout (ByVal Target As Range) 

    Dim ValidChange As Boolean 

    ValidChange = True 

    'Check if change on sheet was a change to cell in named range 
    If Intersect(Target, Names("WB4aWBSRange").RefersToRange) Is Nothing Then ValidChange = False 

    If ValidChange = True And Target.value <> "" Then 

     'Do stuff 

    End If 

End Sub 

Ошибка времени выполнения происходит на линии Intersect, но если я перееду весь код вверх к вызывающей программе он работает нормально.

ответ

3

Ошибка не из-за этого. Ошибка из-за Names("WB4aWBSRange").RefersToRange. Вы не можете использовать его так.

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

If Intersect(Target, Range("WB4aWBSRange")) Is Nothing Then ValidChange = False 
+1

спасибо. Это зафиксировало это, но, насколько я знаю, как эти два рассматриваются по-разному, и почему моя версия работает, когда этот код перемещается до события Worksheet_Change? – laserdunc

+1

Думаю, я мог бы это понять. «WB4aWBSRange» - это именованный диапазон на уровне листа, а не уровень рабочей книги, поэтому, возможно, когда вы переходите к коду в модуле, он не может согласовать его с одним именованным диапазоном. Верный? Или на милю !? – laserdunc

+1

@laserdunc - 'Имена' является свойством рабочего листа. Когда вы вызываете его из модуля рабочего листа, он использует его в области рабочего листа. Когда вы вызываете, если из модуля, отличного от листа, он использует 'Names' в глобальной области. – Comintern

1

Поскольку is Nothing возвращает логическое значение, первое, если утверждение не требуется:

ValidChange = Not Intersect(Target, Range("WB4aWBSRange")) Is Nothing

Я предпочел бы не использовать переменную вообще и делать это вместо :

If Not Intersect(Target, Range("WB4aWBSRange")) Is Nothing' then 


    If Target.value <> "" Then 


     'Do stuff 

    End If 

End Sub 
Смежные вопросы