Я вижу, что этот вопрос задан и получен ответ, но я что-то упустил! Чтобы использовать именованные диапазоны в моем VBA, я должен активировать лист перед использованием именованного диапазона, в противном случае он получает доступ к «тому же» диапазону на активном листе. Я:
- убедился, что для заданного диапазона имен установлено значение Рабочая книга.
- полностью определил каждый диапазон и метод ячейки или свойство в моем коде
Вот кодОн работает нормально, если я возвращаюсь в вызов worksheet.activate, но в противном случае он ссылается на диапазон на неправильном листе (активном).
Sub UserForm_Initialize()
' Application.ScreenUpdating = False
Dim r1 As Long, c1 As Long, r2 As Long, c2 As Long, rng1 As Range, rng2 As Range, s As Worksheet, initSheet As Worksheet
Set s = Sheets("NamePlates")
Set rng1 = s.Range("MasterStoreNamePlates")
Set initSheet = Application.ActiveSheet
r1 = rng1.Row
c1 = rng1.Column
r2 = r1 + storeCount - 1
c2 = c1
's.Activate
With s
listBoxStores.RowSource = .Range(.Cells(r1, c1), .Cells(r2, c2)).Address
End With
'initSheet.Activate
' Application.ScreenUpdating = True
End Sub
Не слишком сложно переключиться на другой лист длябыстрый поиск диапазона, но давай ... какой смысл называть диапазоны и делать имя глобальным, а все сообщения о «убедитесь, что имя установлено глобально», если мне все еще нужно пойти и переключить активный лист?
Заранее спасибо!
Обновление:
Sub UserForm_Initialize()
Application.ScreenUpdating = False
Dim rng1 As Range, rng2 As Range, sInd As Long, initSheet As Worksheet, s As Worksheet
sInd = Sheets("NamePlates").index
Set s = Sheets(sInd)
Set rng1 = s.Range("NamePlates!MasterStoreNamePlates")
Set initSheet = Application.ActiveSheet
listBoxStores.RowSource = rng1.Range(s.Cells(1, 1), s.Cells(storeCount - 1, 1)).Address
Application.ScreenUpdating = True
End Sub
Не дает другого результата. Это все еще обращается к активному листу. Если я изменю активный лист перед этим, он извлекает правильные данные, в противном случае он вытягивает диапазон из активного листа.
Я заметил, что s.Range("NamePlates!MasterStoreNamePlates")
действительно дает мне правильный диапазон ... но потом, когдаЯ использую этот диапазон и делаю что-то относительно него, я теряю ссылку на лист. Поэтому я думаю, что, возможно, мое решение будет включать динамическое обновление именованного диапазона, и тогда этот метод должен работать. В настоящее время вы можете видеть, что я использую эту константу "storeCount"
, которая на самом деле не очень хороший способ сделать что-то. Это всего лишь мой хак для того, чтобы все заработало. Все другие предложенные методы терпят неудачу в моем случае по той же причине;даже если они дают хорошую ссылку на правильный диапазон, я теряю эту ссылку на лист, когда начинаю делать все, что определяет нужный диапазон, который на 12 строк длиннее указанного диапазона (таким образом, "storeCount"
постоянная).
Если я не могу понять, как сделать динамически изменяемый именованный диапазон, я опубликую новый вопрос, но я видел кое-что об этом, поэтому я смогу заставить это работать, и я опубликую свое решениездесь ... или, если кто-то победит меня, я приму этот ответ, даже если он немного отличается от ОП.