Criando referências de células em uma chamada para outra macro

Criando referências de células em uma chamada para outra macro

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.ScreenUpdatingchamadas servem apenas para piscar a tela.

O uso Callpara 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

informação relacionada