arrays - 循环遍历数组以在 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
解决方案
这里有几个问题。您设置的第一个:
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
已更改为变体。
推荐阅读
- c# - 如何使用 c# 发送没有 ATT00001.bin 文件的嵌入式图像电子邮件
- arrays - MVC 自定义验证字符串数组客户端
- hashmap - 如何遍历包含 Arraylist 的 HashMap
- r - 基于列和 rbind 匹配合并数据帧
- c# - 如何将字符串(带有 scape 字符的 json)转换为动态对象?
- liferay - 如何在 liferay 的自定义主题中插入很棒的字体?
- c++ - 模板函数中的 C++ 初始化 - 新的 Initializer 表达式列表被视为复合表达式
- gitlab-ci - gitlab CI docker 在 2 分钟后停止
- javascript - 如何在 react-native 中初始化库
- powershell - 在powershell中的循环内运行程序