ActiveSheet与工作表

我正在使用Excel for Mac 2011,并且在一张表中有几个checkbox。 我试图用下面的代码自动化他们:

Private Sub CheckBox12_Click() Dim ws As Worksheet Set ws = ActiveSheet With ws If .Shapes("CheckBox12").OLEFormat.Object.Value = xlOn Then .Range("CK1").EntireColumn.Hidden = False Else .Range("CK1").EntireColumn.Hidden = True End If End With End Sub 

此代码给我错误:运行时错误445对象不支持此操作。

但是,如果删除ws,只是做

 Private Sub CheckBox12_Click() With ActiveSheet If .Shapes("CheckBox12").OLEFormat.Object.Value = xlOn Then .Range("CK1").EntireColumn.Hidden = False Else .Range("CK1").EntireColumn.Hidden = True End If End With End Sub 

这工作得很好。

这里的交易是什么? 我知道我可以使用ActiveSheet,但我总是喜欢先设置它= WS,因为它给出属性/方法的下拉列表,我代码。

我想你会得到一个编译器错误,而不是运行时错误。

我怀疑ActiveSheet的工作原因是因为编译器不检查它。 另一方面,ws不起作用,因为编译器试图parsing它,而且实际上有一个错误的标志。 所以编译器检查器有一个错误。 它正在标记一个实际上不应该是错误的错误。

对象不支持此操作(错误445)

编辑:也试试这个,让我知道,如果它的作品:

 Dim ws As Object Set ws = ActiveSheet With ws ... 

值得注意的是ActiveSheetWorksheet不是一回事。 ActiveSheet还可以包含ChartSheet; 但ChartSheet不能成为Worksheet。 所以, With wsWith ActiveSheet之间的区别也许并不奇怪。

你应该尝试的另一件事是将你的对象设置为一个variables:

 Dim ws As Worksheet Set ws = ActiveSheet Dim chk As Object With ws Set chk = .Shapes("CheckBox12").OLEFormat.Object If chk.Value = xlOn Then .Range("CK1").EntireColumn.Hidden = False Else .Range("CK1").EntireColumn.Hidden = True End If End With 

这可能会从等式中删除wsvariables。 当然,最好将正确的对象模糊化,而不是使用genericsas Object但我不确定它会是什么。