goodbytes
Goto Top

Excel txt-Import per VBA

Hallo,
ich habe mal wieder ein Problem, diesmal mit einem txt-Import. Ich muss aber öfters so etwas importieren; auch mit sehr vielen Daten.

Aus einer html-Datei möchte ich Zeilen in Excel importieren.

Screenshot:

61a84d76badae2687c801cb08e2e2a51

HTML-Code:

96e5a5eff22092c4bcf3d31f95b29bde

Es sind immer vier Bereiche je Zeile. Als neue Zeile kann man ja hier eventuell "Ende Absatz/Zeilenumbruch/Anfang Absatz/ein nummerischer Wert" (z.B. "1.3") nehmen. Die Spalten haben ja das Pipe als Trennzeichen. Dann habe ich zumindest die zusammengehörigen Abschnitte richtig.

Nun können aber im 3. und 4. Bereich auch mehrere Werte stehen. diese sollen dann in extra Zeilen (als erster Bereich dann leer, zweiter Bereich wie in der Zeile darüber).

Ziel ist es, dass ich für jede Variante, welche in der vierten Spalte auch einen Wert hat eine neue Zeile mit vier Spalten erzeuge. Zum Schluß sollen alle Zeilen exakt vier Spalten haben. Ich möchte dann zum weiteren automatisierten Bearbeiten eine zusätzliche Spalte mit interner laufender Nummer hinzufügen, mit der ich durch dessen Angabe genau den zugehörigen Datensatz herausziehen und kopieren kann. Der Mitarbeiter gibt dann die interne Nummer ein und die Felder in seinem Excel-Dokument werden automatisch mit den zugehörigen Daten befüllt.

Leider bekomme ich die Daten nur als PDF oder HTML.

Puh, ganz schön schwierig zu erklären...

Vielleicht kann mir da jemand weiterhelfen, ist doch ganz schön kniffelig gerade weil die dritte und vierte Spalte mehrere Werte aufweisen können.

Vielen Dank schon mal im voraus !!!

Gruß
Torsten

Ach so, die HTML-Datei hat vor und nach dem Anhang noch viel Text, der nicht importiert werden soll. Kann ich den Import gleich so gestalten, dass erst ab einem bestimmten Schlüsselwort mit dem Import begonnen wird? (Absatz/"Anhang"/Absatz Ende)

Content-Key: 171340

Url: https://administrator.de/contentid/171340

Printed on: April 20, 2024 at 02:04 o'clock

Member: mathe172
mathe172 Aug 11, 2011 at 16:00:49 (UTC)
Goto Top
Hallo,

wenn ich das richtig verstanden habe, dann willst du eigentlich dass es am Schluss genauso aussieht wie in der Tabelle, oder?
Versuch mal folgendes: Nimm die Funktion "Daten aus dem Web" und navigiere dann zu der Datei, die du willst. Dort wählst du die zu Importierende Tabelle aus und drückst "Importieren"

MfG,
Mathe172
Member: goodbytes
goodbytes Aug 11, 2011 at 19:05:17 (UTC)
Goto Top
Hallo Mathe172,
nein, genau das möchte ich eben nicht. Ich möchte, dass das Ergebnis von anderen Makros maschinell auswertbar ist.

Ich habe aber jetzt im Laufe des Tages den Import von der Website in Excel und die anschließende Entfernung des vorherigen und nachfolgenden Textes gemacht.
Also die HTML-Abschnitte mittels "p" sind damit auch weg.

Allerdings steht natürlich alles in "A:A" komplett, da ich die eigentlichen Trennzeichen für die Spalten: "|" ja noch nicht ausgewertet habe.

Also ist noch eine nachträgliche Umformatierung notwendig., aber hier stehe ich hier vor meinem größten Problem.

Es sind immer 4 Spalten, aber in Spalte 3 und 4 können auch mehrere Werte auftreten, für welche ich extra Zeilen machen muss. Dabei müssen die nicht vorhandenen beiden ersten Zellen irgendwie eingefügt oder aufgefüllt werden, damit die Struktur mit genau vier Spalten erhalten bleibt.

Also nochmal ganz klar: Wenn in Spalte 4 eine Zahl auftaucht (erste Zeile Wert, dann kommt ein Zeilenumbruch, dann kommt nach dem Trennungszeichen gleich die nächste Zeile), nur fehlen in dieser neuen Zeile die ersten zwei Felder; sind also nicht einmal per " | | |" vorhanden.

Ist wirklich ganz schön schwierig, da ich aus meiner Sicht kein Merkmal zur Identifizierung einer definitiv neuen Zeile habe um zwei leere Zellen in der neuen Zeile davor einzufügen.

Wie gesagt, es geht hier nicht um Optik, sondern um ein maschinell verwendbare Datei, auf die die Makros aus den anderen Arbeitsmappen einen genau definierten Datensatz zugreifen können. Und für eine klare Zuordnung brauche ich einen Primärschlüssel, und dieser soll mir die nach dem Import zusätzlich per Makro eingefügte Spalte interne Identifizierungs-Nummer dienen. Das Einfügen dieser Spalte ist ja kein Problem; allerdings muss dazu ja alles andere vorher korrekt in Zeilen zugeordnet sein.

Gruß
Torsten
Member: mathe172
mathe172 Aug 11, 2011 at 21:27:32 (UTC)
Goto Top
Hallo,

was das Merkmal für neue Zeilen angeht: Eigentlich fängt ja nach jedem </P> eine neue Zeile an, oder? Wenn 4 "|" enthalten sind, ist es eine Zeile die Komplett ist, andernfalls müssen die ersten beiden Spalte übersprungen werden und die Daten in Spalte 3 und 4 eingetragen werden.

Meine Frage, ob es genau so wie in den Tabellen ausschauen soll, war wohl etwas unverständlich. Ich meinte einfach, ob die ersten Spalten genau wie in der Tabelle leer bleiben sollen, oder ob die Daten von darüber kopiert werden sollen.

MfG,
Mathe172
P.S.: Ich finde im Internet nicht exakt die Version der Daten die du hast. Könntest du mal einen Link posten (wenn es öffentlich zugänglich ist), denn das <P>-Tag ist normalerweise ja nicht für Tabellen. Vielleicht hilft es ja face-smile
Member: goodbytes
goodbytes Aug 12, 2011 at 06:20:31 (UTC)
Goto Top
Hallo Mathe24,

ach so, wenn du das mit der Ansicht meinst, ja, dann soll es henauso sein. Es müssen halt immer die entsprechenden Datensätze in der richtigen Spalte stehen.

Wenn man ein eindeutiges Trennzeichen findet, wo eine neue Spalte anfängt wäre es ja gut. Dann könnte man ja auch statt zwei Leerfeldern nur eins machen und in die zweite Zelle immer den Inhalt der darüberliegenden Zelle reinkopieren. Wenn ich nämlich genau den zweiten Datensatz rausziehe habe ich ja sonst die Erzeugnisbezeichnung nicht mit dabei. Ist mir heute früh noch so eingefallen...

Ach so, hier der Link wo man sich die Seite frei als HTML runterziehen kann:

http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=CELEX:32006R1881: ...

Hier betrifft es nur den ersten Abschnitt des Anhangs; in anderen solchen Tabellen ist davon mehr enthalten.

Vieleicht fällt dir ja was ein, wäre echt toll! face-smile
Ich hab auch schon ewig hin und her experimentiert, leider ohne richtigen Erfolg.

Hier mein letzter Stand für den Web-Import mittels Excel und der Beseitigung des davor- bzw. dahinterliegenden Textes, so dass nur die Tabelle übrig bleibt.

Option Explicit

Sub Test()

' Web-Import  

    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=CELEX:32006R1881:DE:HTML" _  
        , Destination:=Range("$A$1"))  
        .Name = _
        "Notice.do?val=437851%3Acs&lang=de&list=572915%3Acs%2C437851%3Acs%2C&pos=2&page=1&nbl=2&pgs=10&hwords=&checktexte=checkbox&visu="  
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlEntirePage
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With

' Text löschen  

    Dim a As Range
    Dim b As Range
    
    Columns("A:A").Select  
    Set a = Selection.Find(What:="--------------------------------------------------")  
    
    Range("A1:" & a.Address).Select  
    Selection.Delete Shift:=xlUp
    
    Columns("A:A").Select  
    Set a = Selection.Find(What:="--------------------------------------------------")  
    
    Columns("A:A").Select  
    Set a = Selection.Find(What:="[1] Was Früchte")  

    Set b = Range("A" & Range("A65536").End(xlUp).Row)  
       
    Range(a.Address & ":" & b.Address).Select  
    Selection.Delete Shift:=xlUp

End Sub

Gruß
Torsten
Member: mathe172
mathe172 Aug 12, 2011 at 11:01:37 (UTC)
Goto Top
Hallo,

schau dir mal das an:
    Dim Row As Integer
    Row = 1
    Dim LastColumn as Integer
    LastColumn = 4
    Dim Content() As String
    Do Until Cells(Row, 1).Value = ""  
        Content = Split(Cells(Row, 1).Value, "|")  
        If Content(UBound(Content)) = "" Then ReDim Preserve Content(UBound(Content) - 1)  
        For i = 0 To LastColumn - 1
            If LastColumn - 1 - UBound(Content) <= i Then
                Cells(Row, i + 1).Value = Trim(Content(i -LastColumn + 1 + UBound(Content)))
            Else
                Cells(Row, i + 1).Value = ""  
            End If
        Next
        Row = Row + 1
    Loop

Das Splittet den Text jeder Zeile bei "|" und fügt die Teile dann so ein, dass der letzte immer in Spalte 4 ist (Lässt sich in Zeile 4 definieren). Der Code funktioniert so aber nur im ersten Abschnitt, da danach 5 Spalten vorhanden sind.
Dort fehlt dann die Erste.
Aber mit etwas Anpassung sollte es möglich sein, vom Code alles richtig machen zu lassen.

MfG,
Mathe172
Member: goodbytes
goodbytes Aug 12, 2011 at 14:46:31 (UTC)
Goto Top
Hallo Mathe172,

tatsächlich, funktioniert ja wirklich prima !!! face-smile Das ist ja wirklich eine super Idee, erst einmal komplett alles auseinander zu nehmen. Alle Achtung !!!

Ich werde mir am Wochenende mal einen Kopf machen wie ich das mit mehreren Spalten hinbekomme.

Eventuell teile ich die Abschnitte einfach auf mehrere Tabellenblätter auf. Als Erkennung für eine neue Tabelle kann ich je die Überschrift "Abschnitt2:" verwenden.

Na, mal schauen.

Vielen Dank auf jeden Fall schon mal !!! Ich werde die Frage schob mal als gelöst markieren.

Ein schönes Wochenende wünsche ich dir !! face-smile!

Gruß
Torsten