首页 > 解决方案 > 如何从非活动工作表中引用 VBA 中的命名范围?

问题描述

我看到这个问题被问到并得到了回答,但我错过了一些东西!为了在我的 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"常数)。

如果我不知道如何进行动态更改的命名范围,我会发布一个新问题,但我已经看到了一些关于此的事情,所以我应该能够让它工作,我会在这里发布我的解决方案.. . 或者如果有人打败了我,我会接受这个答案,即使它与 OP 有点不同。

标签: excelvbanamed-ranges

解决方案


ThisWorkbook.Names("NamedRange").RefersToRange

这将返回命名范围的范围对象。


推荐阅读