Функция Excel VBA для печати массива в рабочей книге

Я написал макрос, который принимает 2-мерный массив и "печатает" его в эквивалентные ячейки в книге Excel.

Есть ли более элегантный способ сделать это?

Sub PrintArray(Data, SheetName, StartRow, StartCol)

    Dim Row As Integer
    Dim Col As Integer

    Row = StartRow

    For i = LBound(Data, 1) To UBound(Data, 1)
        Col = StartCol
        For j = LBound(Data, 2) To UBound(Data, 2)
            Sheets(SheetName).Cells(Row, Col).Value = Data(i, j)
            Col = Col + 1
        Next j
            Row = Row + 1
    Next i

End Sub


Sub Test()

    Dim MyArray(1 To 3, 1 To 3)
    MyArray(1, 1) = 24
    MyArray(1, 2) = 21
    MyArray(1, 3) = 253674
    MyArray(2, 1) = "3/11/1999"
    MyArray(2, 2) = 6.777777777
    MyArray(2, 3) = "Test"
    MyArray(3, 1) = 1345
    MyArray(3, 2) = 42456
    MyArray(3, 3) = 60

    PrintArray MyArray, "Sheet1", 1, 1

End Sub

Ответ 1

По той же теме, что и другие ответы, сохраняя ее простой

Sub PrintArray(Data As Variant, Cl As Range)
    Cl.Resize(UBound(Data, 1), UBound(Data, 2)) = Data
End Sub


Sub Test()
    Dim MyArray() As Variant

    ReDim MyArray(1 To 3, 1 To 3) ' make it flexible

    ' Fill array
    '  ...

    PrintArray MyArray, ActiveWorkbook.Worksheets("Sheet1").[A1]
End Sub

Ответ 2

Создайте вариантный массив (проще всего, прочитав эквивалентный диапазон для переменной).

Затем заполните массив и назначьте массив непосредственно в диапазон.

Dim myArray As Variant

myArray = Range("blahblah")

Range("bingbing") = myArray

Массив вариантов будет представлен как двумерная матрица.

Ответ 3

Кратчайшие пути: просто присоединяйте и покажите элементы, то есть используйте функцию Join() для объединения элементов массива в виде строки, (без необходимости использовать Loop или Worksheet-Range), например:

MsgBox Join(arrayName, ",")

'Above will display array elements as a single string separated by comma (a,b,c).

Ответ 4

Более элегантным способом является назначение всего массива сразу:

Sub PrintArray(Data, SheetName, StartRow, StartCol)

    Dim Rng As Range

    With Sheets(SheetName)
        Set Rng = .Range(.Cells(StartRow, StartCol), _
            .Cells(UBound(Data, 1) - LBound(Data, 1) + StartRow, _
            UBound(Data, 2) - LBound(Data, 2) + StartCol))
    End With
    Rng.Value2 = Data

End Sub

Но будьте осторожны: он работает только до размера около 8 000 ячеек. Затем Excel выдает странную ошибку. Максимальный размер не фиксирован и сильно отличается от установки Excel до установки Excel.

Ответ 5

Вы можете определить диапазон, размер вашего массива и использовать его свойство value:

Sub PrintArray(Data, SheetName As String, intStartRow As Integer, intStartCol As Integer)

    Dim oWorksheet As Worksheet
    Dim rngCopyTo As Range
    Set oWorksheet = ActiveWorkbook.Worksheets(SheetName)

    ' size of array
    Dim intEndRow As Integer
    Dim intEndCol As Integer
    intEndRow = UBound(Data, 1)
    intEndCol = UBound(Data, 2)

    Set rngCopyTo = oWorksheet.Range(oWorksheet.Cells(intStartRow, intStartCol), oWorksheet.Cells(intEndRow, intEndCol))
    rngCopyTo.Value = Data

End Sub

Ответ 6

Моя тестируемая версия

Sub PrintArray(RowPrint, ColPrint, ArrayName, WorkSheetName)

Sheets(WorkSheetName).Range(Cells(RowPrint, ColPrint), _
Cells(RowPrint + UBound(ArrayName, 2) - 1, _
ColPrint + UBound(ArrayName, 1) - 1)) = _
WorksheetFunction.Transpose(ArrayName)

End Sub