【问题标题】:Excel VBA / Sheets.Add.Name Loop throws Error 9Excel VBA / Sheets.Add.Name 循环抛出错误 9
【发布时间】:2016-07-19 16:56:33
【问题描述】:

我是 Excel VBA 的新手,并开始构建用于学习的时间跟踪工作簿。 其中一部分是一个 For-Loop,它将为一年中的每个月添加一个命名工作表:

Sub newyear()

Dim month(12) As String
Dim i As Integer

month(1) = "Januar"
month(2) = "Februar"
...
month(12) = "Dezember"

For i = 1 To 12
On Error Resume Next
Sheets.Add(Tabelle1).Name = month(i)
MsgBox Err.Number    <- this throws Error 9: "Subscript Out Of Range" after
                        every worksheet added during the loop
Next i

End Sub

在运行时,当循环在工作表之后添加工作表时,MsgBox 会在每个添加的工作表之后弹出,错误 9:“下标超出范围”。

我不知道为什么会发生这种情况,开始在网上阅读了很多内容但仍然没有解决方案。也许我缺少一些基本的东西,因为我是初学者。

请帮帮我。

提前致谢!

【问题讨论】:

  • 如果我的代码适合你,请标记为解决方案

标签: vba excel


【解决方案1】:

请看下面的代码。

Sub newyear()
On Error Resume Next
Dim month(12) As String
Dim i As Integer
month(1) = "January"
month(2) = "February"
month(3) = "March"
month(4) = "April"
month(5) = "May"
month(6) = "June"
month(7) = "July"
month(8) = "August"
month(9) = "September"
month(10) = "October"
month(11) = "November"
month(12) = "Dezember"
Dim ws As Worksheet
For i = 1 To 12
    With ThisWorkbook
        If Worksheets(month(i)).Name <> month(i) Then
            Set ws = .Sheets.Add(After:=.Sheets(.Sheets.Count))
            ws.Name = month(i)
        End If
    End With
    If Err.Description <> "" Then
        Err.Clear
        'do what you want to do 
    End If
Next i
End Sub

【讨论】:

  • 感谢您的建议!可悲的是,在“Next i”之前将“MsgBox = Err.Number”添加到您的代码之后,每次添加工作表后仍然会弹出错误 9 :(.
  • @Fr4gFr0g,我可以知道你为什么在 Next i 之前添加 Err.Number
  • @Fr4gFr0g,编辑了上面的答案。如果正确,请标记为解决方案。
  • 好的,所以最初我希望循环正常运行,即使已经存在几个月的工作表。在这种情况下,循环会为每个现有的表格添加一个未命名的表格If Err.Description <> "" Then activesheet.delete(伪代码)的错误来检测这一点。问题是命名的工作表也会被删除,因为对于添加的每个工作表(即使它不存在)都会弹出错误 9.. 遗憾的是,使用您的解决方案,这个错误 9 仍然会发生。
  • 嗯.. 这只是清除错误。它仍然不能从一开始就阻止它发生。
【解决方案2】:

我不确定您为什么要避免出错。您可能可以为此编写冗长的代码,但没有用。你也可以尝试一些更短的:

Sub newyear()

   Dim month(12) As String
   Dim i As Integer

   month(1) = "January"
   month(2) = "February"
   month(3) = "March"
   month(4) = "April"
   month(5) = "May"
   month(6) = "June"
   month(7) = "July"
   month(8) = "August"
   month(9) = "September"
   month(10) = "October"
   month(11) = "November"
   month(12) = "Dezember"

   On Error Resume Next
   For i = 1 To 12
       If Worksheets(month(i)) Is Nothing Then
           Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = month(i)
       End If
   Next

End Sub

【讨论】:

  • 是的..这也是我得出的结论:为什么要尝试避免错误?!但是,你知道的,我认为当我的代码抛出错误时,显然我编码错误,不是吗?我认为目标是编写干净的代码,而我天真地认为干净的代码不应该产生错误。无论如何感谢您的输入:)。
  • 有时错误不是问题,而是功能 :) 在 VBA 中,与在 Excel 中一样,您可以使用错误来为您带来好处。在很多情况下,这是一个很好的捷径。
猜你喜欢
  • 1970-01-01
  • 2012-12-17
  • 2018-04-20
  • 2013-12-18
  • 2014-06-06
  • 2012-03-13
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多