2016-02-15 6 views
2

Попытка проверить столбец один для значения (столбец в многомерном массиве, который есть), и если он соответствует сортировке другого столбца для значения, соответствующего этой строке.Многомерные массивы с петлями VBA

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

Должен ли я использовать UBound и LBound в каждом цикле для того, чтобы рассказать ему, какой колумбу просмотреть?

Я не заинтересован в изучении метода наилучшей практики для использования этого в будущем, кроме всего лишь ответа/решения, которое он представляет собой текущую проблему.

Код:

Private Sub ThisStuff() 

Dim CoaAmt As Long 
Dim COAArray(3, 2) 
Dim ThisValue As String 
Dim AnotherValue As String 

AnotherValue = "Bananas" 
ThisValue = "Apples" 


COAArray(0, 0) = "Apples" 
COAArray(1, 0) = "Oranges" 
COAArray(2, 0) = "Peaches" 
COAArray(3, 0) = "Pomegranets" 
COAArray(0, 1) = 498 
COAArray(0, 1) = 505 
COAArray(1, 1) = 564 
COAArray(1, 2) = 556 
COAArray(2, 1) = 570 
COAArray(2, 2) = 573 
COAArray(3, 1) = 742 
COAArray(3, 2) = 750 


If AnotherValue = "Bananas" Then 
    For i = COAArray(0, 0) To COAArray(3, 0) 
      For j = COAArray(1, 0) To COAArray(3, 2) 
       If COAArray(i, j) = ThisValue Then CoaAmt = COAArray(i, j) 
      Next j 
    Next i 
End If 

MsgBox ("The value of CoaAmt is " & CoaAmt) 

End Sub 
+1

Я думаю, что вам нужны методы 'LBound' и' UBound', которые возвращают нижнюю/верхнюю границу массива: 'Для i = LBound (COAArray) To UBound (COAArray)' –

ответ

2

Да. Функции LBound и UBound позволяют указать ранг . Это позволяет вашему вложенному For .. Next циклов циклически перемещаться по всем элементам массива.

debug.print LBound(COAArray, 1) & ":" & UBound(COAArray, 1) 
debug.print LBound(COAArray, 2) & ":" & UBound(COAArray, 2) 
If AnotherValue = "Bananas" Then 
    For i = LBound(COAArray, 1) To UBound(COAArray, 1) 
     For j = LBound(COAArray, 2) To UBound(COAArray, 2) 
      If COAArray(i, j) = ThisValue Then CoaAmt = COAArray(i, j) 
     Next j 
    Next i 
End If 

Назначение элемента массива было немного перепутано. Это должно было быть ближе к,

COAArray(0, 0) = "Apples" 
COAArray(1, 0) = "Oranges" 
COAArray(2, 0) = "Peaches" 
COAArray(3, 0) = "Pomegranates" 
COAArray(0, 1) = 498 
COAArray(1, 1) = 505 
COAArray(2, 1) = 564 
COAArray(3, 1) = 556 
COAArray(0, 2) = 570 
COAArray(1, 2) = 573 
COAArray(2, 2) = 742 
COAArray(3, 2) = 750 

Например, с ремонтируемой присвоения массива выше, COAArray (0, 0) яблоки, COAArray (0, 1) 498 и COAArray (0, 2) 570 . Далее выплевывает 498 и 570.

Dim i As Long, j As Long 
    Dim COAArray(3, 2) As Variant, CoaAmt(0 To 1) As Variant 

    Dim ThisValue As String, AnotherValue As String 

    AnotherValue = "Bananas" 
    ThisValue = "Apples" 

    COAArray(0, 0) = "Apples" 
    COAArray(1, 0) = "Oranges" 
    COAArray(2, 0) = "Peaches" 
    COAArray(3, 0) = "Pomegranets" 
    COAArray(0, 1) = 498 
    COAArray(1, 1) = 505 
    COAArray(2, 1) = 564 
    COAArray(3, 1) = 556 
    COAArray(0, 2) = 570 
    COAArray(1, 2) = 573 
    COAArray(2, 2) = 742 
    COAArray(3, 2) = 750 

    If AnotherValue = "Bananas" Then 
     For i = LBound(COAArray, 1) To UBound(COAArray, 1) 
      If COAArray(i, 0) = ThisValue Then 
       For j = LBound(COAArray, 2) + 1 To UBound(COAArray, 2) 
        CoaAmt(j - 1) = COAArray(i, j) 
       Next j 
      End If 
     Next i 
    End If 

    MsgBox "The value of CoaAmt is " & CoaAmt(LBound(CoaAmt)) & " " & CoaAmt(UBound(CoaAmt)) 

я должен был изменить свой CoaAmt вар на один-размерном вариант массива для того, чтобы собрать цифры и выводить их.

+0

Почему нам нужно debug.print " и т. д. »на обеих линиях? –

+1

Я думал, что у вас проблемы с двузначным массивом ** ранга **. 1 и 2 - ранговые позиции. Я поставил это, чтобы продемонстрировать правильное использование ранга. Он возвращает '0: 3' и' 0: 2' в этом порядке. – Jeeped

+0

Я думаю, что у меня возникают проблемы с попыткой правильно отсортировать многомерный массив. Я закончил тем, что получил ошибку несоответствия типа, но это потому, что студия думает, что значение COAArray равно яблокам. Наверное, я неправильно думаю о многомерном массиве. Я думал об этом в табличных терминах (например, найдите значение в столбце a и найдите соответствующее значение строки из столбца). Может быть, массив не подходит для этого? –