所以我认为这将是一个简单的逻辑问题,但对于我的生活,我找不到这个代码块的问题。我已经在Stack上查看了解决方案,但所有其他的do / while循环问题似乎主要与其他语言有关。
我想要做的只是循环一个阵列&为数组中非空的每个元素添加一个新工作表。很简单吧?然而由于某种原因,它只是循环一次就可以了。
以下是代码块:
Dim repNames() As String
Dim x As Integer
x = 25
ReDim repNames(1 To x)
repNames(1) = "Ahern"
repNames(2) = "Castronovo"
repNames(3) = "Glick"
repNames(4) = "Fields"
repNames(5) = "Murphy"
repNames(6) = "Sleeter"
repNames(7) = "Vivian"
repNames(8) = "Walschot"
repNames(9) = "Wilson"
Dim i As Integer
i = 1
Do 'Loop keeps creating only 1 new sheet. Should create 9.
Worksheets.Add.Name = repNames(i)
i = i + 2
Loop While repNames(i) <> Null
我认为问题在于这一行:Loop While repNames(i) <> Null
,
但很明显,逻辑测试似乎仍然存在。
非常感谢任何帮助!
答案 0 :(得分:2)
正如其他人所说,Null
不是您想要进行的比较。测试与<{1}}等效的任何将返回Null
- 偶数Null
返回?Null = Null
,这就是您的循环提前退出的原因。 (注意:要测试Null
,您需要使用返回布尔值的Null
函数,但 NOT 如何测试空字符串。)< / p>
在VBA中,要测试零长度字符串或空字符串,可以使用IsNull
或""
常量,或者某些人使用vbNullString
函数检查零-length。
如果任何项是一个空字符串,但是如果任何项是空字符串,那么您的逻辑测试应该中止该错误,但是纠正该错误,但是没有任何项是空字符串(至少不是您提供的示例数据)因此您最终会遇到一个无限循环,一旦Len
超过i
数组中的项目数,就会出错。
这可能更适合作为repNames
循环。
For Each
如果您需要跳过空值或重复值,可以在循环中根据需要添加该逻辑:
Dim rep as Variant
For Each rep in repNames
Worksheets.Add.Name = rep
Next
等
答案 1 :(得分:1)
首先,您应该与vbNullString
进行比较。这循环多次:
' Declare variables
Dim repNames() As String
Dim x As Integer
Dim i As Integer
' Set data
x = 25
ReDim repNames(1 To x)
repNames(1) = "Ahern"
repNames(2) = "Castronovo"
repNames(3) = "Glick"
repNames(4) = "Fields"
repNames(5) = "Murphy"
repNames(6) = "Sleeter"
repNames(7) = "Vivian"
repNames(8) = "Walschot"
repNames(9) = "Wilson"
' Loop through items
i = 1
Do
Worksheets.Add.Name = repNames(i)
i = i + 2
Loop While repNames(i) <> vbNullString
还有一个问题 - 为什么i = i + 2
?在您的问题中,您说您希望循环执行9次,但使用i = i + 2
会跳过其他所有项目。如果你确实想要遍历每个项目:
Do
Worksheets.Add.Name = repNames(i)
i = i + 1
Loop While repNames(i) <> vbNullString
答案 2 :(得分:1)
在这里,我更改了循环条件,并将i=i+2
更改为i=i+1
。一个常规的while循环比一个while更好,而第一个元素是空的
Dim repNames()
Dim x As Integer
x = 25
ReDim repNames(1 To x)
repNames(1) = "Ahern"
repNames(2) = "Castronovo"
repNames(3) = "Glick"
repNames(4) = "Fields"
repNames(5) = "Murphy"
repNames(6) = "Sleeter"
repNames(7) = "Vivian"
repNames(8) = "Walschot"
repNames(9) = "Wilson"
Dim i As Integer
i = 1
Do While repNames(i) <> ""
Worksheets.Add.Name = repNames(i)
i = i + 1
Loop