ErrorHandler不起作用->编译错误/找不到对象

时间:2019-02-13 13:36:00

标签: excel vba

我创建了一个带有几个activeX元素的excelfile。到目前为止,该文件已按预期工作,现在我正在解决在日常业务过程中可能发生的“用户错误”。 对于以后的使用来说,activeX元素(Toggle,Command和SpinButtons)非常重要,因此我创建了一些子来还原每个元素。他们正在按预期工作。

问题:现在,如果有人删除按钮怎么办?我尝试使用If-Statements(如果> element <则什么也没有...),但是没有用。下一种方法是“出错时转到”。 因此,我建立了一个ErrorHandler,并作为常规代码按预期工作。处理程序使用所需名称创建一个SpinButton。如果我在我的代码中犯了一个错误(a = 1/0),则处理程序正在执行其工作,但这只是“体外”。

在体内,如果我所需的> element <不存在,我的代码将以错误结尾(未找到编译error_方法或对象),但是我的处理程序不执行任何操作,尽管这是其唯一目的。

我的代码:

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

选项显式打开,并且子菜单不包含任何变量。只要有一个对象(SpinButton_Nr),它就可以工作。没有对象,我会遇到编译错误。

“ Resume Subroutine”(恢复子例程)现在处于静音状态,以避免无休止的循环(我通过先使“ exit sub”(沉默子)静音,然后按F5 ...来吸取教训,常规功能是再次触发相同的sub以便放置新对象放在正确的位置。 出于(“体外”)测试的原因,新对象称为_Nr2,后来称为_Nr。

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

语法应为“如果> element <存在,则设置属性,如果<element>不存在,则创建它并随后设置属性。

2 个答案:

答案 0 :(得分:1)

编译错误是指在编译期间发生的错误。 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

答案 1 :(得分:0)

我建议以下内容:

因此,在开始格式化之前,如果不创建旋转按钮,则实际上要测试它是否存在。您的过程中没有奇数错误处理和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