Печать 1D 2D-массива на листе - PullRequest
0 голосов
/ 11 июля 2020

У меня возникают проблемы с печатью простого массива в диапазоне Range ("H" & i & ": H" & (i + size). Вот соответствующий фрагмент кода:

'print on the sheet
size = 1 + UBound(arrPartList)
Rows((i + 1) & ":" & (i + size)).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        
For Each item In arrPartList
Debug.Print item
Next item
        
ThisWorkbook.Worksheets("NewRelease").Range("H" & i & ":H" & (i + size)) = arrPartList '<--desired line
ThisWorkbook.Worksheets("NewRelease").Range("H" & i & ":l" & (i + size)) = arrPartList '<--For testing only

Итак с debug.print я получаю идеальные 5 значений, которые я ожидаю:
3124105-01
3124101-01
3124104-01
3124103-01
3124102-01

Но я получаю то же самое число, первое, которое печатается во всех 5 ячейках диапазона H.
Итак, я попытался расширить диапазон от H до M, чтобы увидеть, что будет печататься, и действительно, мои значения расположены горизонтально Выглядит так:
введите описание изображения здесь

Как это исправить? Теперь стоит найти проблему с массивом, я имею в виду просто выполнение печати по-другому в этом фрагменте кода. Мне нужны ровно 5 значений из окна debug.print в моем выбранном диапазоне H.

Заранее большое спасибо!

1 Ответ

0 голосов
/ 11 июля 2020

Вот пример того, как передавать значения из листа в массив и из массива в лист.

Sub TestAndTry()

    Dim Rng         As Range
    Dim arrPartList As Variant
    Dim R           As Long                 ' row

    With ThisWorkbook.Worksheets("NewRelease")
        Set Rng = .Range(.Cells(1, "H"), .Cells(5, "H"))    ' "H" = columns(8)
        arrPartList = Rng.Value
        
        R = .Cells(.Rows.Count, "H").End(xlUp).Row + 1      ' next free row
        Set Rng = .Range(Rows(R), Rows(R + UBound(arrPartList) - 1))
        Rng.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    
'        For R = 1 To UBound(arrPartList)
'            Debug.Print arrPartList(R, 1)
'        Next R
    
        Set Rng = .Cells(R, "H").Resize(UBound(arrPartList), UBound(arrPartList, 2))
        Rng.Value = arrPartList
    End With
End Sub

Ключ к пониманию этого кода заключается в понимании того, что при копировании диапазона в массив 2D-массив создается, даже если в диапазоне есть только одна строка или столбец. В первом измерении массива есть строки, а во втором - столбцы. Обратите внимание, что Ubound (Arr) равно Ubound (Arr, 1), но для Ubound (Arr, 2) нельзя пропустить 2. Обе границы начинаются с 1.

Когда вы вставляете массив на лист, размер диапазона приема должен точно соответствовать массиву в строках и столбцах. Этого легко добиться, потому что Ubound дает количество строк, а Ubound, 2 - количество столбцов. Итак, вы указываете начальную ячейку и используете метод Resize для расширения диапазона до размера массива. Продемонстрировано в приведенном выше коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...