Do-While循环(VBA)不循环

时间:2017-07-19 15:45:12

标签: excel vba excel-vba

所以我认为这将是一个简单的逻辑问题,但对于我的生活,我找不到这个代码块的问题。我已经在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, 但很明显,逻辑测试似乎仍然存在。

非常感谢任何帮助!

3 个答案:

答案 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