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.ScreenUpdating
llamadas solo sirven para hacer parpadear la pantalla.
El uso Call
para 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