Erstellen von Zellbezügen beim Aufruf eines anderen Makros

Erstellen von Zellbezügen beim Aufruf eines anderen Makros

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.ScreenUpdatingAufrufe dienen nur dazu, den Bildschirm blinken zu lassen.

Die Verwendung Callzum 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

verwandte Informationen