Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA: Workbook open ohne direkten Dateinamen

VBA: Workbook open ohne direkten Dateinamen
23.10.2019 05:21:45
Charly
Guten Morgen,
kann man per VBA ein gespeichertes Workbook öffnen ohne den Dateinamen zu wiesen.
Ich nutze diesen Code um anhand eines Suchbegriffs ein Workbook zu öffnen.
Das klappt auch, das Workbook mit dem gesuchten Begriff im Dateinamen wurde gefunden u. geöffnet (Hintergrund/Ausgeblendet).

Sub SucheDatei ()
Dim Dateiname As String, Suchbegriff As String, Pfad As String
Pfad = "P:\Test Ordner\"
Suchbegriff = UserForm1.TextBox1                           ' Inhalt der TextBox Bsp. Max  _
Muster
Dateiname = Dir(Pfad & "*" & Suchbegriff & "*.xlsx")
If Dateiname  "" Then
Workbooks.Open Pfad & Dateiname
End If
End Sub

Da ich viele Workbook`s in meinem Ordner habe dauert es bis Ich das richtige gefunden habe, darum dieser Code Passt perfekt.
So nun zu meinem Problem: Wie Spreche Ich das Workbook an ohne den Dateinamen direkt zu wissen, um dort Werte in die Tabellen einzutragen. Ich muss dazu sagen das der Suchbegriff die einzige Konstante im Dateinamen ist die wiederum nur einmal pro Datei Vorkommt.
Anzeige

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: Workbook open ohne direkten Dateinamen
23.10.2019 05:49:35
Hajo_Zi
Nein das gehjt nicht. Da Excel nicht in Deinen Kopfg schauen kann und damit die Information hat welche Datei Du öffnen willst.

In dem Fall nimmst Du einfach...
23.10.2019 06:03:53
Case
Hallo, :-)
... noch eine Objektvariable für das Workbook dazu: ;-)
Option Explicit
Sub SucheDatei()
Dim Dateiname As String, Suchbegriff As String, Pfad As String
Dim wkbBook As Workbook
Pfad = "P:\Test Ordner\"
Suchbegriff = UserForm1.TextBox1  ' Inhalt der TextBox Bsp. Max Muster
Dateiname = Dir(Pfad & "*" & Suchbegriff & "*.xlsx")
If Dateiname  "" Then
Set wkbBook = Workbooks.Open(Pfad & Dateiname)
MsgBox wkbBook.FullName ' Ausgabe Pfad und Name
wkbBook.Close False ' Workbook schliessen OHNE speichern
End If
End Sub
Im Beispiel wird Pfad- und Dateiname ausgegeben und die Datei dann ohne speichern geschlossen. Mit der Variablen "wkbBook" kannst du jetzt anstellen was du willst, bzw. was möglich ist.
Servus
Case

Anzeige
AW: In dem Fall nimmst Du einfach...
23.10.2019 22:52:54
Charly
Nabend Case,
habe deine Änderung Übernommen das Klappt auch, allerdings lasse Ich das WorkBook offen.
Ich versuch schon eine weile in das WorkBook zu Schreiben leider ohne erfolg.
Sub Schreiben()
Dim wkbBook As Workbook
Set wkbBook = Worksheets("Tab1").Activate
With Worksheets("Tab1")
Range("C3").Value = UserForm1.TextBox3
Range("D3").Value = UserForm1.TextBox4
Range("E3").Value = UserForm1.TextBox5
Range("F3").Value = UserForm1.TextBox6
End With
End Sub
Das Ansprechen des wkbBook(Tab1) scheitert!
Was mache Ich falsch...
Danke für jegliche Hilfe im Voraus...
Gruß Charly
Anzeige
AW: In dem Fall nimmst Du einfach...
24.10.2019 00:01:58
fcs
Hallo Charly,
wenn du die beim Öffnen der Datei verwendete Variable später wieder in einem anderen Makro nutzen möchtest, dann muss diese Variable in einem allgemeinen Modul als Public oder im Codemodule des Userforms übergeordnet als Private deklariert werden. In der Prozedur in der die Datei geöffnet wird darf die Workbook-Variable dann dann nicht deklariert werden.
Wenn du "einfach" in die momentan aktive Arbeitsmappe schreiben willst, dann so:
Sub Schreiben()
Dim wkbBook As Workbook
Set wkbBook = Activeworkbook
With wkbBook.Worksheets("Tab1")
.Range("C3").Value = UserForm1.TextBox3
.Range("D3").Value = UserForm1.TextBox4
.Range("E3").Value = UserForm1.TextBox5
.Range("F3").Value = UserForm1.TextBox6
End With
End Sub
LG
Franz
Anzeige
AW: In dem Fall nimmst Du einfach...
24.10.2019 00:14:08
Charly
Nabend Franz
Perfekt Funktioniert super...
Danke für deine Hilfe...
Gruß Charly
AW: In dem Fall nimmst Du einfach...
24.10.2019 05:34:28
Charly
Morgen Franz
In einer Test-Mappe kann Ich deine Lösung ohne Probleme umsetzen.
  Sub SucheDatei()
Dim Dateiname As String, Suchbegriff As String, Pfad As String
Dim wkbBook As Workbook
Pfad = "P:\Test Ordner\"
Suchbegriff = UserForm1.TextBox1  ' Inhalt der TextBox Bsp. Max Muster
Dateiname = Dir(Pfad & "*" & Suchbegriff & "*.xlsx")
If Dateiname  "" Then
Set wkbBook = Workbooks.Open(Pfad & Dateiname)
MsgBox wkbBook.FullName ' Ausgabe Pfad und Name
wkbBook.Close False ' Workbook schliessen OHNE speichern
End If
End Sub

Sub Schreiben ()
Dim wkbBook As Workbook
Set wkbBook = Activeworkbook
With wkbBook.Worksheets("Tab1")
.Range("C3").Value = UserForm1.TextBox3
.Range("D3").Value = UserForm1.TextBox4
.Range("E3").Value = UserForm1.TextBox5
.Range("F3").Value = UserForm1.TextBox6
End With
End Sub
Wenn Ich das aber in mein Projekt einsetze bekomme Ich eine Fehlermeldung.
Laufzeitfehler "9" Index außerhalb des gültigen Bereichs.
Mir ist beim öffnen was aufgefallen, in der Test-Mappe ist die gesuchte Mappe nicht im Hintergrund geöffnet worden.
In meinem Projekt wird die zu öffnende Mappe aber im Hintergrund geöffnet.
Kann man das ändern so das die Mappe nicht im Hintergrund geöffnet wird.
Gruß Charly
Anzeige
AW: In dem Fall nimmst Du einfach...
24.10.2019 10:27:00
Werner
Hallo,
versuchs mal so, Deklariere die Variable wkbBook außerhalb einer Prozedur:
Public wkbBook As Workbook
Sub SucheDatei()
Dim Dateiname As String, Suchbegriff As String, Pfad As String
Pfad = "P:\Test Ordner\"
Suchbegriff = UserForm1.TextBox1  ' Inhalt der TextBox Bsp. Max Muster
Dateiname = Dir(Pfad & "*" & Suchbegriff & "*.xlsx")
If Dateiname  "" Then
Set wkbBook = Workbooks.Open(Pfad & Dateiname)
End If
End Sub
Sub Schreiben ()
With wkbBook.Worksheets("Tab1")
.Range("C3").Value = UserForm1.TextBox3
.Range("D3").Value = UserForm1.TextBox4
.Range("E3").Value = UserForm1.TextBox5
.Range("F3").Value = UserForm1.TextBox6
End With
wkbBook.Close False ' Workbook schliessen OHNE speichern
set wkbBook = Nothing
End Sub
Gruß Werner
Anzeige
AW: Korrekturen/Anpassungen
24.10.2019 10:46:27
fcs
Hallo Charly,
Werner hat dir dir einen alternativen Weg vorgeschlagen.
Dieser sollte etwas verfeinert/korrigiert werden:
a) Prüfung ob schon eine Datei der Qorkbook-Variablen zugewiesen ist
b) Nach dem Eintragen der Daten aus dem Userform sollte die Datei dann inkl. Speichern geschlossen werden.
LG
Franz

'Diese Zeile mit Variablendeklaration oben im Code-Module vor allen Prozeduren
Private wkbBook As Workbook
Sub SucheDatei()
Dim Dateiname As String, Suchbegriff As String, Pfad As String
Pfad = "P:\Test Ordner\"
Suchbegriff = UserForm1.TextBox1  ' Inhalt der TextBox Bsp. Max Muster
Dateiname = Dir(Pfad & "*" & Suchbegriff & "*.xlsx")
wkbBook
If Dateiname  "" Then
Set wkbBook = Workbooks.Open(Pfad & Dateiname)
Else
Set wkbBook = Nothing
End If
End Sub
Sub Schreiben()
If wkbBook Is Nothing Then
MsgBox "Es wurde noch keine Mappe geöffnet und der Variablen wkbBook zugewiesen", _
vbOKOnly, "Makro Schreiben"
Else
With wkbBook.Worksheets("Tab1")
.Range("C3").Value = UserForm1.TextBox3
.Range("D3").Value = UserForm1.TextBox4
.Range("E3").Value = UserForm1.TextBox5
.Range("F3").Value = UserForm1.TextBox6
End With
wkbBook.Close True ' Workbook schliessen MIT speichern
Set wkbBook = Nothing
End If
End Sub

Anzeige
AW: Korrekturen/Anpassungen
25.10.2019 05:40:24
Charly
Guten Morgen
Werner u. Franz
Habe mir eure Antworten durch gesehen u. Sie eingesetzt, mit ner kleinen Änderung.
Franz, wenn Ich den Code so lasse bekomme Ich eine Fehlermeldung die Markierung ist bei (wkbBook) gesetzt. Habe dies kleine Zeile Auskommentiert u. siehe da es geht.

Dateiname = Dir(Pfad & "*" & Suchbegriff & "*.xlsx")
'wkbBook

Ebenso habe Ich diese Zeile Auskommentiert, warum siehe Unten...
wkbBook.Close True ' Workbook schließen MIT speichern

Soweit so gut...
Nun stehe Ich vor einem neuen Problem.
Ich habe ja die Zeile "wkbBook.Close True" Auskommentiert weil Ich an dieser Stelle noch etwas vorhabe.
Ich möchte die per Suchbegriff geöffnette Mappe u. bereits beschrieben nun Speichern aber mit einem Neuen Dateinamen in einem anderen Ordner.
Mein Save-Button sieht so aus:
Private Sub Cbu_Save_Click()
Dim Datei As String, Verzeichnis As String, SaveDummy As Variant
Call M_UF5.Schreibe
Select Case Me.CB_Bereich_Aus
Case "WB 1"
Verzeichnis = "P:\Test Ordner\Ausgezogen\"
Datei = Me.TB_Dateiname_Neu.Value & ".xlsx"
SaveDummy = SpeichernUnter(Verzeichnis & Datei)
If SaveDummy  False Then ActiveWorkbook.SaveAs SaveDummy
Range("A1").Select
ThisWorkbook.Activate
' hier kommt eine weitere Speicher möglichkein
' beide Möglichkeiten sollen in eine Abfrage wo gespeichert werden soll
'        Case "WB 2"
' Code frei, wird noch befühlt
'        Case "WB 3"
' Code frei, wird noch befühlt
'        Case "Haus"
' Code frei, wird noch befühlt
Case Else
End Select
Call M_UF5.Inhalt_Löschen
End Sub
Function SpeichernUnter(VorgabeName As String) As Variant
SpeichernUnter = Application.GetSaveAsFilename(InitialFileName:=VorgabeName, _
FileFilter:="Excel Dateien (*.xlsx),*.xls*", FilterIndex:=1, _
Title:="Speichern Unter...", ButtonText:="speichern")
End Function

Bei einem anderen Project geht dies mit Dateinamen u. neuem Ordner, darum die Case Zeilen klappte ganz gut.
Nun passiert bei diesem Project nichts, keine Fehlermeldung u. kein Speichern.
Habt Ihr vieleicht einen Ahnung woran es liegen kann?
Gruß Charly
Anzeige
AW: Korrekturen/Anpassungen(gelöst)
26.10.2019 01:34:50
Charly
Nabend
an alle die mir in diesem Thread geholfen haben ein Danke schön.
Habe das letzte Problem so gelöst.

Private Sub Cbu_Save_Click()
Dim Datei As String, Verzeichnis As String, SaveDummy As Variant
Dim iClick As Integer
iClick = MsgBox( _
prompt:="In welchen Ordner soll Gespeichert werden?" & vbCrLf & _
"Einzug, Klicke (Ja) oder Auszug, Klicke (Nein)", _
Buttons:=vbExclamation + vbYesNoCancel)
If iClick = vbYes Then
Call M_UF5.Schreibe_Protokoll_Stamm
Verzeichnis = "P:\Test HM2030\Einzug\"
Datei = Me.TB_Dateiname_Neu & ".xlsx"
SaveDummy = SpeichernUnter(Verzeichnis & Datei)
If SaveDummy  False Then ActiveWorkbook.SaveAs SaveDummy, xlOpenXMLWorkbook
Range("A1").Select
ActiveWorkbook.Close
Unload Me
ThisWorkbook.Activate
MsgBox "Die Daten wurde Übernommen u. die Datei wurde im jeweiligen Ordner Angelegt.",  _
vbInformation
ElseIf iClick = vbNo Then
Call M_UF5.Schreibe_Protokoll_Stamm
Verzeichnis = "P:\Test HM2030\Auszug\"
Datei = Me.TB_Dateiname_Neu & ".xlsx"
SaveDummy = SpeichernUnter(Verzeichnis & Datei)
If SaveDummy  False Then ActiveWorkbook.SaveAs SaveDummy, xlOpenXMLWorkbook
Range("A1").Select
ActiveWorkbook.Close
Unload Me
ThisWorkbook.Activate
MsgBox "Die Daten wurde Übernommen u. die Datei wurde im jeweiligen Ordner Angelegt.",  _
vbInformation
ElseIf iClick = vbCancel Then
Call M_Allg_Schliessen.WorkBookColse
Unload UF5_Protokoll
MsgBox "Die Instanz wurde geschlossen, Eingabe wurde beendet.", vbInformation
End If
End Sub
Function SpeichernUnter(VorgabeName As String) As Variant
SpeichernUnter = Application.GetSaveAsFilename(InitialFileName:=VorgabeName, _
FileFilter:="Excel Dateien (*.xlsx),*.xls*", FilterIndex:=1, _
Title:="Speichern Unter...", ButtonText:="speichern")
End Function
Gruß Charly
Anzeige
AW: Korrekturen/Anpassungen(gelöst)
26.10.2019 03:35:43
Charly
Soorry ist nicht mehr offen...
Gerne u. Danke für die Rückmeldung. o.w.T.
28.10.2019 12:59:31
Werner
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Workbook öffnen und bearbeiten mit VBA


Schritt-für-Schritt-Anleitung

Um ein Excel-Workbook mit VBA zu öffnen, ohne den Dateinamen direkt anzugeben, kannst du den folgenden VBA-Code verwenden. Dieser Code sucht in einem bestimmten Verzeichnis nach einem Workbook, dessen Name einen bestimmten Suchbegriff enthält:

Sub SucheDatei()
    Dim Dateiname As String, Suchbegriff As String, Pfad As String
    Dim wkbBook As Workbook
    Pfad = "P:\Test Ordner\"
    Suchbegriff = UserForm1.TextBox1  ' Inhalt der TextBox
    Dateiname = Dir(Pfad & "*" & Suchbegriff & "*.xlsx")
    If Dateiname <> "" Then
        Set wkbBook = Workbooks.Open(Pfad & Dateiname)
        MsgBox wkbBook.FullName ' Ausgabe des vollständigen Pfades und Namens
    End If
End Sub

Nachdem das Workbook geöffnet wurde, kannst du es mit einer weiteren Sub-Prozedur bearbeiten:

Sub Schreiben()
    Dim wkbBook As Workbook
    Set wkbBook = ActiveWorkbook
    With wkbBook.Worksheets("Tab1")
        .Range("C3").Value = UserForm1.TextBox3
        .Range("D3").Value = UserForm1.TextBox4
        .Range("E3").Value = UserForm1.TextBox5
        .Range("F3").Value = UserForm1.TextBox6
    End With
End Sub

Häufige Fehler und Lösungen

  1. Laufzeitfehler "9": Index außerhalb des gültigen Bereichs.

    • Dieser Fehler tritt auf, wenn das angegebene Arbeitsblatt nicht existiert. Stelle sicher, dass das Arbeitsblatt "Tab1" im geöffneten Workbook vorhanden ist.
  2. Workbook wird im Hintergrund geöffnet.

    • Wenn du das Workbook im Hintergrund öffnen möchtest, kannst du die Sichtbarkeit mithilfe von Application.Visible = False steuern. Beachte jedoch, dass dies in der Regel nicht empfohlen wird, da du die Benutzeroberfläche nicht mehr siehst.
  3. Fehler beim Schreiben in die Zellen.

    • Überprüfe, ob das Workbook und das Arbeitsblatt korrekt referenziert sind, bevor du versuchst, Werte zuzuweisen.

Alternative Methoden

Eine alternative Methode, um ein Workbook zu öffnen, besteht darin, die Application.Workbooks.Open-Methode zu verwenden. Diese Methode kann ebenfalls verwendet werden, um eine Datei zu öffnen, ohne sie direkt zu benennen.

Sub OpenWorkbookAlternative()
    Dim wkbBook As Workbook
    Set wkbBook = Application.Workbooks.Open("P:\Test Ordner\Dateiname.xlsx")
End Sub

Praktische Beispiele

Hier sind einige praktische Beispiele, die dir helfen, den Code anzupassen:

  1. Workbook schließen ohne Speichern:

    wkbBook.Close False
  2. Workbook speichern unter neuem Namen:

    wkbBook.SaveAs Filename:="P:\NeuerOrdner\NeuerDateiname.xlsx"
  3. Mit einer Public-Variablen arbeiten:

    • Deklariere die Workbook-Variable außerhalb der Prozeduren, um sie in mehreren Sub-Prozeduren verwenden zu können:
      Public wkbBook As Workbook

Tipps für Profis

  • Nutze Option Explicit am Anfang deiner Module, um sicherzustellen, dass alle Variablen deklariert sind. Dies hilft, Fehler frühzeitig zu erkennen.
  • Verwende Error Handling, um unerwartete Fehler beim Öffnen oder Bearbeiten von Workbooks zu vermeiden:
    On Error Resume Next
    Set wkbBook = Workbooks.Open(Pfad & Dateiname)
    If Err.Number <> 0 Then
      MsgBox "Fehler beim Öffnen des Workbooks."
    End If
    On Error GoTo 0
  • Halte deinen Code modular, indem du separate Sub-Prozeduren für das Öffnen, Schreiben und Schließen der Workbooks verwendest.

FAQ: Häufige Fragen

1. Wie kann ich ein Workbook nur zum Lesen öffnen? Du kannst ein Workbook nur zum Lesen öffnen, indem du den Parameter ReadOnly auf True setzt:

Set wkbBook = Workbooks.Open(Pfad & Dateiname, ReadOnly:=True)

2. Was mache ich, wenn ich den Dateinamen nicht kenne? Verwende die Dir-Funktion, um nach dem Namen zu suchen, und öffne das Workbook mit Workbooks.Open, sobald du den richtigen Namen gefunden hast.

3. Wie kann ich sicherstellen, dass ich das richtige Workbook bearbeite? Füge eine MsgBox hinzu, die den vollständigen Dateinamen anzeigt, bevor du mit dem Bearbeiten beginnst, um sicherzustellen, dass du das richtige Workbook geöffnet hast.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige