Erro de tempo de execução de copiar / colar do VBA

1

Esse bloco de código continua recebendo um erro de tempo de execução 1004. Estou tentando copiar pequenos blocos de informações de uma planilha para outra se os nomes das colunas iniciais corresponderem.

For a = 8 To 17
    For b = 7 To 21
        If Sheets("Sheet1").Cells(a, 2).Value = Sheets("Sheet2").Cells(b, 1).Value Then
            Sheets("Sheet2").Range(Cells(b, 1), Cells(b, 7)).Copy Sheets("Sheet1").Cells(a, 6)
        End If
    Next b
Next a

Como posso depurar meu código?

    
por user348631 22.07.2014 / 23:39

3 respostas

1

Em suma, há algo errado com a linha

Sheets("Sheet2").Range(Cells(b, 1), Cells(b, 7)).Copy Sheets("Sheet1").Cells(a, 6)

altere-o para abaixo para corrigir seu problema.

Sheets("Sheet2").Range(Sheets("Sheet2").Cells(b, 1), Sheets("Sheet2").Cells(b, 7)).Copy Sheets("Sheet1").Cells(a, 6)

Como depurei:

Quando seu código for executado, clique em "Depurar" quando o erro de tempo de execução 1004 aparecer. A quarta linha é destacada em amarelo (ou seja, o VBA encontra um erro ao executar essa linha). Então é aí que começamos.

Para eliminar o problema, podemos mover o cursor sobre várias variáveis para ver seu valor. b = 7, a = 8, parece bem.

Removendo os parâmetros para a função Copy , deixando apenas tudo antes do .Copy ... o problema ainda está lá. Então deve haver algo errado com

Sheets("Sheet2").Range(Cells(b, 1), Cells(b, 7)).Copy

Olhando para ajuda no .Range e observe que você precisa especificar o Sheet também. E o problema está resolvido.

    
por 23.07.2014 / 04:43
0

Verifique se nenhuma planilha está protegida (não apenas o intervalo que você está copiando, mas a planilha inteira).

Além disso, como isso é chamado? Qual é a função completa, e está em Sheet1, ThisWorkbook ou em um módulo separado? Qual linha está jogando o erro?

Tente declarar cada objeto separadamente e veja se você consegue isolar qual etapa falha.

Dim src as Excel.Range
Set src = Sheets("Sheet1").Cells(a, 2)
Dim dst as Excel.Range
Set dst = Sheets("Sheet2").Cells(b, 1)
If src.Value = dst.Value Then
  Dim src2 as Excel.Range
  Set src2 = Sheets("Sheet2").Range(Cells(b, 1), Cells(b, 7))
  Dim dst2 as Excel.Range
  Set dst2 = Sheets("Sheet1").Cells(a, 6)
src2.Copy dst2
End If
    
por 23.07.2014 / 02:11
0

Eu testei soluções diferentes. E depois de ler a documentação e testá-la no meu computador, lembrei-me disso:

  • Por padrão, o Excel VBA transmite argumentos por referência.
  • As células são inicializadas uma vez > apenas uma instância

Ou, em sua solução, Cells é chamado de número de vezes no mesmo procedimento! Você passa o valor duas vezes em um intervalo com a mesma instância por referência. O intervalo obtém a mesma instância do objeto duas vezes > O resultado não é válido.

Você pode forçar a passagem de ByVal com parâmetros de fechamento (). Isso é o mesmo quando você usou a chave WITH

O código Mime é:

    Dim shSrc as Excel.Worksheet, shDst as Excel.Worksheet

    Set shSrc = Sheets("Sheet1")
    Set shDst = Sheets("Sheet2")

    'copy
    With shSrc
        .Range((.Cells(1, 1)), (.Cells(1, 7))).Copy
    End With

    'special paste need same range (number of rows and colums)
    With shDst
        .Range((.Cells(1, 1)), (.Cells(1, 7))).PasteSpecial xlPasteValues
    End With
    
por 19.01.2015 / 10:58