我创建了一个带有几个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>
不存在,则创建它并随后设置属性。
答案 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