Mehrere TXT Dateien in eine Excel importieren auf Knopfdruck

Ausgangslage:

  1. Import.xlsx

  2. Test1.txt

    Test100.txt --> In jeder TXT steht Fließtext

  3. Pfad wo das Ganze liegt lautet:
    C:User\Boss\Desktop\Eigene Dateien\Tester

  4. Ordner Name
    Tester

Ich habe eine Excel Datei (Import.xlsx) mit zwei Spalten --> Ablagenummer und Beschreibung.Ich will zwei Button haben. Ein Button soll DURCHSUCHEN heißen. Wenn ich den betätige kann ich mir alle .TXT Dateien auswählen. Dann habe ich einen Button IMPORTIEREN. Wenn ich den betätige, soll das Skript den Namen der jeweiligen TXT Datei in die Ablagenummer eintragen (ohne Suffix) und den Inhalt der jeweiligen TXT Datei in Beschreibung. Und das Ganze halt für alle TXT Dateien untereinander je Zeile.Es wäre megageil wenn mir jemand das GANZ konkret wie ich es brauche angeben könnte. Ich blicke das Ganze nämlich nicht gut durch.

Hallo Gruß- und Namenloser,
da ich gerade etwas Zeit habe, versuche ich mich mal an der Aufgabe, auch wenn sie recht ungenau formuliert ist. Ich mutmaße einfach mal einiges:

Ausgangslage:

  1. Import.xlsx

Du hast eine Excel-Datei Import.xlsx

  1. Test1.txt

    Test100.txt --> In jeder TXT steht Fließtext

Du hast 100 oder mehr Textdateien, in denen steht Text. Unter „Fließtext“ verstehe ich jetzt mal, dass da keine Zeilenumbrüche drin sind.

  1. Pfad wo das Ganze liegt lautet:
    C:User\Boss\Desktop\Eigene Dateien\Tester

OK

  1. Ordner Name
    Tester

Ja, hast du ja schon geschrieben.

Ich habe eine Excel Datei (Import.xlsx) mit zwei Spalten
–> Ablagenummer und Beschreibung.

Welche Spalten sind das?

Ich will zwei Button
haben. Ein Button soll DURCHSUCHEN heißen. Wenn ich den
betätige kann ich mir alle .TXT Dateien auswählen. Dann habe
ich einen Button IMPORTIEREN.

Wie wärs mit nur einem Button? Damit könntest du die Dateien auswählen, und dann werden die ausgewählten importiert.

Wenn ich den betätige, soll das
Skript den Namen der jeweiligen TXT Datei in die Ablagenummer
eintragen (ohne Suffix)

also den Dateinamen ohne .txt in eine Spalte

und den Inhalt der jeweiligen TXT
Datei in Beschreibung. Und das Ganze halt für alle TXT Dateien
untereinander je Zeile.Es wäre megageil wenn mir jemand das
GANZ konkret wie ich es brauche angeben könnte. Ich blicke das
Ganze nämlich nicht gut durch.

Na, dann verscuchen wirs mal. Wenn du „das Ganze nämlich nicht gut durch“-blickst, geh ich mal davon aus, dass du dich mit VBA nicht gut auskennst. Also machen wir eine Schtitt-für-Schritt Anleitung.

  1. Öffne deine Datei Import.xlsx

  2. Klicke mit der rechten Maustaste auf irgend einen Blattreiter und dann auf „Code anzeigen“. Der VBA-Editor geht auf.

  3. In der Menüleiste klickst du auf „Einfügen“ und dann auf „Modul“.

  4. In das große Fenster rechts kopierst du jetzt den folgenden Code rein:

    Sub txtEinlesen()
    Dim datei As String
    Dim pfad As Variant
    Dim zei As Long
    Dim beschreibung As String

    Const aSpalte As String = „A“ ’ Hier die Spalte für die Ablagenummer festlegen
    Const bSpalte As String = „B“ ’ Hier die Spalte für die Beschreibung festlegen
    Const ersteZeile As Long = 1 ’ Hier die Zeile festlegen, ab der die Einträge erfolgen sollen

    ChDir „C:\User\Boss\Desktop\Eigene Dateien\Tester“
    With Application.FileDialog(msoFileDialogFilePicker)
    .AllowMultiSelect = True
    .Filters.Add „Text-Dateien“, „*.txt“
    .InitialView = msoFileDialogViewDetails
    .Title = „Wählen Sie eine oder mehrere TXT-Dateien aus“
    If .Show -1 Then Exit Sub
    zei = ersteZeile
    For Each pfad In .SelectedItems
    datei = dateiName(pfad)
    Range(aSpalte & zei) = datei
    beschreibung = komplettEinlesen(pfad)
    Range(bSpalte & zei) = beschreibung
    zei = zei + 1
    Next pfad

    End With
    End Sub

    Function dateiName(pfad As Variant) As String
    Dim pfadFeld As Variant

    pfadFeld = Split(pfad, „“)
    dateiName = Left(pfadFeld(UBound(pfadFeld)), Len(pfadFeld(UBound(pfadFeld))) - 4)
    End Function

    Function komplettEinlesen(pfad As Variant) As String
    Dim flen As Long
    Dim fnum As Integer

    flen = FileLen(pfad)
    fnum = FreeFile
    Open pfad For Input As #fnum
    komplettEinlesen = Input(flen, #fnum)
    Close #fnum
    End Function

Achtung: Bei Kopieren von W-W-W Seiten wird am Ende immer irgend ein Stuss angehängt, der im Originaltext nicht drin steht. Der Code muss mit dem letzten

End Function

enden. Wenn noch was dahinter steht, lösch es weg.

  1. In den drei Zeilen oben, die mit

    Const

anfangen musst du die Spalten und Zeilen auswählen, in die die Daten importiert werden sollen. Ich habe die Spalten A und B und Zeile 1 vorgegeben. Bitte nach deinen Wünschen ändern.

  1. Jetzt kannst du den VBA-Editor schließen.

  2. Damit der Makro funktioniert, musst du deine Excel-Datei als .xlsm Datei speichern.

  3. Wähle das Tabellenblatt aus, in das die Einträge rein sollen.

  4. Jetzt machen wir uns den Button: Wenn in deinen Ribbons die „Entwicklertools“ nicht sichbar sind, musst du sie anzeigen lassen: Rechtsklick in einen leeren Bereich eines Ribbons und „Menüband anpassen“.
    Im rechten Fenster den Haken von den „Entwicklertools“ setzen und OK.

10.Auf die „Entwicklertools“ klicken und dort auf „Einfügen“, dann aus den „Formularsteuerelementen“ die „Schaltfläche“ (links oben) auswählen.
In die Tabelle klicken, dort wo der Button hin soll.

  1. Ein Fenster „Makro zuweisen“ geht auf. Dort auf „txtEinlesen“ klicken und OK.
    Der Button erscheint.

12.Rechtsklck auf den Button und „Text bearbeiten“. Jetzt kannst du die Beschriftung des Buttons ändern.

  1. Irgendwo außerhalb des Buttons klicken. Jetzt ist er aktiviert.

  2. Wenn du jetzt auf den Button klickst, sollte der Makro laufen. Das Verzeichnisfenster geht auf. Du Kannst (mit Strg oder Hochstelltaste) alle Dateien auswählen, die importiert werden sollen.

  3. Mit klick auf „Öffnen“. Werden nacheinander alle gewählten Dateien „abgearbeitet“:
    Der Dateiname wird in die Spalte A (oder was du im Code festgelegt hast) geschrieben, ab der Zeile, die du im Code festgelegt hast.
    Der komplette Inhalt der Datei wird in die Spalte B (oder was du im Code festgelegt hast) geschrieben.

Ich habe vorausgesetzt, dass in den Dateien wirklich nur anzeigbarer Text steht und nicht igendwelche „bösen“ Steuerzeichen. Sonst könnte des Probleme geben.

Probier’s mal aus und gib ein Feedback.

Und schreib das nächste Mal einen Gruß!

Gruß, Andreas

Hi Andreas,
du bist mein absoluter Held. Danke vielmals an dich und den anderen hier.
Das Ding klappt super.

Und sorry wegen meinem spärlichen Text. Ich dachte ich kann nur 80 Zeichen oder so eingeben und hab mich kurzgehalten. Sorry.

Dürfte ich dir noch eine Frage stellen ?

  1. der Fließtext den ich reinlade aus den TXT Dateien hat sehr oft Sonderzeichen oder Umlaute, die werden dann ganz komisch dargestellt. Wie kann ich das verhindern ?

Danke nochmals an Alle die sich die Zeit genommen das durchzulesen, und vor allem Andreas … du bist mein Held :smile:

Hallo immer noch Namenloser,

Gemach, Heldentum ist nicht mein Ding. Aber schön, dass es funktioniert.
Das mit den Umlauten ist komisch. Ich hatte es mit ä ö ü und ß getestet. Ging einwandfrei.
Kannst du mal so eine txt-Datei mit Sonderzeichen hochladen, z.B. hier:
http://www.file-upload.net/
Oder ist das zu geheim?
Ich schau sie mir dann heute Abend mal an. Ich vermute, es hängt mit der Codierung der Datei (ASCII, ANSI) zusammen.

Gruß, Andreas

Zum gewissen Teil schon. Hab die Datei hochgeladen und bissle inhaltlich frisiert …
http://www.file-upload.net/download-8339333/testerxx…
Mein Name ist Levent. Steht das nicht bei Erfasser ?

Hallo Levent,

deine Datei ist im UTF-8 Format. Excel will aber ANSI.
ich habe meinen code jetzt ein bisschen mit Sachen aufgemotzt, die ich bei activevb.de geklaut habe. Versuchs hal damit:

Option Explicit

Private Declare Function MultiByteToWideChar Lib "kernel32.dll" ( \_
 ByVal CodePage As Long, \_
 ByVal dwFlags As Long, \_
 ByVal lpMultiByteStr As Long, \_
 ByVal cbMultiByte As Long, \_
 ByVal lpWideCharStr As Long, \_
 ByVal cchWideChar As Long) As Long

Const CP\_UTF8 As Long = 65001
Sub txtEinlesen()
 Dim datei As String
 Dim pfad As Variant
 Dim zei As Long
 Dim beschreibung As String

 Const aSpalte As String = "A" ' Hier die Spalte für die Ablagenummer festlegen
 Const bSpalte As String = "B" ' Hier die Spalte für die Beschreibung festlegen
 Const ersteZeile As Long = 1 ' Hier die Zeile festlegen, ab der die Einträge erfolgen sollen

 ChDir "C:\User\Boss\Desktop\Eigene Dateien\Tester .. mehr auf http://w-w-w.ms/a4enb2" ' Diesen Pfad evtl. berichtigen
 With Application.FileDialog(msoFileDialogFilePicker)
 .AllowMultiSelect = True
 .Filters.Add "Text-Dateien", "\*.txt"
 .InitialView = msoFileDialogViewDetails
 .Title = "Wählen Sie eine oder mehrere TXT-Dateien aus"
 If .Show -1 Then Exit Sub
 zei = ersteZeile
 For Each pfad In .SelectedItems
 datei = dateiName(pfad)
 Range(aSpalte & zei) = datei
 beschreibung = komplettEinlesen(pfad)
 Range(bSpalte & zei) = beschreibung
 zei = zei + 1
 Next pfad

 End With
End Sub

Function dateiName(pfad As Variant) As String
 Dim pfadFeld As Variant

 pfadFeld = Split(pfad, "\")
 dateiName = Left(pfadFeld(UBound(pfadFeld)), Len(pfadFeld(UBound(pfadFeld))) - 4)
End Function

Function komplettEinlesen(pfad As Variant) As String
 Dim fnum As Integer
 Dim buffer() As Byte

 fnum = FreeFile
 Open pfad For Binary Access Read As #fnum
 ReDim buffer(0 To LOF(fnum) - 1)
 Get #fnum, , buffer
 Close #fnum
 komplettEinlesen = ConvertFromUTF8(buffer)
End Function

Function ConvertFromUTF8(ByRef Source() As Byte) As String
 Dim Size As Long
 Dim Pointer As Long
 Dim Length As Long
 Dim buffer As String

 Size = UBound(Source) - LBound(Source) + 1
 Pointer = VarPtr(Source(LBound(Source)))
 Length = MultiByteToWideChar(CP\_UTF8, 0, Pointer, Size, 0, 0)
 buffer = Space$(Length)
 MultiByteToWideChar CP\_UTF8, 0, Pointer, Size, StrPtr(buffer), Length
 ConvertFromUTF8 = buffer

End Function

Gruß, Andreas

http://www.file-upload.net/download-8339333/testerxx…

Mein Name ist Levent. Steht das nicht bei Erfasser ?

Hallo Levent,

dadrum geht es nicht, es geht um Forumshöflichkeit in deinen Beiträgen. Es ist von Mensch zu Mensch netter wenn du in etwa diese Beitragsform wählst:

http://www.kmbuss.de/Excel-CD/Pics/OH_Forumsbeitrag.gif

Gruß
Reinhard

Hallo Andreas
Hallo Reinhard,

danke für eure Unterstützung. Jetzt läuft alles. Ihr seit super !

MfG Levent