【发布时间】: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