Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema CommandButton
BildScreenshot zu CommandButton CommandButton-Seite mit Beispielarbeitsmappe aufrufen

Platzhalter fuer Dateiname

Betrifft: Platzhalter fuer Dateiname von: Dirk N.
Geschrieben am: 19.08.2008 16:21:08

Hallo an alle Tüftler,

ich recherchierte schon stundenlang im Archiv nach diesem Betreff - wurde aber nicht so recht fündig.

Ich möchte Daten aus einer csv-Datei in eine xl-Mappe importieren - der Haken ist allerdings, daß der Name der csv-Datei ständig wechselt.
Aus der Bezeichnung "Abc_123456789_080801_080817.csv" sind stets nur die Zeichen bis zum 2. Unterstrich konstant u. es ist die einzige csv, die sich im selben Ordner wie die xls befindet...

Notdürftig habe ich mir zunächst mit dem Archiv-Code für die jüngste csv-Datei beholfen u. bis dahin ist alles auch flexibel.
Allerdings stosse ich sehr schnell an meine Grenzen, wenn es darum geht:
-- Auch der 3. Code soll flexibel gestaltet werden.
-- Der 2. Code funzt zwar perfekt - ich habe ihn nur beigefügt, damit ihr seht, wie ich zu dem Dateinamen komme - den ich auch in A1 in der xls eintrage (s. Mitte des 2. Codes).
-- Richtig knifflig wird das Ganze dann im 3. Code.
Eigentlich wollte ich diesen Zellinhalt von A1, dann später auch im 3. Code benutzen u. am Ende auch wieder im 1. Code (nach dem 2. CALL) zum Schliessen der csv...

Ich suche also nach einer Möglichkeit, sich auf diese Zelle A1 zu beziehen (dort steht der volle csv-Name) oder. mittels Platzhaltern ( "Abc_123456789_*.csv") die Makros flexibel zu halten.
(So könnte das 2. Makro evtl. größtenteils überflüssig werden...)

VB-Code:
Private Sub CommandButton1_Click()  'csv-Import
    'Dim DateiName As String
    Dim Auswahl As Range
    Application.ScreenUpdating = False

    Call juengste_Datei          '****hier wird der csv-Dateiname ermittelt

    If [A1] = "" Then Exit Sub
    [a2].Activate
    [a2].PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False

    Call format_Tableau     '****auch hier wird der csv-Dateiname benötigt
    '****jetzt soll die csv-Datei geschlossen werden (meine vergebl. Versuche)
    'Set DateiName.Value = [a1]
    'Workbooks("DateiName").Close
    Application.ScreenUpdating = True
    Set Auswahl = Nothing
End Sub

Code eingefügt mit Syntaxhighlighter 4.15


VB-Code:
Sub juengste_Datei()    'steht in einem Modul
    Dim Datei, JuengsteDatei, Pfad As String, _
        DateiDatum As Date, Abfrage
    Pfad = ThisWorkbook.Path & "\"
    Datei = Dir(Pfad & "*.csv", vbNormal)
    Do
        If FileDateTime(Pfad & Datei) > DateiDatum Then
            DateiDatum = FileDateTime(Pfad & Datei)
            JuengsteDatei = Datei
        End If
        Datei = Dir
    Loop Until Datei = ""
    Abfrage = MsgBox("Die jüngste Datei heißt '" & JuengsteDatei & "'" & vbCr & "und ist vom " & _
        DateiDatum & vbCr & vbCr & "Diese Angaben in A1 eintragen u. die CSV öffnen ?", vbOKCancel)
    If Abfrage = vbOK Then [A1].Value = (JuengsteDatei)
    If Abfrage = vbOK Then Workbooks.Open (Pfad & JuengsteDatei)  'öffnet die jüngste csv-Datei
    If Abfrage = vbCancel Then [A1].ClearContents
    If Abfrage = vbCancel Then Exit Sub

    [a2:q50].Select
    Set Auswahl = Selection
    Auswahl.Copy
    '    ActiveWorkbook.Close   'hier darf die csv aber noch nicht geschlossen werden
    Workbooks("Test-3.xls").Activate
    Worksheets("csv-Import").Activate
End Sub

Code eingefügt mit Syntaxhighlighter 4.15


VB-Code:
Sub format_Tableau()    'steht in gleichen Modul
    Range("A2").Select
    '******wie wäre hier die Syntax mit Platzhaltern ???
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;D:\1\1 Baustellen\csv-Import\Abc_123456789_080801_080817.csv", _
        Destination:=Range("A2"))
    .Name = "Abc_123456789_080801_080817"
    .FieldNames = True
    ...
    ...
    End With
    ...
    ...
    Range("A1").Select
End Sub

Code eingefügt mit Syntaxhighlighter 4.15


Ich hoffe, das Problem verständlich geschildert zu haben und ihr könnt mir helfen.

MfG Dirk

  

Betrifft: AW: Platzhalter fuer Dateiname von: Daniel
Geschrieben am: 19.08.2008 16:27:32

Hi

so sollte es eigentlich funktionieren, wenn der korrekte Dateiname incl. ".csv" in Zelle A1 steht:

With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;D:\1\1 Baustellen\csv-Import\" & Range("A1").Value, _
        Destination:=Range("A2"))



für .Name dann entsprechend:
.Name = Left$(Range("A1").value, Len(Range("A1").Value)-4)

Gruß, Daniel


  

Betrifft: AW: Platzhalter fuer Dateiname von: Rudi Maintaire
Geschrieben am: 19.08.2008 16:29:26

Hallo,
wenn es die einzige .csv im Ordner ist:
strDateiName=Thisworkbook.path &"\" &dir(Thisworkbook.path &"\" &".csv")

Gruß
Rudi


  

Betrifft: AW: Platzhalter fuer Dateiname von: Dirk N.
Geschrieben am: 19.08.2008 18:02:19

Hallo Daniel, hallo Rudi,

so schnell, wie ihr das löst kann ich das noch nicht mal einarbeiten - RESPEKT und vielen Dank...

@Daniel
Ich habe deinen Vorschlag 1:1 in den 3. Code übernommen u. es funktioniert perfekt !

@Rudi
Deine Variante ist mit Sicherheit auch total richtig, aber ich bin zu blöd, das umzusetzen:
Im Kopf des 1. Codes ergänzte ich die Deklaration

Dim strDateiname As String
und im unteren Bereich dann
strDateiname = ThisWorkbook.Path & "\" & Dir(ThisWorkbook.Path & "\" & ".csv")
Workbooks(strDateiname).Close

Es erscheint die Fehlermeldung: Laufzeitfehler 9 - Index außerhalb des gültigen Bereichs
u. der Debugger springt auf die letzte Codezeile (mit dem CLOSE).
Gehe ich mit dem Cursor dann "darüber", erscheint in einem kl. Fenster:
strDateiname = D:\1\1 Baustellen\csv-Import\ - aber es fehlt noch der Dateiname der csv...

Was mache ich falsch ? Ich stehe total auf der Leitung... :-(

Gruß Dirk


  

Betrifft: AW: Platzhalter fuer Dateiname von: Dirk N.
Geschrieben am: 19.08.2008 18:41:22

Hallo nochmal,

ich habe es in Anlehnung an Daniel's Tipp nun so gelöst:

im 1. Code einfach nur:
Workbooks(Range("A1").Value).Close

u. es funzt einwandfrei...

Zwar hatte ich gehofft, den 2. Code wesentlich kürzen zu können - warum Suchen nach der jüngsten csv, wenn es doch nur eine gibt... - aber Hauptsache ist, daß alles erstmal soweit funktioniert.

Also: Ich danke euch beiden u. wünsche noch einen schönen Abend.

MfG Dirk


 

Beiträge aus den Excel-Beispielen zum Thema "Platzhalter fuer Dateiname"