【问题标题】:How to reference named range in VBA from an inactive sheet?如何从非活动工作表中引用 VBA 中的命名范围?
【发布时间】:2019-10-08 13:27:27
【问题描述】:

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

【问题讨论】:

  • 您能具体说明问题吗?期望输出和实际输出有何不同?
  • 您只需在范围名称前加上工作表名称即可。 Range("'NamePlates'!MasterStoreNamePlates") 将从工作表“NamePlates”中获取命名范围“MasterStoreNamePlates”。
  • @SNicolaou 为什么不呢?我的解决方案可以直接放在列表框的rowsource中,就像这样:listBoxStores.RowSource = "'NamePlates'!MasterStoreNamePlates"。你的解决方案有效,我的解决方案有效,让我们快乐。
  • 我不确定它是否可以正常工作,RowSource 并不意味着具有该地址。如果您可以在发布的代码中看到,在 RowSource 分配上方有四行定义目标范围
  • 问题中描述的问题与命名范围无关。这就是代码现在的工作方式:获取一个范围(不管它是否命名为范围),调整它的大小并将其 local 地址分配给列表框。 Address属性有一个可选参数External(默认为False),将其改为True。

标签: excel vba named-ranges


【解决方案1】:
ThisWorkbook.Names("NamedRange").RefersToRange

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

【讨论】:

  • 您能否进一步解释一下您的答案如何解决发布的问题?
  • @SNicolaou 如何从非活动工作表中引用 VBA 中的命名范围? 我认为我的回答是不言自明的。从字面上看,这是指一个命名范围的方式。
【解决方案2】:

我正在添加另一个答案,因为原始问题已被显着修改。在我看来,如果你理解的话,你把一个相当简单的事情复杂化了。

在我进一步解释之前,我认为您使用范围的“.address”属性设置“.RowSource”的方法是不正确的,因为地址属性不包含对父工作表的引用,因此它将始终引用即使您从全局 wb 范围中获得了该地址,活动表也是如此。见下文:

我希望以下内容对您实现您想要的有所帮助。没有范围!没有激活!把事情简单化。我已经使用 vba 12 年了,我可以用一只手计算我使用 .activate 和 .select 的次数

我已经用 3 个列表框 (i) 静态硬编码范围 (ii) 命名范围和 (iii) 动态命名范围来初始化我的表单。

Private Sub UserForm_Initialize()

  Dim addr1 As String
  Dim addr2 As String
  Dim addr3 As String

  addr1 = "LB!$A$1:$A$4"
  addr2 = "List.Items" ' named range defined as "=LB!$A$1:$A$3"
  addr3 = "List.Items.Dyn" ' dynamic named range defined as "=OFFSET(LB!$A$1,0,0,COUNTA(LB!$A:$A),1)"

  Me.testListBox1.RowSource = addr1
  Me.testListBox2.RowSource = addr2
  Me.testListBox3.RowSource = addr3

  Debug.Print Me.testListBox1.RowSource
  Debug.Print Me.testListBox2.RowSource
  Debug.Print Me.testListBox3.RowSource

End Sub

这是立即窗口中的 Debug.Print 结果

在我的用户表单中,我从相同的单元格填充了三个列表框,但在 .RowSource 属性中引用不同。无论哪个是活动工作表,它也可以工作。

这里我正在从另一个工作表初始化相同的表单

【讨论】:

  • 你在这方面投入了一些时间,我真的很感激!我今晚会处理这个
  • 您的示例和我的代码之间的区别似乎是我使用命名范围只是为了引用我想要引用的实际范围中的第一个单元格。所以就像@BrakNicku 在上面的评论中提到的那样,当我通过.address 进行引用时,它是一个本地地址,除非我将External 属性更改为True
【解决方案3】:

你为什么要在可能的情况下激活工作表:

listBoxStores.RowSource = s.Range(s.Cells(r1, c1), s.Cells(r2, c2)).Address

代替:

With s
  listBoxStores.RowSource = .Range(.Cells(r1, c1), .Cells(r2, c2)).Address
End With

【讨论】:

  • 您建议的方法与我的方法完全相同,虽然您的方法看起来更干净... ) 我在网上找到的解决方案。
猜你喜欢
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 2019-11-25
  • 2020-12-21
  • 1970-01-01
相关资源
最近更新 更多