Crear referencias de celda en una llamada a otra macro

Crear referencias de celda en una llamada a otra macro

Estoy intentando copiar un número variable de filas de datos (valores y formatos) de una hoja de trabajo a otra. Para hacer esto, encontré y con éxito un código VBA en la web que copiará una sola celda a la vez.Copy_ValueFormat(cell1 As Range, cell2 As Range)

Pero la llamada falla cuando llamo a ese código desde dentro de For Loops anidados. Claramente no estoy formateando correctamente las referencias de celda en la llamada porque recibo el siguiente error: [Error de tiempo de ejecución '9': Subíndice fuera de rango]

¿Alguien puede decirme qué estoy haciendo mal?

'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

Respuesta1

No es necesario seleccionar algo para trabajar en ello y la idea de recopilar la selección actual para volver a ella es innecesaria. Las Application.ScreenUpdatingllamadas solo sirven para hacer parpadear la pantalla.

El uso Callpara ejecutar un subprocedimiento ya no se utiliza. Tenga en cuenta que sin él, los parámetros pasados ​​no están entre corchetes.

La fuente de la copia original sigue ahí después de xlPasteFormats; no es necesario copiarlo nuevamente.

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

información relacionada