如何使用变量访问工作表 属性?
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",......) 然后循环测试它们是否设置为 True
或 False
。
我知道我可以使用 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
情况:
在 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",......) 然后循环测试它们是否设置为 True
或 False
。
我知道我可以使用 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