programing

Excel VBA 기능을 사용하여 배열을 워크북에 인쇄

bestprogram 2023. 7. 1. 09:04

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

다른 답변과 동일한 주제로, 단순성 유지

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

변형 배열을 만듭니다(동등한 범위를 변형 변수로 읽어 들이면 가장 쉽습니다).

그런 다음 배열을 채우고 배열을 범위에 직접 할당합니다.

Dim myArray As Variant

myArray = Range("blahblah")

Range("bingbing") = myArray

변형 배열은 2-D 행렬로 끝납니다.

더 우아한 방법은 전체 어레이를 한 번에 할당하는 것입니다.

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개의 세포 크기까지만 작동합니다.그러면 엑셀은 이상한 오류를 던집니다.최대 크기는 고정되어 있지 않고 엑셀 설치마다 많이 다릅니다.

다른 사람들이 제안한 것처럼 2차원 배열을 Range on 시트에 직접 쓸 수 있지만 배열이 1차원인 경우 다음 두 가지 옵션이 있습니다.

  1. 먼저 1D 배열을 2D 배열로 변환한 다음 시트에 인쇄합니다(범위로).
  2. 1D 배열을 문자열로 변환하여 단일 셀(문자열)로 인쇄합니다.

다음은 두 옵션을 모두 설명하는 예입니다.

Sub PrintArrayIn1Cell(myArr As Variant, cell As Range)
    cell = Join(myArr, ",")
End Sub
Sub PrintArrayAsRange(myArr As Variant, cell As Range)
    cell.Resize(UBound(myArr, 1), UBound(myArr, 2)) = myArr
End Sub
Sub TestPrintArrayIntoSheet()  '2dArrayToSheet
    Dim arr As Variant
    arr = Split("a  b  c", "  ")

    'Printing in ONE-CELL: To print all array-elements as a single string separated by comma (a,b,c):
    PrintArrayIn1Cell arr, [A1]

    'Printing in SEPARATE-CELLS: To print array-elements in separate cells:
    Dim arr2D As Variant
    arr2D = Application.WorksheetFunction.Transpose(arr) 'convert a 1D array into 2D array
    PrintArrayAsRange arr2D, Range("B1:B3")
End Sub

참고: 전치는 열별 출력을 렌더링하여 행별 출력을 다시 전치할 수 있습니다. 그럴 수 있기를 바랍니다.

HTH

내 테스트 버전

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

어레이의 크기인 범위를 정의하고 해당 값 속성을 사용할 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/6063672/excel-vba-function-to-print-an-array-to-the-workbook