Script VBA copiado de uma planilha para outra

Script VBA copiado de uma planilha para outra

Eu tenho um script VBA funcional para a planilha Function Test Procedure (FTP) que pegará os valores armazenados em 32 intervalos nomeados individualmente e os colará em uma planilha separada, Resultados. Quando tentei usar o mesmo script para Procedimento de teste de aceitação (ATP), ele repete os resultados do FTP e os copia abaixo dos resultados originais do FTP. Ainda sou novo em VBA e não entendo muito dele, mas entendo outras linguagens de programação. Não consigo entender por que isso não funciona para o ATP como funcionou para o FTP.

Script de procedimento de teste de função

Sub Copy_Filtered_Sections()

    Dim Section As Long, NextRow As Long

    For Section = 1 To 32

        NextRow = Sheets("Results").Range("A" & Rows.Count).End(xlUp).Row + 1 'Next empty row

        Sheets("Function Test Procedure").Select

        Range("FTPSec" & Section).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _
        Destination:=Sheets("Results").Range("A" & NextRow)

'        Range("FTPSec" & Section).Columns("G:H").SpecialCells(xlCellTypeVisible).Copy _
'            Destination:=Sheets("Results").Range("N" & NextRow)

    Next Section

End Sub

Script de procedimento de teste de aceitação

Sub Copy_ATP_Tables()

    Dim SectionATP As Long, NextRow As Long

    For SectionATP = 1 To 32

        NextRow = Sheets("Results").Range("A" & Rows.Count).End(xlUp).Row + 1 'Next empty row

        Sheets("Acceptance Test Procedure").Select

        Range("ATPSec" & SectionATP).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _
        Destination:=Sheets("Results").Range("A" & NextRow)

'           Range("FTPSec" & Section).Columns("G:H").SpecialCells(xlCellTypeVisible).Copy _
'                Destination:=Sheets("Results").Range("N" & NextRow)

    Next SectionATP


End Sub

A segunda função está retornando a seguinte mensagem de erro:

"Erro em tempo de execução '1004': Método 'Range' do objeto '_Global' falhou" na linha "Range("ATPSec" & SectionATP).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _ Destination :=Planilhas("Resultados").Range("A" & PróximaLinha)

Responder1

Acredito que o problema é que a pasta de trabalho nomeou intervalos para FTP, mas não para ATP. No código do Procedimento de Teste de Função, na primeira iteração a linha análoga

Range("FTPSec" & Section).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _
    Destination:=Sheets("Results").Range("A" & NextRow)

chama as células visíveis nas colunas A a H do intervalo nomeado FTPSec1. Presumivelmente, existem intervalos nomeados FTPSec1, FTPSec2, ..., FTPSec32em sua pasta de trabalho.

No código do Procedimento de Teste de Aceitação, ao imitar a sintaxe aqui, você assumiu que os intervalos nomeados ATPSec1, ATPSec2, ..., ATPSec32estão definidos na pasta de trabalho. Caso contrário, seu código gerará um erro porque o Excel não sabe a que Range("ATPSec1")está se referindo.

Para verificar se esse é realmente o problema, abra o Gerenciador de Nomes no Excel pressionando Ctrl+ F3. Aqui você verá todos os intervalos nomeados na pasta de trabalho. Suspeito que você verá os intervalos de FTP, mas não os intervalos de ATP.

Para resolver esse problema, você deve seguir um destes procedimentos:

  • Defina intervalos ATPSec1, ATPSec2, ..., ATPSec32em sua pasta de trabalho. Faça isso criando novos intervalos nomeados por meio do Gerenciador de Nomes; ou

  • Altere seu código para ATP para que o VBA identifique os intervalos relevantes, provavelmente usando os mesmos critérios que você usaria para definir os intervalos em primeiro lugar.

Responder2

Para remover a ambigüidade, você deve consultar a planilha ao usar um intervalo. Combine duas linhas de código

    Sheets("Acceptance Test Procedure").Select
    Range("ATPSec" & SectionATP).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _
    Destination:=Sheets("Results").Range("A" & NextRow)

para isto:
Sheets("Procedimento de teste de aceitação").Range("ATPSec" & SectionATP).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _ Destination:=Sheets("Resultados").Range(" A" e próxima linha)

Assim você qualifica a origem da mesma forma que qualifica o destino.
Se isso não remover o erro, você terá que depurar manualmente. No editor VBA, entre no sub (F8) para inicializar as variáveis. Em seguida, clique na janela de acesso direto e digite

SetctionATP = 1
? Sheets("Acceptance Test Procedure").Range("ATPSec" & SectionATP).address

Isso deve retornar um intervalo válido. Próximo

? Sheets("Acceptance Test Procedure").Range("ATPSec" & SectionATP).Columns("A:H").address

Você pode testar outros intervalos nomeados variando SectionATP.

informação relacionada