如何使用变量访问工作表 属性?

How to access a worksheet property using a variable?

情况:

在 SO 上为 写答案时,我遇到了以下问题:

问题:如何将工作表 属性 作为变量传递?

例如,我正在查看工作表保护属性并想通过变量分配它们,例如使用伪代码:

myVar =  ProtectDrawingObjects 

If Worksheets("Sheet1").myVar = True Then ......

我试过的:

1) 首先,我搜索了一组要使用的枚举,但无济于事。我在 Visual Basic 中找到了对枚举的引用,但不是我想要的那种东西。我一直在寻找类似 Activesheet.Protection(1).

的内容

2) 然后我尝试连接(我预计会失败)例如

If ws & "." & "ProtectDrawingObjects" = False Then MsgBox "False"

确实失败了

Object doesn't support this property or method

3) 我尝试声明 object/variant 变量并为这些变量赋值,导致预期的类型不匹配错误或上述 属性 不受支持的错误。

4) 我也试图找到类似的 SO 问题,例如:Get worksheet property using worksheet variable,但这似乎意味着我需要创建一个自定义 属性 而不是访问现有的 属性 的工作表。

5) 根据@TimWilliam 的有用建议,我尝试了 CallByName() 函数,例如

Dim result As Boolean
result = CallByName(ws, "ProtectDrawingObjects", VbGet) 

这对于那些以 "Protect" 开头的属性非常有效,例如"ProtectDrawingObjects" 但不适用于任何以 "Allow" 例如"AllowFormattingCells";返回:

Object doesn't support this property or method

所有属性都是 READ 并且显然有一种 Get 机制可以做到:

If ws.Protection.AllowFormattingCells = False then 

是不是根本就没有通过CallByName()暴露出来?有解决办法吗?

整体objective:

我想在数组中包含保护对象的不同可能属性,例如("AllowDeletingColumns", "AllowDeletingRows",......) 然后循环测试它们是否设置为 TrueFalse

我知道我可以使用 If 语句来确定状态,但我想知道是否有一种方法可以执行以下操作?

Worksheet.myVar 

在伪代码中,在一个循环中,这将是

If Worksheet.myArr(i) = False Then ..Do Something.....

对于评论来说太大了,但是您可以在工作表保护 "Allowxxxxxx" 属性上使用 CallByName。请注意,这些是 Worksheet.Protection 的属性,而不是 Worksheet

的直接属性
Dim ws As Worksheet
Set ws = Sheet1
Debug.Print CallByName(ws.Protection, "AllowFormattingCells", VbGet) '>> False

Dim ws As Worksheet
Dim p As Object

Set ws = Sheet1

Set p = CallByName(ws, "Protection", VbGet)
Debug.Print CallByName(p, "AllowDeletingColumns", VbGet) '>> False