Excel VBA - проблемы для каждого цикла с массивом - PullRequest
0 голосов
/ 30 октября 2019

Надеюсь, я могу найти помощь с этим. Я вытягиваю информацию из Excel из 2 столбцов (имя хоста, IP). Важные декларации:

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

Ответы [ 3 ]

0 голосов
/ 30 октября 2019

Предполагая, что у вас есть столбцы равной длины:

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

нижняя граница (обычно 0) и верхняя граница HWSWArray будут счетчиками строк для конкретного столбца.

0 голосов
/ 30 октября 2019

Для тех, кто смотрит на это в будущем, я неправильно указал размеры моего массива. Я расширил свой массив для хранения значений 3521, но когда он загружал массив, он загружался только до 3520.

Когда мой код работал, он сравнивал переменную с пустым массивом, поэтому я получал типнесоответствие.

Я исправил размеры и все работало нормально.

0 голосов
/ 30 октября 2019

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

LBound и UBound даст нижнюю и верхнюю границу для данного измерения, в данном случае первое.

...