web-dev-qa-db-fra.com

Fonction Excel VBA pour imprimer un tableau dans le classeur

J'ai écrit une macro qui prend un tableau en 2 dimensions et "l'imprime" dans des cellules équivalentes d'un classeur Excel.

Y a-t-il une manière plus élégante de faire ceci?

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
13
Zach

Sur le même thème que d'autres réponses, rester simple

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
16
chris neilsen

Créez un tableau de variantes (plus facile en lisant une plage équivalente dans une variable de variante).

Remplissez ensuite le tableau et affectez-le directement à la plage.

Dim myArray As Variant

myArray = Range("blahblah")

Range("bingbing") = myArray

Le tableau de variantes finira par devenir une matrice à deux dimensions.

3
Lance Roberts

Comme d'autres l'ont suggéré, vous pouvez directement écrire un tableau à 2 dimensions dans une plage sur une feuille. Toutefois, si votre tableau est monodimensionnel, vous avez deux options:

  1. Convertissez d'abord votre tableau 1D en tableau 2D, puis imprimez-le sur une feuille (sous forme de plage).
  2. Convertissez votre tableau 1D en chaîne et imprimez-le dans une seule cellule (sous forme de chaîne).

Voici un exemple illustrant les deux options:

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

Remarque: Transpose entraîne une sortie colonne par colonne. La sortie ligne par ligne est à nouveau transposée - espérons que cela aura du sens.

HTH

0
Eddie Kumar

Ma version testée

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
0
Andrew Strathclyde

Une méthode plus élégante consiste à affecter tout le tableau à la fois:

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

Mais attention: cela ne fonctionne que jusqu’à environ 8 000 cellules. Ensuite, Excel génère une erreur étrange. La taille maximale n'est pas fixe et diffère beaucoup d'une installation Excel à une installation Excel.

0
Codo

Vous pouvez définir une plage, la taille de votre tableau et utiliser sa propriété 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
0
Steve Mallory