VBA-Skript von einem Blatt in ein anderes kopiert

VBA-Skript von einem Blatt in ein anderes kopiert

Ich habe ein funktionierendes VBA-Skript für das Arbeitsblatt „Function Test Procedure (FTP)“, das die in 32 einzeln benannten Bereichen gespeicherten Werte übernimmt und sie in ein separates Arbeitsblatt, „Results“, einfügt. Als ich versuchte, dasselbe Skript für das Acceptance Test Procedure (ATP) zu verwenden, wiederholte es die Ergebnisse von FTP und kopierte sie unter die ursprünglichen FTP-Ergebnisse. Ich bin noch neu bei VBA und verstehe nicht viel davon, aber ich verstehe andere Programmiersprachen. Ich kann nicht verstehen, warum dies für ATP nicht so funktioniert wie für FTP.

Funktionstestverfahrensskript

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

Skript für das Abnahmetestverfahren

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

Die zweite Funktion gibt die folgende Fehlermeldung zurück:

„Laufzeitfehler ‚1004‘: Methode ‚Range‘ des Objekts ‚_Global‘ ist fehlgeschlagen“ in der Zeile „Range(‚ATPSec‘ & SectionATP).Columns(‚A:H‘).SpecialCells(xlCellTypeVisible).Copy _ Destination:=Sheets(‚Results‘).Range(‚A‘ & NextRow)

Antwort1

Ich glaube, das Problem besteht darin, dass die Arbeitsmappe benannte Bereiche für FTP, aber nicht für ATP hat. Im Funktionstestverfahren-Code wird bei der ersten Iteration die analoge Zeile

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

ruft die sichtbaren Zellen in den Spalten A bis H des benannten Bereichs auf FTPSec1. Vermutlich gibt es in Ihrer Arbeitsmappe benannte Bereiche FTPSec1, FTPSec2, ..., .FTPSec32

Im Code des Abnahmetestverfahrens haben Sie durch Nachahmen der Syntax hier angenommen, dass benannte Bereiche ATPSec1,, ATPSec2..., ATPSec32in der Arbeitsmappe definiert sind. Wenn dies nicht der Fall ist, wird Ihr Code einen Fehler ausgeben, da Excel nicht weiß, worauf Range("ATPSec1")verwiesen wird.

Um zu überprüfen, ob dies tatsächlich das Problem ist, öffnen Sie den Namensmanager in Excel, indem Sie Ctrl+ drücken F3. Hier sehen Sie alle benannten Bereiche in der Arbeitsmappe. Ich vermute, Sie werden die FTP-Bereiche sehen, aber nicht die ATP-Bereiche.

Um dieses Problem zu lösen, müssen Sie einen der folgenden Schritte ausführen:

  • Definieren Sie Bereiche ATPSec1, ATPSec2, ..., ATPSec32in Ihrer Arbeitsmappe. Erstellen Sie dazu neue benannte Bereiche über den Namensmanager. oder

  • Ändern Sie Ihren Code für ATP so, dass VBA die relevanten Bereiche identifiziert, und zwar vermutlich unter Verwendung derselben Kriterien, die Sie ursprünglich zum Definieren der Bereiche verwenden würden.

Antwort2

Um Mehrdeutigkeiten zu vermeiden, sollten Sie bei der Verwendung eines Bereichs auf das Blatt verweisen. Kombinieren Sie zwei Codezeilen

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

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

Damit qualifizieren Sie die Quelle auf die gleiche Weise wie das Ziel.
Wenn das den Fehler nicht behebt, müssen Sie ihn manuell debuggen. Gehen Sie im VBA-Editor in das Sub (F8), um die Variablen zu initialisieren. Klicken Sie dann in das Direktzugriffsfenster und geben Sie ein

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

Dies sollte einen gültigen Bereich zurückgeben. Weiter

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

Sie können andere benannte Bereiche testen, indem Sie variieren SectionATP.

verwandte Informationen