2016-12-02 5 views
1

Ich bekomme den Fehler 'Index außerhalb des Bereichs', wenn ich den folgenden Code ausführen; Debug verweist mich auf die letzte Zeile:Laufzeitfehler '9' VBA

Dim SrcBook As Workbook 
Dim TrgBook As Workbook 
Dim SrcSheet As Worksheet 
Dim TrgSheet As Worksheet 
Dim Sheet_Name As String 

Workbooks.Open (CalendarFile) 
Sheet_Name = MonthName(Month(SrcSheet.Cells(SrcRow, "D").Value), False) 
MsgBox ("Sheet_Name Value is: " & Sheet_Name) 
Set TrgSheet = Workbooks(CalendarFile).Worksheets(Sheet_Name) 

Ich habe wiederholt bestätigt, dass CalendarFile ein gültiger Dateiname ist (ich den vollständigen Pfad Dateinamen verwenden). Blattname ist auch der gültige Name eines Arbeitsblatts in dieser Arbeitsmappe. Ich erhalte einen ähnlichen Fehler, wenn ich versuche, über numerische Indexierung auf die Arbeitsblätter zuzugreifen [z. B. Arbeitsmappen (Kalenderdatei) .Arbeitsblätter (11) und Arbeitsmappen (Kalenderdatei) .Arbeitsblätter (November)]. Der MsgBox-Aufruf überprüft, dass ich der WorkSheets() -Methode den richtigen Blattnamen füttere.

Zuletzt ist ScrRow richtig definiert - ich kann diesen Code verwenden, um Zielarbeitsblätter im selben WorkBook zu manipulieren, wie das Makro in Spielzeug-/Testanwendungen aufgerufen wird, aber aus irgendeinem Grund schlägt es fehl, wenn ich versuche zu manipulieren Zielarbeitsblätter in anderen (offenen) WorkBooks.

Jede Hilfe würde sehr geschätzt werden! Danke!

+0

Sheet_Name sollte 'Range' sein und keine Zeichenfolge. – Niclas

+0

@Niclas warum sollte es eine Range sein? MonthName gibt eine Zeichenfolge zurück. – Sorceri

Antwort

1

Wenn CalendarFile ein gültiger Dateiname ist, ist das Ihr Problem. Der Index, den Sie für Workbooks() benötigen, ist der Workbook.Name, nicht sein Dateipfad. Wenn z. B. CalendarFileC:\Foo\Bar.xlsx ist, müssen Sie Bar.xlsx verwenden.

Was die Erklärung oben, es spielt keine Rolle, weil Sie sollten wirklich nur die Referenz greifen, dass Workbooks.Open zurückkehrt und dass nur verwenden:

Set TrgBook = Workbooks.Open(CalendarFile) 
Sheet_Name = MonthName(Month(SrcSheet.Cells(SrcRow, "D").Value), False) 
MsgBox ("Sheet_Name Value is: " & Sheet_Name) 
Set TrgSheet = TrgBook.Worksheets(Sheet_Name) 
+0

Vielen Dank! Ich habe Ihren Post tatsächlich vermisst und festgestellt, dass ich meine MsgBox-Statements weiter optimiert habe, um den Fehler zu finden. Ich stellte fest, dass das Öffnen der Arbeitsmappe selbst der Fehler war und die Worksheets nicht indiziert wurden. Egal, ich bin froh, dass du meinen Rücken hattest. – kapowpow

+0

@kapowpow - Das Mitnehmen sollte sein, dass Sie nur 'Workbook' die Referenz sammeln sollten, die' .Open' für Sie zurückgibt. Sie sollten nie 'Workbooks()' in dieser Situation benutzen müssen. – Comintern

+0

Und danke für den Syntaxvorschlag - ich habe ihn implementiert. Ich hatte es ursprünglich so eingerichtet, aber später geändert, weil das Makro, das ich erstelle, nie funktionierte und ich versuchte zu verstehen, warum. Ich werde es zurück ändern. – kapowpow

0

die Lösung gefunden, zumindest für dieses Problem:

Workbooks.Open (CalendarFile) 

benötigt den Voll-Pfad-Namen der Datei zu öffnen, aber weitere Verweise auf die Datei benötigen Sie die Dateinamen nur - mit aus dem Pfad heraus angehängt. Das heißt,

Workbooks(file_name_without_path.xlsx).Worksheets(Sheet_Name) 

Dies ist extrem ärgerlich und sollte behoben werden.

+1

'Workbooks' ist eine Sammlung von * offenen * Arbeitsmappen. Es funktioniert nicht mit geschlossenen Dateien. Sie verwenden Öffnen, um Objekte zur Sammlung hinzuzufügen. Es funktioniert wie es ist --- nichts zu reparieren. – xidgel