Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Neuste Datei laden

Forumthread: Neuste Datei laden

Neuste Datei laden
04.03.2021 16:53:46
Jörn
Hallo,
ich habe mit dem VBA Recorder das Laden und Umwandeln einer CSV aufgenommen. Ich möchte dieses Makro gern so abändern, dass immer die neueste Datei genommen wird.
Es wäre toll, wenn mir jemand helfen könnte.
Gruß Jörn
Sub load()
' load Makro
' Tastenkombination: Strg+v
ActiveWorkbook.Queries.Add Name:="20201018-100547", Formula:= _
"let" & Chr(13) & "" & Chr(10) & "    Quelle = Csv.Document(File.Contents(""G:\20201018- _
100547.csv""),[Delimiter="","", Columns=25, Encoding=65001, QuoteStyle=QuoteStyle.None])," & Chr(13) & "" & Chr(10) & "    #""Höher gestufte Header"" = Table.PromoteHeaders(Quelle, [PromoteAllScalars=true])," & Chr(13) & "" & Chr(10) & "    #""Geänderter Typ"" = Table.TransformColumnTypes(#""Höher gestufte Header"",{{""date"", type text}, {""opponent1"", type tex" & _
"t}, {""opponent2"", type text}, {""videoStart"", type number}, {""comment"", type text} _
, {""uniqueID"", type text}, {""shots__lineCallType"", Int64.Type}, {""shots__id"", Int64.Type}, {""shots__in_out"", Int64.Type}, {""shots__review"", Int64.Type}, {""shots__status"", type text}, {""shots__x"", type number}, {""shots__y"", type number}, {""shots__ballSpeed"", type " & _
"number}, {""shots__impactSpeed"", type number}, {""shots__netHeight"", type number}, {" _
"shots__spin"", type number}, {""shots__playingx"", type number}, {""shots__playingy"", type number}, {""shots__receivingx"", type number}, {""shots__receivingy"", type number}, {""shots__shotType"", type text}, {""shots__timestamp"", type number}, {""shots__playingEmail"", type t" & _
"ext}, {""shots__receivingEmail"", type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr( _
13) & "" & Chr(10) & "    #""Geänderter Typ"""
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
"OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=20201018- _
100547;Extended Properties=""""" _
, Destination:=Range("paste!$A$1")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [20201018-100547]")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "_20201018_100547"
.Refresh BackgroundQuery:=False
End With
Sheets("Basic Data").Select
Range("B7").Select
End Sub


Anzeige

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Neuste Datei laden
04.03.2021 18:03:33
Yal
Hallo Jörn,
probiere mal mit Power Query (PQ):
https://www.youtube.com/playlist?list=PLy5TtUB84yrN2VVRzp8Tif8bxQKJD_2bo
Ich weiss nicht, ob für Dich Video 5 oder 7 am relevanteste ist. Nicht falsch ist, alle anzuschauen in der gegebene Reihenfolge. Gut investierte 1 Std.
Es ist ja nichts anderes, was bei deinem Recorder passiert, nur dass ber PQ Du zuerst den Inhalt des Verzeichnis abfragst, dann kannst Du nach Datum sortieren (neueste oben) und dann nur diese eine öffnen. Und das ohne VBA-Code.
VG
Yal

Anzeige
AW: Neuste Datei laden
04.03.2021 19:14:57
Jörn
Hallo Yal,
mit power query hatte ich es schon mit dem Jason file versucht und Stunden investiert, als ich mit Hilfe des Forums eine Lösung gefunden hatte, ist es mir nicht gelungen, diese in mein spreadsheet zu integrieren. Jetzt wandle ich das Jason file erst in ein CSV file um. Hier stimmt dann das Format, nur muss immer das neuste finden.
Gruß
Jörn

Anzeige
AW: Neuste Datei laden
04.03.2021 20:50:42
Yal
Hallo Jörn,
es heisst JSON und steht für Java Script Object Notation. Wir hatten schon die Sache ziemlich weit gebracht. Schade, dass Du nichts damit anfangen könntest. Aber Power Query von 0 auf 100 mit JSON ist nicht unbedingt a piece of cake.
Lasst dich nicht entmutigen. Die grossten Sieg werden nach dem grossten Kämpfe gefeiert.
VG
Yal

Anzeige
AW: Neuste Datei laden
04.03.2021 23:39:11
Tobias
Hallo Jörn,
hiermit ermittelst du die neuste Datei in einem Verzeichnis.

Private Function NeusterDateiname() As String
Dim objFileSystem As Object
Dim objVerzeichnis As Object
Dim objDatei As Object
Dim objDateiNeuste As Object
Dim strDateipfad As String
strDateipfad = "Bitte eingeben"
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
Set objVerzeichnis = objFileSystem.getfolder(strDateipfad)
For Each objDatei In objVerzeichnis.Files
If objDateiNeuste Is Nothing Then
Set objDateiNeuste = objDatei
Else
If FileDateTime(objDatei) > FileDateTime(objDateiNeuste) Then
Set objDateiNeuste = objDatei
End If
End If
Next
NeusterDateiname = objDateiNeuste.Path
Set objFileSystem = Nothing
Set objVerzeichnis = Nothing
Set objDatei = Nothing
Set objDateiNeuste = Nothing
End Function
Jetzt kannst du damit in deiner Sub den Dateinamen dynamisch anpassen:
Quelle = Csv.Document(File.Contents(""//" & NeusterDateiname() & "//"".....

Ohne die // und eventuell musst du da dann nochmal schauen das die " passend sitzen.
Schöne Grüße
Tobias

Anzeige
AW: Neuste Datei laden
05.03.2021 08:45:29
Jörn
Hallo Tobias,
vielen Dank, sieht kompliziert aus. Ich versuche es in mein Sub einzubauen, mal sehen ob es klappt.
Danke.
Gruß
Jörn

AW: Neuste Datei laden
05.03.2021 09:15:12
Jörn
Hallo Tobias,
ich habe versucht, deine Lösung in mein

Sub einzubauen. Aber meine Kenntnisse genügen wohl nicht für die Integration. vielleicht siehst  _
du ja was falsch ist.
Gruß
Jörn

Sub load()
' load Makro
' Tastenkombination: Strg+v
'Private 

Function NeusterDateiname() As String
Dim objFileSystem As Object
Dim objVerzeichnis As Object
Dim objDatei As Object
Dim objDateiNeuste As Object
Dim strDateipfad As String
strDateipfad = "Bitte eingeben"
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
Set objVerzeichnis = objFileSystem.getfolder(strDateipfad)
For Each objDatei In objVerzeichnis.Files
If objDateiNeuste Is Nothing Then
Set objDateiNeuste = objDatei
Else
If FileDateTime(objDatei) > FileDateTime(objDateiNeuste) Then
Set objDateiNeuste = objDatei
End If
End If
Next
NeusterDateiname = objDateiNeuste.Path
Set objFileSystem = Nothing
Set objVerzeichnis = Nothing
Set objDatei = Nothing
Set objDateiNeuste = Nothing
"let" & Chr(13) & "" & Chr(10) & "    Quelle = Csv.Document(File.Contents(""G://"&  _
Neusterdateiname() _
100547.csv""),[Delimiter="","", Columns=25, Encoding=65001, QuoteStyle=QuoteStyle.None])," &  _
Chr(13) & "" & Chr(10) & "    #""Höher gestufte Header"" = Table.PromoteHeaders(Quelle, [PromoteAllScalars=true])," & Chr(13) & "" & Chr(10) & "    #""Geänderter Typ"" = Table.TransformColumnTypes(#""Höher gestufte Header"",{{""date"", type text}, {""opponent1"", type tex" & _
"t}, {""opponent2"", type text}, {""videoStart"", type number}, {""comment"", type text} _
_
, {""uniqueID"", type text}, {""shots__lineCallType"", Int64.Type}, {""shots__id"", Int64.Type}, _
{""shots__in_out"", Int64.Type}, {""shots__review"", Int64.Type}, {""shots__status"", type text}, {""shots__x"", type number}, {""shots__y"", type number}, {""shots__ballSpeed"", type " & _
"number}, {""shots__impactSpeed"", type number}, {""shots__netHeight"", type number}, {" _
_
"shots__spin"", type number}, {""shots__playingx"", type number}, {""shots__playingy"", type  _
number}, {""shots__receivingx"", type number}, {""shots__receivingy"", type number}, {""shots__shotType"", type text}, {""shots__timestamp"", type number}, {""shots__playingEmail"", type t" & _
"ext}, {""shots__receivingEmail"", type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr(  _
_
13) & "" & Chr(10) & "    #""Geänderter Typ"""
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
"OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=20201018- _
100547;Extended Properties=""""" _
, Destination:=Range("paste!$A$1")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [20201018-100547]")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "_20201018_100547"
.Refresh BackgroundQuery:=False
End With
Sheets("Basic Data").Select
Range("B7").Select
End Sub


Anzeige
AW: Neuste Datei laden
05.03.2021 12:56:29
Tobias
Hallo Jörn,
eine Funktion ist ein für sich stehender Befehl der dann aus anderen Quellen aufgerufen werden kann.
Folglich muss dein Code entsprechend geändert werden:

sub load()
end sub
private function NeusterDateiname() as String
end function

Dann musst du in der function den strDateipfad entsprechend des Ortes deiner Dateien abändern

strDateipfad = "G:\"

und in deiner Sub dann den Verweis auf die aktuellste Dateiändern
Quelle = Csv.Document(File.Contents(""" & Neusterdateiname() & """),[Delimiter ....
Schöne Grüße
Tobias

Anzeige
AW: Neuste Datei laden
05.03.2021 16:49:35
Jörn
Hallo Tobias,
erstmal vielen Dank, und sorry für meine Unerfahrenheit!
Es sieht jetzt schon besser aus, aber in der Übergang von deinem zu meinem Sub nach =nothing ist noch rot.
Gruß
Jörn
Set objDateiNeuste = Nothing
"let" & Chr(13) & "" & Chr(10) & " Quelle = Csv.Document(File.Contents(""" & Neusterdateiname() & """),
[Delimiter="","", Columns=25, Encoding=65001, QuoteStyle=QuoteStyle.None])," & Chr(13) & "" & Chr(10) & " #""Höher gestufte Header"" = Table.PromoteHeaders(Quelle,

Anzeige
AW: Neuste Datei laden
08.03.2021 21:50:39
Tobias
Hallo Jörn,
nach Set objDateiNeuste = Nothing muss definitiv end function stehen, und dann deine ursprüngliche Sub load() nur mit der Änderung mit NeusterDateiname(), sonst musst du nochmal genauer den Code und die Fehlermeldung angeben die du jetzt gerade hast.
Schöne Grüße
Tobias

Anzeige
AW: Neuste Datei laden
06.03.2021 11:04:59
Jörn
sorry hatte das Kontrollkästchen nicht aktiviert

AW: Neuste Datei laden
08.03.2021 23:30:37
Yal
Hi Jörn,
ich habe für ein anderen Fall etwas aufgestellt, was dir auch hilflich sein kann.
Siehe https://www.herber.de/forum/archiv/1816to1820/t1818102.htm#1818462
Aus einem Verzeichnis die neueste csv-Datei öffnen. Zwei einfache PQ. Die zweite für den csv müsstest Du noch zu deinem Thema anpassen. Wahrscheinlich in Kombi mit andern Tipps aus dem Thread.
VG
Yal

Anzeige
AW: Neuste Datei laden
09.03.2021 10:14:09
Jörn
Hallo Yal, hallo Tobias,
vielen Dank,
ich habe jetzt meinen Sohn aktiviert, der will jetzt mal sein Glück damit versuchen. Ich gehe davon aus, dass er es schafft und aktiviere das Kontrollkästchen nicht.
Yal, ich leite ihm auch noch einmal deine Lösung mit PQ weiter, vielleicht bekommen es ja son&friends hin.
Herzlichen Dank nochmals für euere Hilfe.
Gruß
Jörn

Anzeige
AW: Neuste Datei laden
05.03.2021 08:43:29
Jörn
Hallo Yal,
ja, es ist wirklich schade, aber ich bin damit überfordert deine gute Lösung bei mir einzubauen.
Nochmals vielen Dank
Gruß
Jörn
;
Anzeige

Infobox / Tutorial

Neuste Datei in Excel laden und verarbeiten


Schritt-für-Schritt-Anleitung

Um die neueste Datei in einem Verzeichnis zu laden und zu verarbeiten, kannst du die folgenden Schritte ausführen:

  1. Erstelle ein neues VBA-Modul:

    • Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
    • Klicke im Menü auf Einfügen und dann auf Modul.
  2. Füge den Code zur Ermittlung der neuesten Datei hinzu:

    • Kopiere den folgenden Code in das neue Modul:
    Private Function NeusterDateiname() As String
       Dim objFileSystem As Object
       Dim objVerzeichnis As Object
       Dim objDatei As Object
       Dim objDateiNeuste As Object
       Dim strDateipfad As String
       strDateipfad = "G:\DeinVerzeichnis\" ' Bitte den Pfad anpassen
       Set objFileSystem = CreateObject("Scripting.FileSystemObject")
       Set objVerzeichnis = objFileSystem.getfolder(strDateipfad)
       For Each objDatei In objVerzeichnis.Files
           If objDateiNeuste Is Nothing Then
               Set objDateiNeuste = objDatei
           Else
               If FileDateTime(objDatei) > FileDateTime(objDateiNeuste) Then
                   Set objDateiNeuste = objDatei
               End If
           End If
       Next
       NeusterDateiname = objDateiNeuste.Path
       Set objFileSystem = Nothing
       Set objVerzeichnis = Nothing
       Set objDatei = Nothing
       Set objDateiNeuste = Nothing
    End Function
  3. Integriere die Funktion in dein Hauptmakro:

    • Ersetze den Code in deinem Hauptmakro load mit folgendem:
    Sub load()
       Dim datei As String
       datei = NeusterDateiname()
       ' Der Rest deines Codes hier...
       Quelle = Csv.Document(File.Contents(datei),[Delimiter=",", Columns=25, Encoding=65001, QuoteStyle=QuoteStyle.None])
       ' Weitere Verarbeitung hier...
    End Sub
  4. Führe das Makro aus:

    • Schließe den VBA-Editor und gehe zurück zu Excel.
    • Drücke ALT + F8, wähle load aus und klicke auf Ausführen.

Häufige Fehler und Lösungen

  • Fehler: "Dateipfad nicht gefunden"

    • Überprüfe, ob der angegebene Dateipfad korrekt ist und ob du Zugriff auf das Verzeichnis hast.
  • Fehler: "Kompatibilitätsprobleme"

    • Stelle sicher, dass du eine unterstützte Excel-Version verwendest, die VBA und die benötigten Funktionen unterstützt.
  • Fehler: "Variable nicht definiert"

    • Achte darauf, dass alle Variablen korrekt deklariert sind und dass du keine Tippfehler hast.

Alternative Methoden

  1. Power Query verwenden:

    • Nutze Power Query, um den Inhalt eines Verzeichnisses abzufragen und die neueste Datei nach Datum zu sortieren. Dies kann ohne VBA gemacht werden und ist eine benutzerfreundliche Methode.
  2. Manuelles Laden der Datei:

    • Du kannst auch manuell die neueste CSV-Datei auswählen, wenn du kein Makro verwenden möchtest. Dies ist jedoch weniger automatisiert.

Praktische Beispiele

Hier ist ein einfaches Beispiel eines Makros, das die neueste CSV-Datei lädt und verarbeitet:

Sub load()
    Dim datei As String
    datei = NeusterDateiname()

    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
    "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=" & datei & ";Extended Properties=""""" _
    , Destination:=Range("A1")).QueryTable
        .CommandType = xlCmdSql
        .CommandText = Array("SELECT * FROM [" & Dir(datei) & "]")
        .Refresh BackgroundQuery:=False
    End With
End Sub

Tipps für Profis

  • Verwendung von Variablen: Verwende klare und prägnante Variablennamen, um den Code lesbarer zu machen.
  • Code-Kommentare: Kommentiere deinen Code, um die Funktionsweise für andere (oder dich selbst in der Zukunft) verständlicher zu machen.
  • Fehlerbehandlung: Implementiere Fehlerbehandlungsroutinen, um potenzielle Probleme zu erkennen und zu lösen.

FAQ: Häufige Fragen

1. Wie kann ich den Dateipfad für die Funktion anpassen?
Du kannst den Dateipfad in der Zeile strDateipfad = "G:\DeinVerzeichnis\" ändern, um auf das gewünschte Verzeichnis zu verweisen.

2. Was ist der Unterschied zwischen VBA und Power Query?
VBA ist eine Programmiersprache, die dir erlaubt, benutzerdefinierte Makros zu erstellen, während Power Query eine benutzerfreundliche Oberfläche bietet, um Daten zu importieren und zu transformieren, ohne dass du programmieren musst.

3. Kann ich auch andere Dateiformate laden?
Ja, du kannst die Funktion anpassen, um auch andere Formate wie Excel-Dateien (.xlsx) oder Textdateien zu laden, indem du die entsprechenden Importmethoden verwendest.

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