【问题标题】:ErrorHandler not working -> compiling error / object not foundErrorHandler 不工作 -> 编译错误/找不到对象
【发布时间】:2019-02-13 13:36:00
【问题描述】:

我创建了一个带有几个 activeX 元素的 excel 文件。到目前为止,该文件正在按预期工作,现在我正在解决日常业务中可能发生的“用户错误”。 以后使用 activeX 元素(Toggle-、Command- 和 SpinButtons)非常重要,所以我创建了一些子元素来恢复每个元素。他们正在按预期工作。

问题:现在如果有人删除了按钮怎么办?我尝试使用 If-Statements(如果 >element

在 vivo 中,如果我想要的 >element

我的代码:

Sub Cal_SpinButton_Nr()
Subroutine: 
    On Error GoTo CreateObject:
With Tabelle5.SpinButton_Nr
    .Left = 198
    .Height = 65.25
    .Top = 1.5
    .Width = 54.75
    .Orientation = fmOrientationVertical
    .BackColor = &H8000000F
    .ForeColor = &H80000012
End With

Exit Sub
CreateObject:
Tabelle5.OLEObjects.Add("Forms.SpinButton.1").Name = "SpinButton_Nr2"
'Resume Subroutine
End Sub

Option Explicit 已打开,并且 sub 不包含任何变量。只要有一个对象(SpinButton_Nr)它就可以工作。没有对象我得到一个编译错误。

“Resume Subroutine”现在被静音以避免无限循环(我通过首先静音“exit sub”并按 F5 来吸取教训...),常规功能是再次触发相同的子程序以放置新对象在正确的位置。 出于(“体外”)测试的原因,新对象被称为 _Nr2,后来它只是 _Nr。

现在的问题是:为什么“on error”语句没有涵盖编译错误?如何修改代码才能正常工作?

语法应该是“如果 >element<element> 不存在则创建它并在之后设置属性。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    我建议如下:

    因此,您实际上是在开始格式化之前测试是否存在旋转按钮,如果不创建它。在您的过程中没有奇怪的错误处理和 goto 跳转。

    Option Explicit
    
    Sub Cal_SpinButton_Nr()
        Dim ws As Worksheet
        Set ws = ThisWorkbook.Worksheets("Tabelle5") '<-- tab name
        'OR
        'Set ws = Tabelle5 '<-- VBA code name
    
        Dim SpinBtn As Object
        On Error Resume Next 'next line errors if no spinbutton exists
        Set SpinBtn = ws.OLEObjects("SpinButton_Nr")
        On Error Goto 0 'always re-activate error reporting!
    
        'if no spinbutton is found create it before formatting starts
        If SpinBtn Is Nothing Then
            Set SpinBtn = ws.OLEObjects.Add("Forms.SpinButton.1")
            SpinBtn.Name = "SpinButton_Nr"
        End If
    
        'format spin button
        With SpinBtn
            .Left = 198
            .Height = 65.25
            .Top = 1.5
            .Width = 54.75
    
            'not that for these .Object is necessary because of using .OLEObjects("SpinButton_Nr")
            .Object.Orientation = fmOrientationVertical
            .Object.BackColor = &H8000000F
            .Object.ForeColor = &H80000012
        End With
    End Sub
    

    【讨论】:

      【解决方案2】:

      编译错误是编译时发生的错误。 OnError 声明不能涵盖它们。 OnError 涵盖的错误是运行时错误,在编译后和运行时出现。

      “只要有一个对象(SpinButton_Nr)它就可以工作。没有对象我会得到一个编译错误。” - 如果你想得到运行时错误而不是编译错误,对象的绑定应该在运行时完成。

      想象以下场景,Tabelle5 作为 Excel 中的工作表变量:

      Sub CompileTimeError()
          With Tabelle5
              Debug.Print .Cells(1, 1)
          End With
      End Sub
      

      这不会编译,因为 VBE 找不到 Tabelle5 对象。但是,如果您想要运行时错误,这是一个可能的解决方案:

      Sub RunTimeError()
      
          Dim nameOfWorksheet As String
          nameOfWorksheet = "Tabelle5"
          With Worksheets(nameOfWorksheet)
              Debug.Print .Cells(1, 1)
          End With
      
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多