Estou tentando copiar um número variável de linhas de dados (valores e formatos) de uma planilha para outra. Para fazer isso encontrei e com sucesso algum código VBA na web que copiará uma única célula por vezCopy_ValueFormat(cell1 As Range, cell2 As Range)
Mas a chamada falha quando eu chamo esse código de dentro de For Loops aninhados. Claramente, não estou formatando as referências de células na chamada corretamente, pois estou recebendo o seguinte erro: [Erro em tempo de execução '9': Subscrito fora do intervalo]
Alguém aí pode me dizer o que estou fazendo de errado?
'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
Responder1
Você não precisa selecionar algo para trabalhar nisso e a ideia de coletar a seleção atual para retornar a ela é desnecessária. As Application.ScreenUpdating
chamadas servem apenas para piscar a tela.
O uso Call
para executar um subprocedimento foi desativado. Observe que sem ele, os parâmetros passados não ficam entre colchetes.
A fonte da cópia original ainda existe depois de xlPasteFormats; você não precisa copiá-lo novamente.
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