Сегодня я помогал другу решить проблему с VBA в Excel 2007, и мы столкнулись с проблемой, с которой, как мне кажется, я сталкивался в прошлом, и обходили ее.Это проблема с изменением диапазона, к которому относится имя.
На главном рабочем листе моей подруги, в B7, она проверяет данные из списка, где источником является именованный диапазон, CAT_LOOKUP.Она хотела запустить подпрограмму, которая отфильтровывала бы таблицу на другом листе, чтобы показывать только строки, соответствующие значению в B7, а затем использовала эти строки в качестве источника для проверки в другой ячейке на этом листе.
Вот соответствующая часть VBA, которую мы использовали:
Dim strCAT As String
Dim strACT As String
Dim sh As Worksheet
Dim rng As Range
Dim rngDest As Range
If Cells(7, 2) <> "" Then
strCAT = Cells(7, 2).Value
Sheets("CAT LOOKUP").Range("$A2:$C393").AutoFilter Field:=1, _
Criteria1:=strCAT
Set sh = Sheets("CAT LOOKUP")
Set rng = sh.Range("B34:B56")
rng.ClearContents
Set rng = sh.Range(sh.Range("B1"), sh.Range("B1").End(xlDown))
rng.Copy
Set rngDest = sh.Range("B34")
rngDest.PasteSpecial
ActiveWorkbook.Names("CAT_LOOKUP").RefersToRange = _
sh.Range(sh.Range("B35"), sh.Range("B35").End(xlDown))
Else
Set sh = Sheets("CAT LOOKUP")
Set rng = sh.Range("B34:B56")
rng.ClearContents
Sheets("Ad Hoc Request").Select
End If
CAT_LOOKUP уже определена.Когда этот код выполняется, диапазон CAT_LOOKUP очищается, и определение диапазона остается неизменным.
Я обнаружил в своих заметках из старого проекта, что я использовал RefersToR1C1
вместо RefersToRange
,поэтому я изменил эту строку следующим образом:
ActiveWorkbook.Names("CAT_LOOKUP").RefersToR1C1 = _
"='CAT LOOKUP'!R35C2:R" & sh.Range("B35").End(xlDown).Row & "C2"
, и код сработал так, как нужно, сбросив именованный диапазон, чтобы соответствующая проверка данных работала правильно.реализация RefersToRange
, или есть проблема с тем, как мы его использовали?