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
..., ATPSec32
in 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
, ...,ATPSec32
in 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
.