VBA Excel事件“对象不支持此属性或方法”错误

我正在写一个VBA代码来closures工作簿之前更改button的颜色。 我的代码写在“Microsoft Excel对象” – “ThisWorkbook”下。 我有两个选项卡,一个叫做“User Interface_OneStep”,另一个叫做“User Interface_UserSupervised”。 我想在closures工作簿时更改两个工作表上的button颜色。

我现在遇到的问题是,如果我closures工作簿时停留在“User Interface_OnseStep”中,则一切正常。 但是如果我停留在“User Interface_UserSupervised”工作表中,当我尝试closures本书时,popup一个“Object不支持此属性或方法”的错误消息。 我的代码如下:

Private Sub Workbook_BeforeClose(Cancel As Boolean) ReDim ButtonNumberArray(14) As Variant ButtonNumberArray(0) = "Rectangle 95" ButtonNumberArray(1) = "Rectangle 92" ButtonNumberArray(2) = "Rectangle 98" ButtonNumberArray(3) = "Rectangle 104" ButtonNumberArray(4) = "Rectangle 105" ButtonNumberArray(5) = "Rectangle 106" ButtonNumberArray(6) = "Rectangle 103" ButtonNumberArray(7) = "Rectangle 96" ButtonNumberArray(8) = "Rectangle 114" ButtonNumberArray(9) = "Rectangle 89" ButtonNumberArray(10) = "Rectangle 120" ButtonNumberArray(11) = "Rectangle 123" ButtonNumberArray(12) = "Rectangle 128" ButtonNumberArray(13) = "Rectangle 122" ButtonNumberArray(14) = "Rectangle 137" For Each var In ButtonNumberArray WorksheetName = "User Interface_OneStep" Call ResetColorTemplate Next var ReDim ButtonNumberArray(18) As Variant ButtonNumberArray(0) = "Rectangle 84" ButtonNumberArray(1) = "Rectangle 89" ButtonNumberArray(2) = "Rectangle 2" ButtonNumberArray(3) = "Rectangle 12" ButtonNumberArray(4) = "Rectangle 88" ButtonNumberArray(5) = "Rectangle 13" ButtonNumberArray(6) = "Rectangle 14" ButtonNumberArray(7) = "Rectangle 15" ButtonNumberArray(8) = "Rectangle 40" ButtonNumberArray(9) = "Rectangle 16" ButtonNumberArray(10) = "Rectangle 81" ButtonNumberArray(11) = "Rectangle 17" ButtonNumberArray(12) = "Rectangle 57" ButtonNumberArray(13) = "Rectangle 86" ButtonNumberArray(14) = "Rectangle 62" ButtonNumberArray(15) = "Rectangle 65" ButtonNumberArray(16) = "Rectangle 67" ButtonNumberArray(17) = "Rectangle 64" ButtonNumberArray(18) = "Rectangle 74" For Each var In ButtonNumberArray WorksheetName = "User Interface_UserSupervised" Call ResetColorTemplate Next var End Sub 

颜色模板macros是这样的(写在模块下):

 Option Explicit Public ButtonNumberArray() As Variant Public WorksheetName As String Sub ResetColorTemplate() ThisWorkbook.Worksheets(WorksheetName).Shapes.Range(ButtonNumberArray()).Select Selection.ShapeRange.ShapeStyle = msoShapeStylePreset22 With Selection.ShapeRange.TextFrame2.TextRange.Font.Fill .Visible = msoTrue .ForeColor.RGB = RGB(0, 0, 0) .Transparency = 0 .Solid End With End Sub 

错误发生在这一行:

 Selection.ShapeRange.ShapeStyle = msoShapeStylePreset22 

当发生错误时,WorksheetName = User Interface_OneStep。 为什么当我切换到另一个选项卡时,Excel无法修改其他选项卡的属性?

提前致谢!

问题是,Excel无法在形状所在的工作表处于活动状态时Select一个形状。 有两种方法可以解决这个问题。 这两个都涉及修改ResetColorTemplate

方式一 – select表格

  Sub ResetColorTemplate() ThisWorkbook.Worksheets(WorksheetName).Select ThisWorkbook.Worksheets(WorksheetName).Shapes.Range(ButtonNumberArray()).Select Selection.ShapeRange.ShapeStyle = msoShapeStylePreset22 With Selection.ShapeRange.TextFrame2.TextRange.Font.Fill .Visible = msoTrue .ForeColor.RGB = RGB(0, 0, 0) .Transparency = 0 .Solid End With End Sub 

直接与对象直接作用 – 首选方法

 Sub ResetColorTemplate() Dim ws as Worksheet Set ws = ThisWorkbook.Worksheets(WorksheetName) With ws.Shapes.Range(ButtonNumberArray()).ShapeRange .ShapeStyle = msoShapeStylePreset22 With .TextFrame2.TextRange.Font.Fill .Visible = msoTrue .ForeColor.RGB = RGB(0, 0, 0) .Transparency = 0 .Solid End With End With End Sub 

斯科特·霍尔茨曼有正确的答案。

我只是想指出,你应该只调用一次ResetColorTemplate一次ButtonNumberArray

在这里,您可以For Each element in ButtonNumberArray调用一次

对于ButtonNumberArray中的每个var WorksheetName =“User Interface_UserSupervised”调用ResetColorTemplate Next var

您也可以通过传递WorksheetNameButtonNumberArray作为参数来避免全局variables

Sub ResetColorTemplate(WorksheetName作为string,ButtonNumberArray作为变体)

就我个人而言,我也会创build一个函数来构build控件数组。


 Private Sub Workbook_BeforeClose() ResetColorTemplate "User Interface_OneStep", getControlArray("Isosceles Triangle ", 95, 92, 98, 104, 105, 106, 103, 96, 114, 89, 120, 123, 128, 122, 137) ResetColorTemplate "User Interface_UserSupervised", getControlArray("Isosceles Triangle ", 84, 89, 2, 12, 88, 13, 14, 15, 40, 16, 81, 17, 57, 86, 62, 65, 67, 64, 74) End Sub Sub ResetColorTemplate(WorksheetName As String, ButtonNumberArray As Variant) With ThisWorkbook.Worksheets(WorksheetName).Shapes.Range(ButtonNumberArray).ShapeRange .ShapeStyle = msoShapeStylePreset22 With .TextFrame2.TextRange.Font.Fill .Visible = msoTrue .ForeColor.RGB = RGB(0, 0, 0) .Transparency = 0 .Solid End With End With End Sub Function getControlArray(BaseName As String, ParamArray CTRLNumbers()) Dim x As Long For x = 0 To UBound(CTRLNumbers) CTRLNumbers(x) = BaseName & CTRLNumbers(x) Next getControlArray = CTRLNumbers End Function