Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1508to1512
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Dateien alphabetisch in Excel-Datei kopieren

Dateien alphabetisch in Excel-Datei kopieren
23.08.2016 12:51:35
Bonduca
Hallo,
ich habe folgenden Code:
Mit einem vordefinierten Pfad (strPfad) wird in eine Ordnerstruktur gegangen und alle csv-Dateien (Anzahl=AnzDateien)daraus in meine Excel Datei kopiert.
Ich habe den Abschnitt des Codes der das macht mit '*** gekennzeichnet.
Ich möchte, dass die Dateien der Reihe nach (also alphabetisch) kopiert werden. Im Moment scheint es mir zufällig zu sein.
Über Hilfe wäre ich äußerst dankbar!!!!
Option Explicit
Sub Daten_einlesen2(strPfad As String, AnzDateien As Integer)
Dim strDatnam As String
Dim wb As Workbook
Dim wks As Worksheet
Dim rngEinfüg As Range
Dim I As Integer
Dim j As Integer
Dim FirstBook As Object
Dim x As String
Dim y As String
Dim z As String
Dim zz As String
Dim objOrdner As Object
'Dim AnzDateien As Long
Dim objFSO As Object
Dim Name As String
Dim strSuchMuster As String
Application.DisplayAlerts = False
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
End With
Name = ActiveWorkbook.Name
For Each wks In ThisWorkbook.Sheets
If InStr(VBA.UCase(wks.Name), "GST") > 0 Then wks.Delete
Next
'******* ab hier
j = 0
strDatnam = Dir(strPfad & Application.PathSeparator & "*.csv")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objOrdner = objFSO.GetFolder(strPfad)
Set objOrdner = objFSO.GetFolder(strPfad)
For I = 1 To AnzDateien
Do While Len(strDatnam)
j = j + 1
Set wb = Workbooks.Open(strPfad & "\" & strDatnam)
Set FirstBook = ActiveWorkbook
x = ActiveSheet.Name
zz = ActiveWorkbook.Name
With ThisWorkbook
Workbooks(Name).Activate
y = ActiveSheet.Name
'ActiveWorkbook.Worksheets.Copy After:=.Worksheets(.Worksheets.Count)
Sheets.Add AFTER:=Sheets(Sheets.Count)
ActiveSheet.Name = "GST" & j
z = ActiveSheet.Name
Workbooks(zz).Worksheets(x).Range("A1:Z500").Copy Destination:=Workbooks(Name).Worksheets( _
z).Range("A1:Z500")
End With
wb.Close savechanges:=False
strDatnam = Dir
Loop
Next I
'***** bis hier
Set rngEinfüg = Nothing
Set wb = Nothing
Daten_trennen (AnzDateien)
Call Datum_eintragen
Call Datum_vergleichen
With Application
.ScreenUpdating = False
.Calculation = xlCalculationAutomatic
.EnableEvents = True
End With
Sheets("Daten").Activate
End Sub

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dateien alphabetisch in Excel-Datei kopieren
23.08.2016 13:25:21
Rudi
Hallo,
einzige Lösung:
Alle Dateinamen in ein Array einlesen, das Array sortieren (z.B. Quicksort) und dann abarbeiten.
Gruß
Rudi
Quicksort Alphabetisch
23.08.2016 16:18:28
Bonduca
Danke! Ich habe mir jetzt einen Quicksort Algorithmus angesehen. Das funktioniert aber nur für Zahlen:
Private Sub QuickSort( _
ByRef myarray As Variant, _
ByVal Low As Long, _
ByVal High As Long)
Dim vPartition As Variant, vTemp As Variant
Dim i As Long, j As Long
If Low > High Then Exit Sub  ' Rekursions-Abbruchbedingung
' Ermittlung des Mittenelements zur Aufteilung in zwei Teilfelder:
vPartition = myarray((Low + High) \ 2)
' Indizes i und j initial auf die äußeren Grenzen des Feldes setzen:
i = Low: j = High
Do
' Von links nach rechts das linke Teilfeld durchsuchen:
Do While myarray(i)  vPartition
j = j - 1
Loop
If i  j  ' Überschneidung der Indizes
' Rekursive Sortierung der ausgewählten Teilfelder. Um die
' Rekursionstiefe zu optimieren, wird (sofern die Teilfelder
' nicht identisch groß sind) zuerst das kleinere
' Teilfeld rekursiv sortiert.
If (j - Low) 
Kann man das so umstellen, dass nach Alphabet sortiert wird?
In Google habe ich nichts passendes gefunden...
Anzeige
AW: Quicksort Alphabetisch
23.08.2016 17:08:51
Daniel
Hi
bei Basiskenntnissen ist es wahrscheinlich einfacher, das Array mit den Dateinamen in ein Excelblatt zu schreiben, dort zu sortieren und dann die sortierten Werte wieder ins Array einzulesen.
gruß Daniel
Das würde am einfachsten...
24.08.2016 09:46:46
Case
Hallo, :-)
... über "Shell" per VBA mit wenigen Codezeilen gehen. Dann brauchst Du kein "QuickSort" und musst auch nichts in ein Tabellenblatt schreiben. ;-)
Brauchst Du ein Beispiel?
Servus
Case

AW: Das würde am einfachsten...
24.08.2016 13:38:56
Helmut
Hallo Case,
bin auch an einem Beispiel interessiert :-)
Gruß Helmut
Anzeige
Ja, bitte ein Beispiel posten :-) owT Gruß
24.08.2016 19:33:57
Helmut
Hier das Beispiel mit Erklärung... :-)
24.08.2016 23:19:44
Case
Hallo Helmut, :-)
... dazu hole ich etwas aus: ;-)
Aus 2011. Mit "("WScript.Shell").Exec" kannst Du über die DOS-Eingabeaufforderung "CMD" und "StdOut.ReadAll" auf den Output zugreifen. Über "Split - vbCrLf" bildest Du das Array. Also sowas:
Option Explicit
Public Sub Main()
Dim strAll() As String
Dim lngTMP As Long
strAll = Split(CreateObject("Wscript.Shell").exec _
("cmd /C Dir ""C:\Temp\*.*"" /B/A-D/ON").stdout.readall, vbCrLf)
For lngTMP = LBound(strAll) To UBound(strAll) - 1
Debug.Print strAll(lngTMP) ' Nur zum testen drin!!!
' Hier dein Code zum Daten einlesen - fertig. :-)
Next lngTMP
End Sub
Schau dir die Parameter von "DIR" an, oder probiere das mal aus, aus 2013.
/B -> Einfaches Format (Keine Kopfdaten, keine Zusammenfassung)
/A-D -> Dateien auflisten, aber ohne Verzeichnisse
/ON -> Sortiere die Ausgabe nach Namen
Schau dir die Ausgabe einfach mal mit verschiedenen Parametern an. ;-)
Nun ist es so, dass bei dieser Art "("Wscript.Shell").exec" der Ausführung kurz ein Terminalfenster aufpoppt. Dies lässt sich mit ein paar Tricks unterbinden. Einfacher ist aber dann auf "("WScript.Shell").run" auszuweichen.
Da tritt aber das Problem auf, dass ich nicht direkt auf den Output zugreifen kann. Dies kann man umgehen indem es in eine Textdatei umgeleitet wird, oder man nimmt die Zwischenablage mit "| pipe" - wie z. B. hier.
Du musst also immer nur die Parameter anpassen.
So lassen sich einfach über den zusätzlichen Parameter "/S" alle Dateien inklusive der Unterverzeichnisse auflisten.
Servus
Case

Anzeige
Danke, muss ich erst mal verdauen... ;-) Gruß
25.08.2016 08:38:05
Helmut

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige