【问题标题】:VBA Excel Event "Object doesn't support this property or method" errorVBA Excel 事件“对象不支持此属性或方法”错误
【发布时间】:2016-12-01 23:55:44
【问题描述】:

我正在编写 VBA 代码以在关闭工作簿之前更改按钮颜色。我的代码是在“Microsoft Excel 对象”-“ThisWorkbook”下编写的。我有两个选项卡,一个称为“User Interface_OneStep”,另一个称为“User Interface_UserSupervised”。我想在关闭工作簿时更改两个工作表上的按钮颜色。

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

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

颜色模板宏是这样的(写在modules下):

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

提前致谢!

【问题讨论】:

  • 您需要将WorksheetName 定义为全局,通过在模块级别将其标记为Public WorksheetName as String,这样模块中的所有Subs 都会识别它。或者,您可以将其传递给Sub ResetColorTemplate()
  • 对不起,我确实定义了变量。这里忘记贴了。谢谢提醒。

标签: vba excel


【解决方案1】:

问题是当形状所在的工作表处于非活动状态时,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

【讨论】:

    【解决方案2】:

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

    我只是想指出,每个ButtonNumberArray 只能调用一次ResetColorTemplate

    这里叫一次For Each element in ButtonNumberArray

    对于 ButtonNumberArray 中的每个 var WorksheetName = "用户界面_UserSupervised" 调用 ResetColorTemplate Next var

    您还可以通过传递 WorksheetNameButtonNumberArray 作为参数来避免 全局变量

    Sub ResetColorTemplate(WorksheetName As String, ButtonNumberArray As Variant)

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


    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多