TXT-Datei in Excel importieren

  • Excel

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von peterfido.

    TXT-Datei in Excel importieren

    Guten Tag,

    ich suche nach einer Lösung um mein Inventar zu verwalten.

    Folgende Problemstellung:

    Ich habe eine iPhone App mit der ich (selbst erstellte) Barcodes lesen kann und den Ist-Wert des Bestandes eintagen kann.
    Diese App schickt mir eine E-Mail mit einer TXT-Datei (oder CSV-Datei). Outlook auf meinem PC speichert den Anhang automatisch in einen Bestimmten Ordner ab
    Spoiler anzeigen
    Sub SaveToDisk(olMail As MailItem)

    Dim Pfad As String
    Dim Datei As Attachments
    Pfad = "C:\Service-Archiv\" 'Der Pfad muss entsprechend angepasst werden. Wichtig ist der letzte Backslash

    On Error Resume Next

    Set Datei = olMail.Attachments
    For i = 1 To Datei.Count
    Datei.Item(i).SaveAsFile Pfad & Datei.Item(i).FileName
    Next i

    End Sub

    der Inhalt ist z.B.:

    Zeile 1: 1;3;
    Zeile 2: 2;5;
    Zeile 3: 5;2;
    Zeile 4: 4;1;
    usw.

    Mit anderen Worten:

    Zeile 1: Inventarnummer1;Stückzahl3;
    Zeile 2: Inventarnummer2;Stückzahl5;
    Zeile 3: Inventarnummer5;Stückzahl2;
    Zeile 4: Inventarnummer4;Stückzahl1;
    usw.

    Jetzt würde ich gerne auf dem PC eine Excel-Datei öffnen, die automatisch die Neuste TXT-Datei (oder CSV-Datei), aus dem Bestimmten Ordner, lädt und mir eine Auflistung mit Barcodenummer, Artikelname, Stückzahl IST, Stückzahl SOLL, Muss bestellt werden (IST delta SOLL).

    Da ich vom Scripten keine Ahnung habe, stieß ich auch mit der Hilfe von Google schnell auf Probleme.
    Spoiler anzeigen
    Sub Makro1()
    '
    ' Makro1 Makro
    '
    ' Tastenkombination: Strg+a
    '
    With ActiveSheet.QueryTables.Add(Connection:= _
    "TEXT;C:\Users\KevinO\Desktop\A1arcodelist_29.09.15.txt", Destination:=Range( _
    "$A$1"))
    .Name = "A1arcodelist_29.09.15"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 850
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = True
    .TextFileCommaDelimiter = False
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 1, 1)
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
    End With
    End Sub


    Ich danke jetzt schon mal allen die mit weiterhelfen können. :love:
    Woher sollen die Informationen kommen wie:

    Barcodenummer, Artikelname, Stückzahl IST, Stückzahl SOLL, Muss bestellt werden (IST delta SOLL).

    Wenn in der Textdatei nur steht:
    Zeile 1: Inventarnummer1;Stückzahl3;
    ?
    Das ist meine Signatur und sie wird wunderbar sein!
    Eventuell hilft dir dieses Snippet weiter

    Visual Basic-Quellcode

    1. Sub ImportCSVFile(filepath As String)
    2. Dim line As String
    3. Dim arrayOfElements
    4. Dim linenumber As Integer
    5. Dim elementnumber As Integer
    6. Dim element As Variant
    7. linenumber = 0
    8. elementnumber = 0
    9. Open filepath For Input As #1 ' Open file for input
    10. Do While Not EOF(1) ' Loop until end of file
    11. linenumber = linenumber + 1
    12. Line Input #1, line
    13. arrayOfElements = Split(line, ";")
    14. elementnumber = 0
    15. For Each element In arrayOfElements
    16. elementnumber = elementnumber + 1
    17. Cells(linenumber, elementnumber).Value = element
    18. Next
    19. Loop
    20. Close #1 ' Close file.
    21. End Sub

    Quelle

    filepath musst du vorher mitgeben, also der Pfad zur CSV Datei. Mit dem Snippet wird mit dem Semikolon getrennt. Du solltest noch die CSV Datei sortieren damits richtig kommt.
    EDIT: Das snippet kommt natürlich in den VBA Teil.
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    Ich habe inzwischen eine Lösung gefunden :)
    (=SVERWEIS(A2;$A$160:$B$310;2;FALSCH))

    Allerdings muss man noch auswählen können welche Datei man nimmt und nicht nur die eine die man beim Makro aufzeichnen genommen hat.
    Könnt ihm mir da weiterhelfen?

    Quellcode

    1. Sub Makro4()
    2. '
    3. ' Makro4 Makro
    4. '
    5. ' Tastenkombination: Strg+q
    6. '
    7. Range("A160:B343").Select
    8. Selection.ClearContents
    9. Range("A168").Select
    10. With ActiveSheet.QueryTables.Add(Connection:= _
    11. "TEXT;C:\Users\Claudia\Desktop\barcodelist_29.09.15.txt", Destination:=Range( _
    12. "$A$168"))
    13. .Name = "barcodelist_29.09.15_4"
    14. .FieldNames = True
    15. .RowNumbers = False
    16. .FillAdjacentFormulas = False
    17. .PreserveFormatting = True
    18. .RefreshOnFileOpen = False
    19. .RefreshStyle = xlInsertDeleteCells
    20. .SavePassword = False
    21. .SaveData = True
    22. .AdjustColumnWidth = True
    23. .RefreshPeriod = 0
    24. .TextFilePromptOnRefresh = False
    25. .TextFilePlatform = 1252
    26. .TextFileStartRow = 1
    27. .TextFileParseType = xlDelimited
    28. .TextFileTextQualifier = xlTextQualifierDoubleQuote
    29. .TextFileConsecutiveDelimiter = False
    30. .TextFileTabDelimiter = True
    31. .TextFileSemicolonDelimiter = True
    32. .TextFileCommaDelimiter = False
    33. .TextFileSpaceDelimiter = False
    34. .TextFileColumnDataTypes = Array(1, 1, 1)
    35. .TextFileTrailingMinusNumbers = True
    36. .Refresh BackgroundQuery:=False
    37. End With
    38. Columns("A:A").ColumnWidth = 23.67
    39. Columns("B:B").ColumnWidth = 82.11
    40. ActiveWindow.SmallScroll Down:=-156
    41. End Sub
    Hallo Claudia,

    die Frage von Mono ist noch offen. Von Vorteil wären weitere Informationen:

    Soll NUR die neueste Datei genommen werden, oder alle noch nicht verarbeiteten Dateien?
    Dein Code sieht startk nach Makrorecorder aus. Da ist noch einiges zu optimieren, damit Du nicht auf die Nase fällst.
    Beispiel-Dateien können nicht schaden. (Excel und auszuwertende Datei)
    Sollen alte Daten erhalten bleiben oder immer nur der aktuelle Stand im Excel-Sheet stehen?

    Das SaveToDisk Makro von Outlook kann unterstützend arbeiten. Da kann z.B. gleich Datum und Uhrzeit und / oder ein Flag mit an den Namen gehangen werden. (Auslese_2015-10-04_073243_NEU). Das ist zuverlässiger als das Dateidatum auszulesen, was natürlich auch geht.

    Diese Infos kannst Du dann bequem auswerten und durch umbenennen das NEU rausnehmen oder verarbeitete Dateien einfach woanders hin verschieben. (>>Oder gleich Excel aufrufen und die Arbeit komplett erledigen lassen.)

    Gruß
    Peterfido
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Entschuldigung das ich erst so spät Antworte aber der Job...



    Mono schrieb:

    Woher sollen die Informationen kommen wie:

    Barcodenummer, Artikelname, Stückzahl IST, Stückzahl SOLL, Muss bestellt werden (IST delta SOLL).

    Wenn in der Textdatei nur steht:
    Zeile 1: Inventarnummer1;Stückzahl3;
    ?



    Also die Barcodenummer, Artikelname sowie Stückzahl "IST" ist von vorne rein in der Exel Tabelle festgelegt.
    Die Textdatei soll nur die Variable Information (Stückzahl IST) liefern und damit Exzel ein Bezug hat auch die Barcodenummer.
    https://picload.org/image/padlido/bild.jpg


    ​Soll NUR die neueste Datei genommen werden, oder alle noch nicht verarbeiteten Dateien?


    Es soll ein Fenster erscheinen erscheinen wo ich auswählen kann welche Datei ich importieren möchte.

    [quote]​
    Dein Code sieht startk nach Makrorecorder aus[/quote]

    Richtig
    :D

    ​Da ist noch einiges zu optimieren, damit Du nicht auf die Nase fällst.


    Wie meinst du? Eigentlich fehlt nur die Auswahl der zu importierenden Datei, oder?

    ​Beispiel-Dateien können nicht schaden.


    Check.
    cloud.directupload.net/2qUD
    cloud.directupload.net/2qUE

    Sollen alte Daten erhalten bleiben oder immer nur der aktuelle Stand im Excel-Sheet stehen?​


    Es soll nur das angezeigt werden was ich zuvor zum importieren ausgewählt habe.

    ​Das SaveToDisk Makro von Outlook kann unterstützend arbeiten. Da kann z.B. gleich Datum und Uhrzeit und / oder ein Flag mit an den Namen gehangen werden. (Auslese_2015-10-04_073243_NEU). Das ist zuverlässiger als das Dateidatum auszulesen, was natürlich auch geht.Diese Infos kannst Du dann bequem auswerten und durch umbenennen das NEU rausnehmen oder verarbeitete Dateien einfach woanders hin verschieben. (>>Oder gleich Excel aufrufen und die Arbeit komplett erledigen lassen.)


    Das wäre natürlich die Endstufe, wenn beim eingang der E-Mail automatisch sich EXCEL öffnen würde... :love:
    Hallo,

    bei mir läuft das nicht so wie gedacht. Die Verbindung zu den alten Dateien bleibt bestehen.

    Aktuell in der Datei enthaltene Verbindungen:

    Quellcode

    1. barcodelist_29.09.15
    2. barcodelist_29.09.151
    3. barcodelist_29.09.1510
    4. barcodelist_29.09.1511
    5. barcodelist_29.09.1512
    6. barcodelist_29.09.1513
    7. barcodelist_29.09.1514
    8. barcodelist_29.09.152
    9. barcodelist_29.09.153
    10. barcodelist_29.09.154
    11. barcodelist_29.09.155
    12. barcodelist_29.09.156
    13. barcodelist_29.09.157
    14. barcodelist_29.09.158
    15. barcodelist_29.09.159


    Wieviel Excel davon verträgt, weiß ich nicht.

    Dein Excel-Screenshot sieht etwas anders aus. welche Version nutzt Du und welches Betriebssystem läuft bei Dir?

    Auch ist mir nicht klar, wie die Nachbestellschwelle erreicht werden soll. Wenn Das Makro die Daten alle löscht, fehlen doch die Ist-Bestände von den anderen Artikeln, welche nicht in der Barcodeliste enthalten sind.?.

    Ich würde jetzt den Import der Datei komplett zu Fuss machen. Dabei kann man auch gleich nur die in der Barcode-Datei enthaltenen Artikel aktualisieren und der Rest würde erhalten bleiben.

    Schluß für heute mit PC...

    Gruß
    Peterfido
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Die Verbindung zu den alten Dateien bleibt bestehen.


    Was heißt das? In dem Makro sehr das, bevor EXCEL die neue Datei importiert, erstmal alle zellen gelöscht werden wo vorher etwas drinne stand.

    Dein Excel-Screenshot sieht etwas anders aus. welche Version nutzt Du und welches Betriebssystem läuft bei Dir?​


    EXCEL 2010 aber das Skin teuscht :D

    Auch ist mir nicht klar, wie die Nachbestellschwelle erreicht werden soll. Wenn Das Makro die Daten alle löscht, fehlen doch die Ist-Bestände von den anderen Artikeln, welche nicht in der Barcodeliste enthalten sind.?.Ich würde jetzt den Import der Datei komplett zu Fuss machen. Dabei kann man auch gleich nur die in der Barcode-Datei enthaltenen Artikel aktualisieren und der Rest würde erhalten bleiben.​


    Also der Plan ist wie folgt:
    - Unser "Lagerist :D " rennt jeden Morgen durch das Lager und Scannt die Bestände. Es kann natürlich passieren das er was vergisst (Was nicht so schlimm ist).
    - Der Chef empfängt eine E-Mail mit dem Anhang
    - EXCEL wertet das aus und der Chef kann sehen was er am ende des Tages Bestellen muss.

    Da die "Inventur" jeden Tag aufs neue gemacht wird sollen die Daten vom Vortag auf keinen Fall da stehen sonder nur Tagesaktuelle. Und wie ich schon erwähnt habe, ist es nicht schlimm wenn ein Paar Felder frei bleiben, weil unser "Lagerist" vergessen hat was zu Scannen.
    Euer Lagerist darf jeden Tag 82 Artikel zählen, wo am Ende eine Summe von 590 rauskommen kann? Kein Wunder, dass er rennen muss :D

    Die Verbindungen zeigt Dir Excel ja an. Im Direktfenster einfach:

    Visual Basic-Quellcode

    1. debug.Print activeworkbook.Connections.Count

    eingeben.

    Oder das folgende Makro ausführen, dann listet er sie Dir auf. Die ausmarkierte Zeile aktivieren und er löschte die Verbindungen.
    Private Sub VerbindungenEntfernen()

    Visual Basic-Quellcode

    1. Dim c As Object
    2. Dim z As Integer
    3. For Each c In ActiveWorkbook.Connections
    4. Debug.Print c.Name
    5. 'c.Delete 'ausmarkiert!
    6. z = z + 1
    7. Next
    8. Debug.Print z & " Verbindungen gefunden"
    9. End Sub


    Wenn nur die tagesaktuellen Daten interessant sind, dann würde ich Outlook das Datum beim speichern mit angeben lassen und Excel versucht einfach diese Datei zu öffnen. Findet es diese nicht, dann kann es nach einem Namen fragen.

    Visual Basic-Quellcode

    1. sub bla()
    2. Dim sDateiname As String
    3. Const Pfad = "C:\Users\Claudia\Desktop\"
    4. sDateiname = Pfad & "barcodelist_" & Format$(Now, "DD.MM.YY.txt")
    5. If Not FileExists(sDateiname) Then
    6. sDateiname = Application.GetOpenFilename(, , "Datei wählen", "Laden", False)
    7. End If
    8. ...
    9. end sub
    10. Private Function FileExists(ByVal sDateiname As String) As Boolean
    11. Dim fSO As Object
    12. Set fSO = CreateObject("Scripting.FileSystemObject")
    13. FileExists = fSO.FileExists(sDateiname)
    14. Set fSO = Nothing
    15. End Function



    Gruß
    Peterfido

    Keine Unterstützung per PN!