Ich versuche, eine variable Anzahl von Datenzeilen (Werte und Formate) von einem Arbeitsblatt in ein anderes zu kopieren. Dazu habe ich im Internet erfolgreich VBA-Code gefunden, der jeweils eine einzelne Zelle kopiert.Copy_ValueFormat(cell1 As Range, cell2 As Range)
Aber der Aufruf stürzt ab, wenn ich diesen Code aus verschachtelten For-Schleifen heraus aufrufe. Ich formatiere die Zellreferenzen im Aufruf offensichtlich nicht richtig, da ich den folgenden Fehler erhalte: [Laufzeitfehler „9“: Index außerhalb des gültigen Bereichs]
Kann mir da draußen jemand sagen, was ich falsch mache?
'THIS IS THE VBA I GOT OFF THE
'Copy Value and formats from one cell to another
Sub Copy_ValueFormat(cell1 As Range, cell2 As Range)
Dim sel As Range
Set sel = Selection
Application.ScreenUpdating = False
cell1.Copy
cell2.PasteSpecial Paste:=xlPasteFormats
cell1.Copy
cell2.PasteSpecial Paste:=xlPasteValues
sel.Activate
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub
'THIS IS SOME TEST CODE THAT SUCCESSFULLY CALLS "Copy_ValueFormat(...)"
Sub TestCopy()
Call Copy_ValueFormat(Range("ONGOING!B2"), Range("BF2"))
End Sub
'THIS IS MY CODE THA CRASHES WHEN I MAKE THE CALL TO "Copy_ValueFormat(...)"
Sub TestForNext()
Dim i As Long
Dim j As Long
Sheets("JUNK").Select
Cells.ClearContents
For i = 1 To 10 'Row Counter
For j = 1 To 20 'Column Counter
Call Copy_ValueFormat(Sheets("ONGOING!").Cells(i, j), Sheets("JUNK").Cells(i, j))
Next j
Next i
End Sub
Antwort1
Man muss nichts auswählen, um daran zu arbeiten, und die Idee, die aktuelle Auswahl einzusammeln, um dorthin zurückzukehren, ist unnötig. Die Application.ScreenUpdating
Aufrufe dienen nur dazu, den Bildschirm blinken zu lassen.
Die Verwendung Call
zum Ausführen einer Unterprozedur wurde außer Gebrauch gesetzt. Beachten Sie, dass die übergebenen Parameter ohne diese Option nicht eingeklammert werden.
Die ursprüngliche Kopierquelle ist nach xlPasteFormats immer noch vorhanden; Sie müssen sie nicht erneut kopieren.
Sub Copy_ValueFormat(cell1 As Range, cell2 As Range)
cell1.Copy
cell2.PasteSpecial Paste:=xlPasteFormats
cell2.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
End Sub
Sub TestForNext()
Dim i As Long, j As Long
'if you want to halt screen updating, this is where it should be
Application.ScreenUpdating = False
With Worksheets("JUNK")
.Cells.Clear '<~~ clear values and formats
For i = 1 To 10 'Row Counter
For j = 1 To 20 'Column Counter
Copy_ValueFormat Worksheets("ONGOING!").Cells(i, j), .Cells(i, j)
Next j
Next i
End With
Application.ScreenUpdating = True
End Sub