Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Excel txt-Import per VBA

Frage Entwicklung VB for Applications

Mitglied: goodbytes

goodbytes (Level 2) - Jetzt verbinden

11.08.2011 um 13:54 Uhr, 5055 Aufrufe, 6 Kommentare

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 - Klicke auf das Bild, um es zu vergrößern

HTML-Code:

96e5a5eff22092c4bcf3d31f95b29bde - Klicke auf das Bild, um es zu vergrößern

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)
Mitglied: mathe172
11.08.2011 um 18:00 Uhr
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"

Mit freundlichen Grüßen,
Mathe172
Bitte warten ..
Mitglied: goodbytes
11.08.2011 um 21:05 Uhr
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
Bitte warten ..
Mitglied: mathe172
11.08.2011 um 23:27 Uhr
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.

Mit freundlichen Grüßen,
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
Bitte warten ..
Mitglied: goodbytes
12.08.2011 um 08:20 Uhr
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!
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.

01.
Option Explicit 
02.
 
03.
Sub Test() 
04.
 
05.
' Web-Import 
06.
 
07.
    With ActiveSheet.QueryTables.Add(Connection:= _ 
08.
        "URL;http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=CELEX:32006R1881:DE:HTML" _ 
09.
        , Destination:=Range("$A$1")) 
10.
        .Name = _ 
11.
        "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=" 
12.
        .FieldNames = True 
13.
        .RowNumbers = False 
14.
        .FillAdjacentFormulas = False 
15.
        .PreserveFormatting = True 
16.
        .RefreshOnFileOpen = False 
17.
        .BackgroundQuery = True 
18.
        .RefreshStyle = xlInsertDeleteCells 
19.
        .SavePassword = False 
20.
        .SaveData = True 
21.
        .AdjustColumnWidth = True 
22.
        .RefreshPeriod = 0 
23.
        .WebSelectionType = xlEntirePage 
24.
        .WebFormatting = xlWebFormattingNone 
25.
        .WebPreFormattedTextToColumns = True 
26.
        .WebConsecutiveDelimitersAsOne = True 
27.
        .WebSingleBlockTextImport = False 
28.
        .WebDisableDateRecognition = False 
29.
        .WebDisableRedirections = False 
30.
        .Refresh BackgroundQuery:=False 
31.
    End With 
32.
 
33.
' Text löschen 
34.
 
35.
    Dim a As Range 
36.
    Dim b As Range 
37.
     
38.
    Columns("A:A").Select 
39.
    Set a = Selection.Find(What:="--------------------------------------------------") 
40.
     
41.
    Range("A1:" & a.Address).Select 
42.
    Selection.Delete Shift:=xlUp 
43.
     
44.
    Columns("A:A").Select 
45.
    Set a = Selection.Find(What:="--------------------------------------------------") 
46.
     
47.
    Columns("A:A").Select 
48.
    Set a = Selection.Find(What:="[1] Was Früchte") 
49.
 
50.
    Set b = Range("A" & Range("A65536").End(xlUp).Row) 
51.
        
52.
    Range(a.Address & ":" & b.Address).Select 
53.
    Selection.Delete Shift:=xlUp 
54.
 
55.
End Sub
Gruß
Torsten
Bitte warten ..
Mitglied: mathe172
12.08.2011 um 13:01 Uhr
Hallo,

schau dir mal das an:
01.
    Dim Row As Integer 
02.
    Row = 1 
03.
    Dim LastColumn as Integer 
04.
    LastColumn = 4 
05.
    Dim Content() As String 
06.
    Do Until Cells(Row, 1).Value = "" 
07.
        Content = Split(Cells(Row, 1).Value, "|") 
08.
        If Content(UBound(Content)) = "" Then ReDim Preserve Content(UBound(Content) - 1) 
09.
        For i = 0 To LastColumn - 1 
10.
            If LastColumn - 1 - UBound(Content) <= i Then 
11.
                Cells(Row, i + 1).Value = Trim(Content(i -LastColumn + 1 + UBound(Content))) 
12.
            Else 
13.
                Cells(Row, i + 1).Value = "" 
14.
            End If 
15.
        Next 
16.
        Row = Row + 1 
17.
    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.

Mit freundlichen Grüßen,
Mathe172
Bitte warten ..
Mitglied: goodbytes
12.08.2011 um 16:46 Uhr
Hallo Mathe172,

tatsächlich, funktioniert ja wirklich prima !!! 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 !! !

Gruß
Torsten
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Microsoft Office
gelöst SharePoint, Word, Excel. Auslesen mittels VBA und XML (10)

Frage von schwazza zum Thema Microsoft Office ...

VB for Applications
gelöst Excel VBA .csv Import in Tabelle x, ab Spalte y

Frage von drimrim zum Thema VB for Applications ...

VB for Applications
gelöst Excel VBA Eine oder mehrere Zellen Verschieben (2)

Frage von batchnewbie zum Thema VB for Applications ...

Heiß diskutierte Inhalte
Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...

Exchange Server
DNS Einstellung - zwei feste IPs für Mailserver (15)

Frage von ivan0s zum Thema Exchange Server ...