В 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, но если я перееду весь код вверх к вызывающей программе он работает нормально.
спасибо. Это зафиксировало это, но, насколько я знаю, как эти два рассматриваются по-разному, и почему моя версия работает, когда этот код перемещается до события Worksheet_Change? – laserdunc
Думаю, я мог бы это понять. «WB4aWBSRange» - это именованный диапазон на уровне листа, а не уровень рабочей книги, поэтому, возможно, когда вы переходите к коду в модуле, он не может согласовать его с одним именованным диапазоном. Верный? Или на милю !? – laserdunc
@laserdunc - 'Имена' является свойством рабочего листа. Когда вы вызываете его из модуля рабочего листа, он использует его в области рабочего листа. Когда вы вызываете, если из модуля, отличного от листа, он использует 'Names' в глобальной области. – Comintern