2016-12-01 110 views
0

我正在写关闭工作簿之前更改按钮颜色的VBA代码。我的代码写在“Microsoft Excel对象” - “ThisWorkbook”下。我有两个选项卡,一个叫做“User Interface_OneStep”,另一个叫做“User Interface_UserSupervised”。我想在关闭工作簿时更改两个工作表上的按钮颜色。VBA Excel事件“对象不支持此属性或方法”错误

我现在遇到的问题是,如果我关闭工作簿时停留在“User Interface_OnseStep”中,则一切正常。但是如果我停留在“User Interface_UserSupervised”工作表中,当我尝试关闭本书时,弹出一条“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 

的颜色模板宏此(在模块写入):

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无法修改其他选项卡的属性?

在此先感谢!

+0

您需要可以定义'WorksheetName'全球,通过在模块级为'公共WorksheetName为String',这样所有的'Sub's的模块将识别它decalring它。或者,您可以将它传递给'Sub ResetColorTemplate()' –

+0

抱歉,我确实定义了变量。忘了粘贴在这里。感谢提醒。 – vivi11130704

回答

3

问题是Excel不能在形状打开的工作表不活动时形状Select。有两种方法可以解决这个问题。两者都涉及修改ResetColorTemplate

一号 - 选择表

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 
+0

This Works!非常感谢 !! – vivi11130704

1

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

我只想指出,你应该只打ResetColorTemplateButtonNumberArray一次。

在这里,你把它叫做一次For Each element in ButtonNumberArray

对于每个变种在ButtonNumberArray WorksheetName = “用户Interface_UserSupervised” 呼叫ResetColorTemplate下一步变种

你也避免全局变量擦肩而过的WorksheetNameButtonNumberArray作为参数

子ResetColorTemplate(WorksheetName作为字符串,ButtonNumberArray作为变型)

就个人而言,我也创建构建控制阵列的功能。


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 
相关问题