Script VBA copiado de uma planilha para outra

1

Eu tenho um script VBA de trabalho para a planilha Função Test Procedure (FTP) que levará os valores armazenados em 32 intervalos nomeados individualmente e colá-los em uma planilha separada, Resultados. Quando tentei usar o mesmo script para o Acceptance Test Procedure (ATP), ele repete os resultados do FTP e os copia abaixo dos Resultados FTP originais. Eu ainda sou novo no VBA e não entendo muito, mas eu entendo outras linguagens de programação. Não consigo entender por que isso não funcionará para o ATP, como aconteceu com 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:

"Run-time error '1004': Method 'Range' of object '_Global' failed" on the line "Range("ATPSec" & SectionATP).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _ Destination:=Sheets("Results").Range("A" & NextRow)

    
por Gerasimos.Zap 30.09.2015 / 18:10

2 respostas

1

Acredito que a questão é que a pasta de trabalho nomeou intervalos para FTP, mas não para ATP. No código Procedimento do 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, há intervalos nomeados FTPSec1 , FTPSec2 , ..., FTPSec32 em sua pasta de trabalho.

No código Procedimento do Teste de Aceitação, imitando a sintaxe aqui, você assumiu que os intervalos nomeados ATPSec1 , ATPSec2 , ..., ATPSec32 estão definidos na pasta de trabalho. Se não estiverem, seu código lançará um erro porque o Excel não sabe a que Range("ATPSec1") está se referindo.

Para verificar se esse é o problema, abra o Gerenciador de nomes no Excel pressionando Ctrl + F3 . Aqui você verá todos os intervalos nomeados na pasta de trabalho. Eu 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 , ..., ATPSec32 em sua pasta de trabalho. Faça isso criando novos intervalos nomeados através do Name Manager; ou

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

por 30.09.2015 / 19:23
0

Para remover a ambiguidade, 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 isso:
        Sheets ("Acceptance Test Procedure"). Range ("ATPSec" & SectionATP) .Columns ("A: H"). SpecialCells (xlCellTypeVisible) .Copy _         Destino: = folhas ("Resultados"). Intervalo ("A" & NextRow)

Assim você qualifica a fonte da mesma maneira que qualifica o destino.
Se isso não remover o erro, você deve depurá-lo manualmente. No editor de 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óxima

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

Você pode testar outros intervalos nomeados variando SectionATP .

    
por 30.09.2015 / 19:48