2016-06-20 6 views
0

Was zunächst Werke habe ich, aber es ist sperrig, und ich bin ziemlich sicher, rationalisiert werden kann. Dies ist ein Ausschnitt aus dem Code (ich wiederhole diesen Vorgang immer und immer wieder über 200+ mal hatte ich es in zwei Makros zu brechen):VBA/Excel-Makro - versuchen, Code zu vereinfachen ein Array verwenden, das von einem Arbeitsblatt zeichnet und füllt über mehrere Arbeitsblätter

Set rng = ws.Range("C11:AJ11") 
l = 13 
For Each cell In rng 
Sheets(l).Range("D23") = cell.Value 
Sheets(l).Range("I23") = cell.Value 
l = l + 1 
Next cell 

Set rng = ws.Range("C12:AJ12") 
l = 13 
For Each cell In rng 
Sheets(l).Range("D24") = cell.Value 
Sheets(l).Range("I24") = cell.Value 
l = l + 1 
Next cell 

So, das funktioniert, aber jetzt versuche ich, um herauszufinden, wie ein Array zu verwenden, um möglicherweise zu optimieren (wenn das möglich ist oder vielleicht ein Array ist nicht der beste Weg, ich bin sehr offen für Beratung auf bessere Ansätze?.):

Dim row As Range 
Dim rng As Range, cell As Range 
Dim TestArray() As Variant 
TestArray = Range("C10:AJ54") 
l = 13 
For Each cell In TestArray 
    Sheets(l).Range("D22:D66") = cell.Value 
    Sheets(l).Range("I22:I66") = cell.Value 
    l = l + 1 
Next cell 

So bekomme ich die Fehlermeldung „Kompilieren: Für jede Steuervariable in Arrays muss Variant sein, "das ich untersucht habe, aber ich bin nicht ganz sicher, wie ich es korrigieren kann. Ich mache mir auch Sorgen, dass ich die Blätter nicht in der richtigen Reihenfolge bestücken werde. Es sollte von einer Reihe zu einer Zeit ziehen, und eine Zelle, um zu jedem Blatt zuerst. Dann sollte es zur nächsten Reihe des activesheet gehen und Werte von jeder Zelle dieser Reihe nehmen und einen Wert in jedes Blatt in der Reihenfolge, usw. setzen.

Ich hoffe, dass das eine gute Menge Detail für das ist, was ich bin zu fragen, aber wenn nicht, ich bin zu versuchen, glücklich mehr :)

Antwort

1

Mit einem äußeren Schleife zu erklären, die durch die Reihen-Schleifen:

Sub foo() 
Dim i As Long 
Dim rng As Range 
Dim l As Long 
Dim cell As Range 

For i = 10 To 54 
    Set rng = ws.Range("C" & i & ":AJ" & i) 
    l = 13 
    For Each cell In rng 
     Sheets(l).Range("D" & 12 + i) = cell.Value 
     Sheets(l).Range("I" & 12 + i) = cell.Value 
     l = l + 1 
    Next cell 
Next i 
End Sub 

wenn Sie ein Array verwenden möchten, dann werden Sie noch brauchen zweimal loop:

Sub foo() 
Dim i As Long 
Dim rng As Range 
Dim l As Long 
Dim j As Long 
Dim testArr() As Variant 
Dim outarr() As Variant 

testArr = ActiveSheet.Range("C10:AJ54") 
ReDim outarr(LBound(testArr, 1) To UBound(testArr, 1)) As Variant 
For j = LBound(testArr, 2) To UBound(testArr, 2) 
    l = 13 
    For i = LBound(testArr, 1) To UBound(testArr, 1) 
     outarr(i) = testArr(i, j) 
    Next j 
    Sheets(l).Range("D22").Resize(UBound(outarr)).Value = outarr 
    Sheets(l).Range("I22").Resize(UBound(outarr)).Value = outarr 
    l = l + 1 
Next i 
End Sub 

Das Array wird schneller sein, da es nur so oft wie möglich mit den Blättern interagiert.

+0

Ja, die erste Option macht mir sehr viel Sinn - vom Konzept her das ist, was ich wirklich tun wollte, aber ich konnte nicht einen Mechanismus herauszufinden, so dass ich dachte, ich würde ein Array versuchen. Ich denke Arrays sind gerade jetzt zu fortgeschritten für mich. Vielen Dank! – Snackbreak

Verwandte Themen