将变量设置为工作表的代号,在代码中使用它是不行的

时间:2018-06-12 00:38:53

标签: excel vba

这是有效的,直接引用代号(Sheet3)......

Sheet3.Shapes(PopUp).Visible = True

...但是使用设置为相同Codename值的变量并不是......

WS = ActiveSheet.CodeName
WS.Shapes(PopUp).Visible = True

为什么呢?我问,因为我需要将更大的宏功能扩展到整个工作簿,所以我希望变量能够适用于用户碰巧使用的任何工作表。

感谢任何指导!

2 个答案:

答案 0 :(得分:2)

如果将变量ws变暗为字符串,则它将不能用作工作表对象。

例如,如果您已将工作表的(名称)属性更改为“MyCodename”,则可以将该代号用作工作表对象

MyCodename.Shapes(PopUp).Visible = True

..假设变量popup属于正确类型并使用适当的值初始化。

答案 1 :(得分:1)

如果你的目标是pass a worksheet并且解决了这个问题,那么传递工作表

Sub DoSomething(ByVal ws As Worksheet, ByVal popup As String)
    ws.Shapes(popup).Visible = True
End sub

然后您可以使用代码名称来获取要传递该过程的特定工作表对象:

DoSomething Sheet1, "shape1"
DoSomething Sheet2, "shape12"
DoSomething Sheet3, "SomeButton"
  

我只想要一张工作表的宏来传递其代号的变量

如上所述,代码名称​​是 Worksheet变量。 VBA使用Worksheet.CodeName属性的字符串值以该名称生成项目范围的对象变量 - 实际上,使用这些" free"每当您需要引用编译时存在的任何工作表时,变量比通过SheetsWorksheets集合使用工作表{Name取消引用完全相同的对象引用要好一千倍{ {1}},您的用户可以在任何给定时间随意更改(除非工作簿结构受到保护),并破坏您的代码!

另一方面......

  

[...]适用于用户碰巧在

上的任何工作表

这是ActiveSheet的教科书定义 - 如果您需要处理用户碰巧使用的任何工作表,那么您使用ActiveSheet,这正是指的。