Я не могу получить какой-либо вывод, так как он говорит «недопустимый квалификатор» для «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