.txt Dateien mit Excelliste zusammenführen

  • #1
D

DonCravallo

Neues Mitglied
Themenersteller
Dabei seit
22.11.2006
Beiträge
3
Reaktionspunkte
0
Folgende Problemstellung: ich habe von einem Lieferanten eine Excelliste mit div. Informationen bekommen wie z.B. Artikelnummer, Preis usw.
Jetzt sollte zu jedem Artikel noch der passende Text dazukommen. Ist auch vorhanden jedoch für jeden Artikel eine eigene .txt Datei. Diese .txt Dateien haben den gleichen Namen wie die Artikelnummer.

z.B. Artikelnummer 22100024230 -> passender Text 22100024230.txt

Wie schaffe ich es, zum Artikel 22100024230 in der Zelle A2, in der Spalte K2 den passenden Text aus der Datei 22100024230.txt zu importieren, verknüpfen oder was auch immer, so das ich am Schluss eine vollständige Excelliste samt Artikeltext entsteht, diese dann in .csv abzuspeicern und in meine Shop zu importieren kann?

Ich hoffe, das meine Beschreibung einigermaßen verständlich ist.

Danke im voraus für die Hilfestellung
 
  • #2
Soll das nur einmalig gemacht werden, oder kommt sowas jede Woche?
Gibt es zu jedem Datensatz eine TXT-Datei und zu jeder TXT-Datei einen Datensatz?
Wieviele sind es?
Ist der passende Text ein ganz normaler Fließtext?
Per Makro schwebt mir da schon was vor.
Poste auch mal den Pfad auf dem die TXT-Dateien abgespeichert sind.
 
  • #3
Hallo Klexy

Zur 1. Frage
- Es gibt alle 1-2 Monate zusätzliche Artikel in Excel + TXT Dateien

Frage 2:
- Ja es gibt zu jedem Datensatz eine TXT-Datei

Frage 3:
- ca. 2.500

Frage 4:
-es ist normaler Fleißtext jedoch die Überschrift ist immer Fett, also mit <b>Überschrift</b> und danach zwei kleine Rechtecke für den Zeilenumbruch


Eine Musterexcel mit 10 artikel und die passenden TXT-Dateien schicke ich Dir per Mail.

Danek für Deine Hilfe
 
  • #4
Hallo DonCravallo,

wenn die txt-Dateien alle in einem Verzeichnis liegen kannst du den nachfolgenden Makro benutzen. Den Pfad müßtest du noch anpassen.
(siehe Makro)
Code:
  sPfad = ThisWorkbook.Path ->oder hier sPfad = c:\Test angeben

Eine Kopie deiner Datei anfertigen und öffnen. Das zu bearbeitende Blatt muß das aktive sein. Makro aufrufen und schauen, was passiert.

Gruß matjes :)
Code:
Option Explicit

Sub ArtNrTXTDateienInSpalteK()

  Const cZ_ERSTEWERTEZEILE = 2->arbeiten ab Zeile 2
  Const cSP_ARTIKELNR = 1     ->Spalte A
  Const cSP_TEXT = 11         ->Spalte K

  Dim ws As Worksheet
  Dim sPfad As String, sDateinameFull As String
  Dim sArtNr As String, sTxt As String
  Dim lRows As Long, x As Long, pos As Long
  
 ->Suchpfad für ArtikelNr.txt Dateien = Pfad des Makros
 ->-> Makrodatei muß im Verzeichnis der txt-Dateien liegen
  sPfad = ThisWorkbook.Path ->oder hier sPfad = c:\Test angeben
  
  
 ->aktive Blatt setzen
  Set ws = ActiveSheet
  
 ->letzte Zeile Artikelnr
  lRows = ws.Cells(ws.Rows.Count, cSP_ARTIKELNR).End(xlUp).Row
  
  For x = cZ_ERSTEWERTEZEILE To lRows
    sArtNr = ws.Cells(x, cSP_ARTIKELNR).Value
    If sArtNr <>  Then
      sDateinameFull = sPfad & Application.PathSeparator & sArtNr & .txt
     ->txt-Datei suchen
      With Application.FileSearch
        .NewSearch
        .LookIn = sPfad
        .SearchSubFolders = False
        .FileName = sArtNr & .txt
        .MatchTextExactly = True
        .FileType = msoFileTypeAllFiles
        If .Execute() > 0 Then
          If Application.FileSearch.FoundFiles.Count <> 1 Then
            MsgBox Datei ist mehrfach vorhanden & vbLf & sArtNr & .txt
          Else
            sTxt = TxtDateiLesen(Application.FileSearch.FoundFiles(1))
            If sTxt =  Then
              If vbNo = MsgBox( _
                      Beim Lesen der txt-Datei ist ein Fehler aufgetreten. & vbLf & _
                       sDateinameFull, vbDefaultButton1 + vbYesNo) Then
                GoTo AUFRAEUMEN
              End If
            Else
              ws.Cells(x, cSP_TEXT).Value = sTxt
             ->Überschrift noch fett machen
              pos = InStr(1, sTxt, vbLf)
              If pos > 1 Then
                ws.Cells(x, cSP_TEXT).Characters(1, pos - 1).Font.Bold = True
              End If
            End If
          End If
        End If
      End With
    End If
  Next
AUFRAEUMEN:
  Set ws = Nothing
End Sub

'*********************************************************************************
Private Function TxtDateiLesen(sDateinameFull As String) As String
  Dim FileHandle As Integer, s As String, sTmp As String
  FileHandle = FreeFile
  Open sDateinameFull For Input As #FileHandle
  Do While Not EOF(1)
  Line Input #1, sTmp
    If s <>  Then s = s & vbLf & sTmp Else s = sTmp
  Loop
  Close #FileHandle
  DoEvents->damit sie auch geschlossen werden kann
  TxtDateiLesen = s
End Function
 
 
  • #5
Vielen Dank für Deine Mühe. Ich hoffe, ich bin damit nicht überfordert. So ein Excel Spezialist bin ich nun auch wieder nicht.
Mir ist noch nicht ganz klar wo ich die beiden Codes hingeben bzw. hinkopieren muss.

Hilf mir bitte auf die Sprünge.

Danke schon mal im voraus.

Gruß DC
 
  • #6
Hallo DonCravallo,

dann mal ein kurze Anleitung:

'==============================
'Makro in Excel-Datei speichern
'==============================
'a) neue Excel-Datei öffnen
'b) mit Alt+F11 VB-Editor öffnen
'd) im Projekt-Fenster
'   unter VBAProject(betreffende Excel-Datei)
'   mit rechter Maustaste-> Einfügen-Modul
'   (die Code-Seite des Moduls öffnet sich)
'e) Das Makro dort hineinkopieren (per Copy und Paste)
'f) mit Alt+Q VB-Editor schliessen
'g) Datei unter aussagekräftigem Namen speichern.
(z.B. Makros_TxtImport.xls)


Diese Datei in des Verzeichnis mit den Text-Dateien kopieren
und dort öffnen.


Kopie der produktiven Datei, in die die Texte importiert werden sollen, anlegen.
Die Kopie öffnen, das entsprechende Blatt aktivieren.

Unter Extras->Makro->Makros-> ArtNrTXTDateienInSpalteK  markieren -> Ausführen

und schauen, was passiert.

Gruß Matjes :)
 
  • #7
Sodele, jetzt bin ich auch soweit mit meiner Version.

Mein Makro gehört in die Datei Personl.xls, welche üblicherweise unter C:\...\Microsoft Office\office\XLStart\ deponiert ist. In dieser Datei kannst du alle deine Makros sammeln, denn die ist im Hintergrund immer geöffnet und verfügbar.

Setz dir mit Ansicht > Symbolleisten > Anpassen > Befehle > Neu einen neuen Button irgendwo in deine Symbolleiste. Dazu mußt du Neu mit der Maus an die gewünschte Stelle ziehen. Danach rechten Mausklick auf die neue Schaltfläche > Makro zuweisen > aus der Liste das entsprechende Makro auswählen.
Unter Name und Schaltflächensymbol bearbeiten kannst du dem Ganzen noch eine gewisse Eleganz verleihen.
Abschließend Anpassen-Fenster schließen.

Mein Makro ist durchgehend kommentiert, damit du dir ein Bild davon machen kannst, was da so alles passiert. Vor dem Einsatz mußt du die Parameter g_TXT_Pfad und g_Haupttabelle ganz oben im Makro auf die zutreffenden Werte (zwischen den Anführungszeichen) setzen.
Falls du deinen Artikeltext nicht in Spalte K haben willst, mußt du die Passagen Columns(K:K).Select überall im Makro entsprechend ändern.

Jetzt Haupttabelle öffnen, Button drücken und fertig.
Code:
Sub Artikeltexte_importieren()

'Festlegung der Variablen Artikelnummer und Pfad
'der Präfix g_ ist aus optischen Gründen gewählt
'hier: g wie Guido
  Dim g_Artikelnummer As String, g_TXT_Pfad As String, g_Haupttabelle As String
'Festlegung des Pfades, in dem die Artikeltextdateien sind
  g_TXT_Pfad = C:\Oberordner\Unterordner\
'Festlegung des Namens der Haupttabelle
  g_Haupttabelle = Musterdatei.xls
'in Spalte K sollen die Artikeltexte erscheinen
  Columns(K:K).Select
'suche die erste Leere Zelle von oben
  Selection.Find(What:=, After:=ActiveCell, LookIn:=xlValues, LookAt:= _
    xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _
    .Activate
'gehe von dort 10 Spalten nach links
  ActiveCell.Offset(0, -10).Select
  Selection.Activate
'Definiere den Inhalt dieser Zelle als die Artikelnummer, die importiert werden soll
'in der Spalte seht allerdings nicht die führende Null, die im TXT-Dateinamen
'vorhanden ist daher habe ich sie hier in der Definition hinzugefügt
  g_Artikelnummer = 0 & ActiveCell & .txt
    
'ab hier beginnt eine Schleife, die sich so lange wiederholt,
'bis keine Artikelnummer mehr ohne Artikeltext ist
  Do
'wenn eine entsprechende Artikeltextdatei vorhanden ist, öffne sie
  If Dir(g_TXT_Pfad & g_Artikelnummer) <>  Then
'TXT-Datei öffnen ab Zeile 2 (denn in der ersten ist ja sowieso nur der
'schon in Spalte B vorhandene Artikelname
'Trennzeichen ist die geschwungene Klammer {, weil es unwahrscheinlich ist,
'daß die im Artikeltext vorkommt.
'ich habe nicht den standardmäßigen Tabulator als Trennzeichen genommen,
'weil der versehentlich oder absichtlich im Text enthalten sein könnte,
'wodurch der Inhalt nicht in einer einzigen Spalte dargestellt werden würde
  Workbooks.OpenText FileName:=g_TXT_Pfad & g_Artikelnummer, _
    Origin:=xlWindows, StartRow:=2, DataType:=xlDelimited, TextQualifier:= _
    xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, _
    Comma:=False, Space:=False, Other:=True, OtherChar:={, FieldInfo:= _
    Array(Array(1, 2), Array(2, 1))
'Da im Artikeltext versehentlich oder absichtlich ein Zeilenumbruch vorhanden sein könnte,
'werden die untereinander stehenden Zellen per Formeln in Spalte B
'in eine Zelle zusammengefasst. Die unterste enthält dann den kompletten Text
  Cells.Select
'Alle leeren Zellen, die sich möglicherweise im Bereich des Artikeltextes befinden
'(z.B. wenn im Artikeltext zwei Zeilenumbrüche hintereinander sein sollten, oder die 
'leere Zeile 2, die in deinen Beispielen immer vorhanden war) werden durch §§§§§
'ersetzt. Das kommt garantiert nicht im Taxt vor und ist für Formeln leicher zu handeln
'als eine leere Zelle mittendrin. Diese Zellen werden durch die Formeln aus dem Artikeltext
'herausgefiltert.
  Selection.Replace What:=, Replacement:=§§§§§, LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False
  Selection.ColumnWidth = 45.43
  With Selection
    .WrapText = True
  End With
  Range(B1).Select
  ActiveCell.FormulaR1C1 = _
    =IF(RC[-1]=§§§§§,,IF(R[1]C[-1]=,RC[-1],RC[-1]& & Chr(10) & ))
  Range(B2).Select
  ActiveCell.FormulaR1C1 = _
    =R[-1]C&IF(RC[-1]=§§§§§,,IF(R[1]C[-1]=,RC[-1],RC[-1]& & Chr(10) & ))
  Range(B2).Select
  Selection.Copy
  Range(A1).Select
  If Range(A2) =  Then
  Range(B2).Select
  Selection.ClearContents
  Else
  Selection.End(xlDown).Offset(0, 1).Select
  ActiveSheet.Paste
  If Range(A3) =  Then
  Application.CutCopyMode = False
  Else
  Selection.AutoFill Destination:=Range(ActiveCell, ActiveCell.End(xlUp)), Type:=xlFillDefault
  End If
  End If
  Cells.Select
  Cells.EntireRow.AutoFit
  Range(B1).Select
  If Range(B2) =  Then
  Range(B1).Select
  Else
  Selection.End(xlDown).Select
  End If
  Selection.Activate
  g_Artikeltext = ActiveCell

'sonst weiter bei keine_Artikeltextdatei_vorhanden
  Else: GoTo keine_Artikeltextdatei_vorhanden
  End If
  Windows(g_Haupttabelle).Activate
  ActiveCell.Offset(0, 10).Select
  Selection.Activate
  ActiveCell.FormulaR1C1 = g_Artikeltext
  Windows(g_Artikelnummer).Activate
'die TXT-Datei wird ohne Speichern wieder geschlossen
  ActiveWindow.Close Savechanges:=False
  GoTo Normalweiter

keine_Artikeltextdatei_vorhanden:
  ActiveCell.Offset(0, 10).Select
  ActiveCell.FormulaR1C1 = keine_Artikeltextdatei_vorhanden
  
Normalweiter:
  Columns(K:K).Select
  Selection.Find(What:=, After:=ActiveCell, LookIn:=xlValues, LookAt:= _
    xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _
    .Activate
  ActiveCell.Offset(0, -10).Select
  Selection.Activate
'Die Artikelnummer wird bei jedem Durchlauf der Schleife wieder neu definiert
  g_Artikelnummer = 0 & ActiveCell & .txt
'Schleife soll so lange laufen, bis in Spalte Artikelnummer kein Eintrag mehr ist
  Loop While ActiveCell <> 
  
'Alle Zellen, die keine_Artikeltextdatei_vorhanden enthalten, fett rot formatieren
'(bedingte Formatierung)
  Columns(K:K).Select
  Selection.FormatConditions.Delete
  Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
    Formula1:==keine_Artikeltextdatei_vorhanden
  With Selection.FormatConditions(1).Font
    .Bold = True
    .ColorIndex = 3
  End With
'Hier werden die Zellen so formatiert, daß der Zelleintrag am
'oberen Zellrand ausgerichtet ist und der Zeilenumbruch aktiviert ist
'Standard in Excel ist die Ausrichtung unten, was im vorliegenden Fall nicht so toll ist
  Cells.Select
  With Selection
    .VerticalAlignment = xlTop
    .WrapText = True
  End With
  Range(A1).Select

End Sub

Das Makro gleicht folgende menschliche Fehler aus:
Wenn keine TXT-Datei zu einem der Artikel vorhanden ist, wird das im Textfeld in fetter roter Schrift vermerkt. Du kannst diese Einträge löschen, um das Makro noch einmal durchlaufen zu lassen, wenn du eine Nachlieferung bekommen hast. Wenn du einen Eintrag aktualisieren willst, weil zu einem Artikel eine neue TXT-Datei gekommen ist, mußt du den Text zu diesem Artikel vorher in der Tabelle löschen. Das makro sucht sich selbständig diejenigen Datensätze, die keinen Artikeltext haben.
Wenn ein Artikeltext doch nicht reinen Fließtext enthält, sondern Tabulatoren oder Zeilenumbrüche enthält, wird der Eintrag so umformatiert, daß er trotzdem in eine einzige Zelle passt.
Am Ende wird die Haupttabelle noch ein wenig wahrnehmungsfreundlich formatiert.

Wenn du dir die Mühe machst, das alles durchzuackern und zu verstehen, weißt du schon einen Haufen über Makros.
Tip: Mach die Haupttabelle auf (Vollbild), dann den VB-Editor (in einem kleingezogenen Fenster!). Klick ins Makro und drück F8. Mit F8, F8, F8, F8 kannst du dann das Makro Schritt für Schritt ablaufen lassen. Mit F5 läuft es in einem Rutsch bis zum Schluß durch.

Hab ich alles vom Matjes gelernt :)
 
Thema:

.txt Dateien mit Excelliste zusammenführen

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.840
Beiträge
707.963
Mitglieder
51.494
Neuestes Mitglied
Flensburg45
Oben