2011-05-19 30 views
10

2 boyutlu bir dizi alan bir makro yazdım ve bir excel çalışma kitabındaki eşdeğer hücrelere "yazdırır".Excel VBA işlevi bir diziyi çalışma kitabına yazdırmak için

Bunu yapmanın daha şık bir yolu var mı?

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 

cevap

14

basit

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 
+0

, atama 'Range' için aslında' .Value' için atama anlamına gelir. –

3

Bir varyant dizisi oluşturun (bir varyant değişkenine eşdeğer aralığı okuyarak en kolay olanı).

Ardından diziyi doldurun ve diziyi doğrudan aralığa atayın.

Dim myArray As Variant 

myArray = Range("blahblah") 

Range("bingbing") = myArray 

Varyant dizi 2 boyutlu bir matris olarak sonuçlanacaktır.

0

daha düzenli bir yol kerede tüm dizi atamaktır:

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 

Ama dikkat: sadece yaklaşık 8.000 hücre boyutuna kadar çalışır. Sonra Excel garip bir hata atar. Maksimum boyut sabit değildir ve Excel kurulumundan Excel kurulumuna göre çok farklıdır.

0

Sen, dizinin boyutunu bir Range tanımlayabilir ve kullanabilir o ekonomik tesis var: tutarak diğer cevaplar aynı tema üzerinde

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

Benim test sürümü

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 
1

Kısa yollar: Simply Join & Görüntü elemanları, yani (Döngü veya Çalışma-Range kullanmak zorunda kalmadan ) bir dize olarak dizi-unsurları katılmak için katıl() işlevini kullanın örneğin:

OLE Otomasyonu'nın uğruna
MsgBox Join(arrayName, ",") 

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