首页 > 解决方案 > 循环遍历数组以在 Vba 中创建工作表

问题描述

我需要一些帮助。我正在尝试通过遍历数组来检查和创建工作簿中的新工作表。我如何将 Arr() 分配为对象?请指教。

  Sub update()
    Dim myworksheet As Worksheet
    
    Dim Arr() As Variant

Arr() = Array ("Square", "Circle", "Rectangle", "Hexagon")
icount = WorksheetFunction.CountA(Arr())
Z = 0
For k = Z To icount
**Set myworksheet = Worksheets(Arr(Z)) '<---- THIS throws me out of subscript error** 
If Not sheetexists("myworksheet") Then
Worksheets.Add.Name = "myworksheet"
End If
Z = Z + 1
Next k
End Sub

Function sheetexists(shtname As String, Optional wb As Workbook) As Boolean
Dim sht As Worksheet
If wb Is Nothing Then Set wb = ThisWorkbook
On Error Resume Next
Set sht = wb.Sheets(shtname)
On Error GoTo 0
sheetexists = Not sht Is Nothing
End Function
End Function

标签: arraysexcelvbafunctionsearch

解决方案


这里有几个问题。您设置的第一个:
icount = WorksheetFunction.CountA(Arr())
在本例中为 4。
但它们的数组从 0 开始,所以当For k = Z To icount您说“从 0 到 4”时
Worksheets(Arr(4))不存在,因为数组中有 0-3 项。

接下来If Not sheetexists("myworksheet") Then查找名为“myworksheet”的工作表,而不是myworksheet我们刚刚分配的变量。
你可能想要If Not sheetexists(myworksheet.Name) Then
我猜同样的问题是Worksheets.Add.Name = "myworksheet"

那么实际上不需要两个计数器,k 和 z,因为 k 将从 0 开始next k并将其设置为 + 1。

Set myworksheet = Worksheets(Arr(Z))然而在这里并没有真正起作用。首先将工作表设置为变量,然后检查它是否存在。但如果它不存在,则无法设置。

因此,如果我们改用字符串,它应该会更好:

Sub update()
Dim myworksheet As String
Dim Arr() As Variant
Dim k As Long

Arr() = Array("Square", "Circle", "Rectangle", "Hexagon")
For k = LBound(Arr) To UBound(Arr)
    myworksheet = Arr(k)
    If Not sheetexists(myworksheet) Then
        Worksheets.Add.Name = myworksheet
    End If
Next k
End Sub

这是一个 for each 循环的示例作为奖励:

Sub update()
Dim k As Variant
For Each k In Array("Square", "Circle", "Rectangle", "Hexagon")
    If Not sheetexists(k) Then
        Worksheets.Add.Name = k
    End If
Next k
End Sub

Function sheetexists(shtname As Variant, Optional wb As Workbook) As Boolean
Dim sht As Worksheet
If wb Is Nothing Then Set wb = ThisWorkbook
On Error Resume Next
Set sht = wb.Sheets(shtname)
On Error GoTo 0
sheetexists = Not sht Is Nothing
End Function

请注意,此处的shtname变量sheetexists已更改为变体。


推荐阅读