错误处理完成后出现奇怪的错误行为

时间:2016-11-07 22:30:24

标签: excel vba excel-vba error-handling excel-2013

我正在使用一个sub来创建唯一的工作表名称,方法是尝试使用名称并重定向错误,直到找到有效的名称。

子工作,但在退出sub后,并尝试在oleobject复选框中测试值时,它给出了我之前重定向的错误 - 除非我执行其他调用,例如{{1} }或ws.Activate。我尝试在代码中的不同位置放置application.screenupdating = false但没有成功。

我对VBA很新(使用它不到一个月)所以请原谅我明显的错误。

我正在使用excel 2013。

首先运行此选项以在Sheet1中创建复选框,并创建一个具有指定名称的新工作表:

Err.Clear

主要代码:

Private Sub runfirst()

    Dim cb1 As OLEObject
    Dim ws As Worksheet

    Sheet1.OLEObjects.Delete
    Set cb1 = Sheet1.OLEObjects.Add(ClassType:="Forms.CheckBox.1")
    cb1.Name = "CheckBox1"
    cb1.Object.Caption = "Checkbox1"

    Set ws = ThisWorkbook.Sheets.Add
    ws.Name = "mysheet"

End Sub

2 个答案:

答案 0 :(得分:0)

我不喜欢On Error Goto Label。我发现难以理解且难以理解的代码。

下面的宏是我如何编写例如例程。

首先,有几点可能会有所帮助。

我有一个名为Resources的文件夹,包含子文件夹" VBA"," VBA Excel"和" VBA Outlook"。如果我使用VBA Word或VBA Access,我也会为它们提供子文件夹。每当我完成开发时,我会查看我的代码以查找可能再次使用的例程。如果例程是通用VBA,则将其保存为" VBA"中的文本文件。按照惯例,我将保存为" NameWS .txt"在“VBA Excel”文件夹中。

宏开始解释它的作用。如果宏很复杂,那么它也会概述它如何实现其目标。当我在六个月或十二个月或五年内观察宏观时,这对我有帮助。我有几年前写过的宏,快速浏览一下它是否对今天的问题有所帮助。

最后,宏的历史的第一行。每次我更新宏时,我都会添加一两句话来说明原因和原因。

Private Sub NameWS(rootname As String, ws As Worksheet)

  ' Attempt to rename worksheet ws as rootname. If successful, exit.
  ' If unsuccessful, rename worksheet as rootname (N) where
  ' N is the first number in the sequence 1, 2, 3 and so on such
  ' that rootname (N) did not previously exist.

  '  7Nov16  Coded.

  Dim ctr As Long
  Dim NameCrnt As String

  ' Try rootname first
  On Error Resume Next
  ws.Name = rootname
  On Error GoTo 0
  If ws.Name = rootname Then
    ' Rename successful
    Exit Sub
  End If

  ' rootnamne is use. Try rootname (1), rootname(2), etc, until
  ' get successful rename.
  ctr = 1
  Do While True
    NameCrnt = rootname & " (" & ctr & ")"
    On Error Resume Next
    ws.Name = NameCrnt
    On Error GoTo 0
    If ws.Name = NameCrnt Then
      ' Rename successful
      Exit Sub
    End If
    ctr = ctr + 1
  Loop

End Sub

答案 1 :(得分:0)

这是设置Application.DisplayAlerts

的问题

您可能想要使用此功能

Private Sub NameWS(rootname As String, ws As Worksheet)
    Dim ctr As Long
    Application.DisplayAlerts = False
    Do
        On Error Resume Next
        ws.name = rootname & IIf(ctr = 0, "", " (" & ctr & ")")
        ctr = ctr + 1
    Loop While Err > 0
    Application.DisplayAlerts = True
End Sub

此外,行:

If Sheet1.CheckBox1.Value = True Then MsgBox "true" Else MsgBox "false"

可以简化为:

MsgBox Sheet1.CheckBox1.Value