Цикл по рядам, Cloumns и пересечению VBA - PullRequest
1 голос
/ 29 июня 2019

Итак, я хочу пройтись по электронной таблице и собрать заголовок, заголовок строки и значение в ячейке, где эти два пересекаются. Затем создайте массив из этих значений.

Это пример

   V1 V2 V3 V4 
C1  1     1  2
C2     3     
C3  2        4
C4  1     1

И конечный вывод массива будет выглядеть примерно так:

V1, C1, 1
V2, C1, 0
V3, C1, 1
V4, C1, 4
V1, C2, 0
V2, C2, 3
etc

Затем я отсортирую этот массив и исключу все записи, имеющие значение "0".

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

Полагаю, я бы не хотел, чтобы кто-то решал ее полностью, потому что она побеждает цель обучения

Моим первоначальным решением было создание массива или заголовка, массива заголовка строки и массива данных.

В основном массив значений V, еще одно из значений C и одно из целочисленных значений.

Я написал код ниже (снова, пожалуйста, прости мое невежество).

Насколько я знаю, он должен проходить через первое значение захвата диапазона V1 (или C2 в моем коде), цикл через второе значение захвата диапазона C1 (или A2 в моем коде), а затем значение 1 (я буду назовите это Z1). Затем увеличьте целое число, чтобы получить V2, затем C1, затем Z2 и т. Д.

Dim myarrayX() As Variant
Dim myarrayY() As Variant
Dim myarrayZ() As Variant
Dim myarrayHeader() As Variant
Dim myarrayRowHeader() As Variant
Dim myarrayIntersection() As Variant
Dim Result() As Variant
Dim i As Variant
Dim j As Variant
Dim k As Variant
Dim l As Variant
Dim m As Variant
Dim n As Variant


l = 0
m = 0
n = 0



myarrayHeader = Range("C2:H2").Value
myarrayRowHeader = Range("A2:A6").Value
myarrayIntersection = Range("C2:H6").Value



For Each i In myarrrayHeader.Cells
    myarrayX(l) = Cell.Value
        For Each j In myarrayRowHeader.Cells
            myarrayY(m) = Cell.Value
                For Each k In myarrayIntersection.Cells
                    myarrayZ(n) = Cell.Value

                    k = k + 1
                    i = i + 1
                    n = n + 1
                 Next k
             m = m + 1
       Next j
       l = l + 1
       j = j + 1
Next i

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

1 Ответ

1 голос
/ 29 июня 2019

Я не могу получить какой-либо вывод, так как он говорит «недопустимый квалификатор» для «myarrayRowHeader.Cells», и я не могу понять, почему это так.

У вас две проблемы здесь.Первый и очевидный опечатка.Всегда используйте Option Explicit в верхней части модулей. Всегда .

Вы объявили следующие варианты как варианты с намерением заполнить их значениями, сделав их массивами значений:

Dim myarrayHeader() As Variant '<-- Actually, this is an array of Variants, also not what you want!
Dim myarrayRowHeader() As Variant
Dim myarrayIntersection() As Variant

Действительно - вы действительно заполняете эти массивы значениями в начале вашего кода.

myarrayHeader = Range("C2:H2").Value ' One row, multiple columns
myarrayRowHeader = Range("A2:A6").Value ' Multiple rows, one column
myarrayIntersection = Range("C2:H6").Value ' Multiple rows, multiple columns

На данный момент они являются массивами, а не объектами, поэтому не имеют внутренних методов или свойств.Другими словами, для myarrayRowHeader нет метода или свойства .Cells, поэтому компилятор VBA жалуется.

Правильный синтаксис вашего кода - простой цикл по массивам:

For i = LBound(myarrrayHeader, 2) to UBound(myarrrayHeader, 2) ' <--- typo here 
    myarrayX(l) = myarrayHeader(I,1)
        For j = LBound(myarrayRowHeader, 1) to UBound(myarrayRowHeader, 1)
            myarrayY(m) = myarrayRowHeader(j,1)
'etc.

Обратите внимание, что при преобразовании диапазона Excel в массив он всегда представляет собой двумерный массив, даже если выбран только один столбец.

Но поскольку вы работаете с несколькими столбцами и массивами, ваш простойпетли не будут работать.Вы должны понимать относительные отношения в пространстве, как показано ниже.

Dim myarrayHeader As Variant 
Dim myarrayRowHeader As Variant
Dim myarrayIntersection As Variant
dim myarray(,) as Variant
myarrayHeader = Range("C2:H2").Value ' One row, multiple columns
myarrayRowHeader = Range("A2:A6").Value ' Multiple rows, one column
myarrayIntersection = Range("C2:H6").Value ' Multiple rows, multiple columns

Dim rowNum as Long
rowNum = 1

ReDim myarray(UBound(myarrayRowHeader,1) * UBound(myarrayHeader, 2),3) ' <--- double check this for right numbers

For i = LBound(myarrayHeader, 2) to UBound(myarrayHeader, 2) 
    For j = LBound(myarrayRowHeader, 1) to UBound(myarrayRowHeader, 1)
        myarray(rowNum, 1) = myarrayHeader(1,i)
        myarray(rowNum, 2) = myarrayRowHeader(j,1)
        myarray(rowNum, 3) = myarrayIntersection(I,j)
        rowNum = rowNum+1
    Next j
Next I

Редактировать:

Мой оригинальный код только что рассматривал изменение размера окончательного массива на основе одного измерения, но конечный массивконечно, исходя из обоих измерений.Это привело к ошибке «вне границ» в исходном коде, когда OP пытался обойти все данные.

Другой вариант, чтобы держать вещи в режиме UBound (x, 1), это использовать .Transpose:

myarrayHeader = Range("C2:H2").Transpose.Value ' Now multiple rows, one column
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...