【问题标题】:Excel VBA - Issues with For Each Loop with an ArrayExcel VBA - 带有数组的每个循环的问题
【发布时间】:2020-02-26 01:15:59
【问题描述】:

希望我能找到一些帮助。我从 2 列(主机名、IP)中提取来自 Excel 的信息。重要性声明是

Dim HWSWArray() As Variant
Dim v As Variant.

我的 HWSWArray 已加载,例如我有 HWSWArray(0)(0) -> 主机名和 HWSWArray(0)(1) -> IP

我想遍历这些并与另一个字符串进行外部比较,所以我的循环是这样写的

For Each v In HWSWArray         
        If v(0) = POAMHost Then
           DoThings
        ElseIf v(1) = POAMHost Then
           Do Things
        End If
 Next

我在评估第一个 if 语句后立即得到类型不匹配。我很困惑,因为它们都是变体 v 和 HWSWArray 并且不应该 v 作为变体匹配它匹配的任何类型?

也许我只见树木不见森林?如有必要,我可以发布完整的代码,但需要编辑一些内容。

为了添加一些我可以轻松共享的代码的更多信息,我过去做过类似的事情,但我不知道有什么区别。如果我不能让它工作,我会考虑实施你对 For i 循环的建议,但我想看看为什么它不能以目前的能力工作。

    'Load BArray
    Do While Counter <> B1930Rows + 1

    IPCell = Assets.Range("X" & Counter)
    hostCell = Assets.Range("W" & Counter)


    If IsEmpty(Assets.Range("W" & Counter)) = True And IsEmpty(Assets.Range("X" & Counter)) = True Then
        Counter = Counter + 1

    ElseIf IsEmpty(Assets.Range("W" & Counter)) = True And IsEmpty(Assets.Range("X" & Counter)) = False Then
        BArray(i) = Array("Null", UCase(IPCell))
        i = i + 1
        Counter = Counter + 1

    ElseIf IsEmpty(Assets.Range("W" & Counter)) = False And IsEmpty(Assets.Range("X" & Counter)) = True Then
        BArray(i) = Array(UCase(hostCell), "Null")
        i = i + 1
        Counter = Counter + 1

    ElseIf IsEmpty(Assets.Range("W" & Counter)) = False And IsEmpty(Assets.Range("X" & Counter)) = False Then
        BArray(i) = Array(UCase(IPCell), UCase(hostCell))
        i = i + 1
        Counter = Counter + 1

    Else
        Counter = Counter + 1
    End If

Loop

'MsgBox ("Here")
'Setting up script to handle the POAM Analysis Portion
Counter = 2

Dim statusCell As String
'Dim hostCell As String

Do While Counter <> POAMRows + 1

    statusCell = POAM.Range("M" & Counter)
    hostCell = POAM.Range("AE" & Counter)

    If statusCell = "Ongoing" Then

        For Each v In BArray

            If v(0) = hostCell Then
                Output.Range("A" & SummaryCounter) = POAM.Range("A" & Counter)
                Output.Range("B" & SummaryCounter) = POAM.Range("C" & Counter)
                Output.Range("C" & SummaryCounter) = POAM.Range("D" & Counter)
                Output.Range("D" & SummaryCounter) = POAM.Range("E" & Counter)
                Output.Range("E" & SummaryCounter) = POAM.Range("F" & Counter)
                Output.Range("F" & SummaryCounter) = POAM.Range("G" & Counter)
                Output.Range("G" & SummaryCounter) = POAM.Range("R" & Counter)
                Output.Range("H" & SummaryCounter) = POAM.Range("V" & Counter)
                Output.Range("I" & SummaryCounter) = POAM.Range("AB" & Counter)
                Output.Range("J" & SummaryCounter) = POAM.Range("AE" & Counter)


                SummaryCounter = SummaryCounter + 1

            ElseIf v(1) = hostCell Then
                Output.Range("A" & SummaryCounter) = POAM.Range("A" & Counter)
                Output.Range("B" & SummaryCounter) = POAM.Range("C" & Counter)
                Output.Range("C" & SummaryCounter) = POAM.Range("D" & Counter)
                Output.Range("D" & SummaryCounter) = POAM.Range("E" & Counter)
                Output.Range("E" & SummaryCounter) = POAM.Range("F" & Counter)
                Output.Range("F" & SummaryCounter) = POAM.Range("G" & Counter)
                Output.Range("G" & SummaryCounter) = POAM.Range("R" & Counter)
                Output.Range("H" & SummaryCounter) = POAM.Range("V" & Counter)
                Output.Range("I" & SummaryCounter) = POAM.Range("AB" & Counter)
                Output.Range("J" & SummaryCounter) = POAM.Range("AE" & Counter)


                SummaryCounter = SummaryCounter + 1
            End If
        Next
        Counter = Counter + 1
    Else
        Counter = Counter + 1
    End If
Loop

【问题讨论】:

  • 请注意,“Dim HWSWArray() As Variant”会创建一个变体数组,而不是可以包含数组的变体。您可能只需要 'Dim HWSWArray As Variant'

标签: arrays excel vba for-loop foreach


【解决方案1】:

For Each 和多维数组很棘手。试试这个:

For i = LBound(HWSWArray, 1) To UBound(HWSWArray, 1)
    If HWSWArray(i, 0) = POAMHost Then
        'Do Things
    ElseIf HWSWArray(i, 1) = POAMHost Then
        'Do Things
    End If
Next

LBoundUBound 将给出给定维度的下限和上限,在本例中为第一个。

【讨论】:

  • 我编辑了我的原始帖子,你能再看看吗?
  • @SureThing,在阅读了您的更新后,我想说我关于多维数组和 For Each 的棘手问题的声明仍然有效。用 BArray 替换 HWSWArray 就可以了。
  • 好的,我知道你来自哪里。虽然我是个白痴。我的数组太大,类型不匹配的部分是因为它是空白的。我有 ReDim 3521 值的数组,但它只填充了 3520,所以索引 3521 是空白的。有什么方法可以更轻松地解决问题?
【解决方案2】:

假设您有相同长度的列:

Dim HWSWArray() As Variant
HWSWArray = Range(Cells(startrow, startcolumn), Cells(endrow, endcolumn)).value
Dim i As Long
For i = lbound(HWSWArray) to ubound(HWSWArray)
    If HWSWArray(v,1) = POAMHost Then
        'DoThings
    ElseIf HWSWArray(v,2) = POAMHost Then
        'Do other Things
    End If
Next i

HWSWArray 的下限(通常为 0)和上限将是特定列的行数。

【讨论】:

  • 您可能在12 上是对的,这取决于OP 如何填充HWSWArray(对不起我之前的评论)。虽然问题提到了(0)(0)(0)(1) - 这让我相信 HWSWArray 没有有效地填充。
  • @BigBen 我实际上只是在纠正这个问题,因为我最初的想法是 HWSWArray 是如何生成的,所以我回去指定 如何 在我的例子。
  • 事实上你是对的基于HWSWArray = Range(Cells(startrow, startcolumn), Cells(endrow, endcolumn)).value,所以很抱歉:) 是的。
  • 我编辑了我的原始帖子,你能再看看吗?
  • @SureThing 我查看了您的编辑,代码似乎使用了Do Until 循环,这与for 循环的提议非常相似,您的Counteri 而不是需要手动迭代它 for 循环通过 next i 迭代 i。另一个显着的区别是使用 variant array 而不是引用工作表(如在您的编辑中)。我建议您尝试提供的解决方案,如果可行,您将处于更好的位置。
【解决方案3】:

对于以后看到这个的人来说,我错误地指定了我的数组的尺寸。我已经扩展了我的数组以容纳 3521 个值,但是当它加载数组时,它只加载到 3520。

当我的代码运行时,它将一个变量与一个空数组进行比较,所以我得到了一个类型不匹配的结果。

我修复了尺寸,一切正常。

【讨论】:

    猜你喜欢
    • 2014-01-25
    • 2023-04-02
    • 2011-10-29
    • 2011-09-21
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 2013-04-09
    • 2014-03-22
    相关资源
    最近更新 更多