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 VBA: Infos automatisch aus html Datei suchen und in Excel einfügen

Frage Microsoft Microsoft Office

Mitglied: jojojo

jojojo (Level 1) - Jetzt verbinden

26.07.2014, aktualisiert 22:36 Uhr, 3307 Aufrufe, 9 Kommentare

Hallo zusammen.

Ich habe mal wieder ein Excel VBA Problem. Durch googeln und "kopieren" von Skriptteilen komme ich nicht weiter.

Problem allgemein:
Es liegen etliche html Dateien in einem Ordner vor. Aus diesen müssen bestimmte Werte (Zahlen, aber teilw. auch mehrzeilige Textfolgen wie Sätze) ausgelesen werden. Die gesuchten Informationen sind mit Markern versehen bzw. man kann die Informationen finden, wenn man nach bestimmten Zeichenfolgen (=Marker) sucht.
Anbei eine "gekürzte" html Datei als Bsp.:

<html>
...
<h1 id="eine_var1">Info 1</h1>
...
<span id="eine_var2" style="color:Blue;">5.000 Einheiten</span>
...
funktion.ladeWert({"a1":1,"a2":2,"a3":3,"b1":99.9,"b2":88.8,"b3":11.1})
...
"festerbegriff":[{"text":"Text, Text, noch mehr Text und weiterer Text.","da":"1 Angabe"},{"text":"Ein weiterer Text mit noch mehr Inhalt.","da":"2 Angabe"},
...
</html>

Die gesuchten Werte sind bei dieser html Datei dann z.B.:
Info 1
5.000 Einheiten (Problem: Marker kann auch heißen: <span id="eine_var2" style="color:Yellow;">
1
2
3
99.9
88.8
11.1
Text, Text, noch mehr Text und weiterer Text.
1 Angabe
Ein weiterer Text mit noch mehr Inhalt.
2 Angabe

Problem bei den letzten 4 Infos (hinter "festerbegriff") ist, dass nicht fest definiert ist, ob es nur 4 Infos sind oder weitere (also weitere Wiederholungen der Folge {"text":"...","da":"..."}).

Für jede html Datei müsste in Excel eine Zeile mit den jeweiligen Infos "angelegt" bzw. eingefügt werden (Info 1 | 5.000 Einheiten | 1 | ...)

Mit meinen VBA Kenntnissen komme ich nicht weiter und hoffe daher auf eure Hilfe.

Kann mir jemand weiterhelfen?

Ein schönes Wochenende.
Vielen Dank.
Mitglied: colinardo
LÖSUNG 27.07.2014, aktualisiert 29.07.2014
Moin jojojo,
anhand deines HTML-Schnippsels geht folgender Code. Hierbei können die Anzahl der Werte hinter ladeWert eine beliebige Anzahl haben, ebenso wie hinter "festerbegriff".
(Pfad zu den HTML-Dateien in Zeile 3 angeben und Startzelle in Zeile 7)
01.
Sub ImportHTML() 
02.
    'Pfad mit den HTML Dateien 
03.
    pfad = "C:\htmldateien" 
04.
    'Zielworksheet festlegen 
05.
    Set ws = Worksheets(1) 
06.
    'Startzelle setzen 
07.
    Set rngCurrent = ws.Range("A1") 
08.
    'Objekte erzeugen 
09.
    Set fso = CreateObject("Scripting.FilesystemObject") 
10.
    Set regex = CreateObject("VBScript.Regexp") 
11.
    'Eigenschaften für regex setzen 
12.
    regex.IgnoreCase = True 
13.
    regex.Global = True 
14.
    'HTML Dateien im Verzeichnis auflisten 
15.
    f = Dir(pfad & "\*.html") 
16.
    While f <> "" 
17.
        ' Inhalt der Datei holen 
18.
        strContent = fso.OpenTextfile(pfad & "\" & f, 1).ReadAll() 
19.
        'Regex Pattern zum extrahieren der gewünschten Fragmente 
20.
        regex.Pattern = "<h1 id=""eine_var1"">([\s\S]*?)</h1>[\s\S]*<span id=""eine_var2"" style=""color:(Blue|Yellow);"">([\s\S]*?)</span>[\s\S]*ladeWert\(\{([^}]*)[\s\S]*festerbegriff"":\[(\{[^\]]*\})" 
21.
        'Regex ausführen 
22.
        Set matches = regex.Execute(strContent) 
23.
        If matches.Count > 0 Then 
24.
            'Regex Submatches Variablen zuweisen 
25.
            strPart1 = matches(0).submatches(0) 
26.
            strPart2 = matches(0).submatches(2) 
27.
            strPart3 = matches(0).submatches(3) 
28.
            strPart4 = matches(0).submatches(4) 
29.
             
30.
            'Ersten Wert schreiben 
31.
            rngCurrent.Value = strPart1 
32.
            'Zweiten Wert schreiben 
33.
            rngCurrent.Offset(0, 1).Value = strPart2 
34.
             
35.
            ' Erstes Javascript Array auslesen 
36.
            col = 2 
37.
            arr = Split(strPart3, ",", -1, vbTextCompare) 
38.
            For i = 0 To UBound(arr) 
39.
                wert = Split(arr(i), ":", 2, vbTextCompare)(1) 
40.
                rngCurrent.Offset(0, col).Value = Trim(wert) 
41.
                col = col + 1 
42.
            Next 
43.
             
44.
            'zweites JavaScript Array auslesen 
45.
            regex.Pattern = """text"":""(.*?)"",""da"":""(.*?)""" 
46.
            Set matches = regex.Execute(strPart4) 
47.
            If matches.Count > 0 Then 
48.
                For Each Match In matches 
49.
                    rngCurrent.Offset(0, col).Value = Match.submatches(0) 
50.
                    rngCurrent.Offset(0, col + 1).Value = Match.submatches(1) 
51.
                    col = col + 2 
52.
                Next 
53.
            End If 
54.
        End If 
55.
        ' nächste Datei 
56.
        f = Dir 
57.
        ' aktuelle Zelle eins nach unten verschieben 
58.
        Set rngCurrent = rngCurrent.Offset(1, 0) 
59.
    Wend 
60.
     
61.
    Set fso = Nothing 
62.
    Set regex = Nothing 
63.
End Sub
Viel Spaß beim Lernen von Regular Expressions. Den Regex werde ich jetzt nicht bis ins letzte Detail erläutern, Infos zu Regulären Ausdrücken findest du zu Hauf im Netz.

Viel Erfolg
Grüße Uwe
Bitte warten ..
Mitglied: jojojo
27.07.2014, aktualisiert um 18:24 Uhr
Hallo Uwe,

vielen Dank. Mit der Beispiel html Datei funktioniert es.

Seit heute Morgen sitze ich am PC und versuche 3 Dinge zu modifizieren:

1. Weitere Informationen aus der html Datei auslesen:
Hier habe ich in Zeile 20 bei regex. Pattern entsprechende weitere Keywords/ Marker hinzugefügt. Außerdem ab Zeile 28 weitere Submatches-Zuweisungen ("strPart5 = matches(0).submatches(5)"...). Abhängig von der Art der Information habe ich die Werte auch "zum Schreiben" hinzugefügt ("rngCurrent.Value = strPart5"...). Mit dem Ergebnis, dass gar keine Infos mehr eingelesen werden?!

2. Beim Fehlen der Information/ des Suchfragments für die fehlende Information eine "0" in die Zelle schreiben. (Bei Arrays nur einmal eine 0):
Aktuell ist es so, dass wenn eine der Variablen in der html-Datei nicht vorkommt, die ganze html-Datei nicht berücksichtigt wird. Hier habe ich versucht, nicht vorhandene Variablen durch eine 0 zu ersetzen (If strPart1 > 0 "Wert schreiben" Else strPart1 = 0 ). Hatte keine Wirkung, allerdings funktioniert das Skript weiterhin, falls die Information vorhanden ist.

3. Beim Array nach "da" steht die Information teilw. nicht in Anführungszeichen.
Es kommt teilw. vor, dass die Information des Felds "da" ohne Anführungszeichen in der html-Datei steht. Das habe ich erst jetzt gemerkt. Also so:
"festerbegriff":[{"text":"Text, Text, noch mehr Text und weiterer Text.","da":falsch},{"text":"Ein weiterer Text mit noch mehr Inhalt.","da":falsch},
Die Information wird dann nicht mehr eingelesen. Hier fäll tmir auch keine Lösung ein.

Viele Grüße
Jojojo
Bitte warten ..
Mitglied: colinardo
LÖSUNG 27.07.2014, aktualisiert 29.07.2014
Zitat von jojojo:
1. Weitere Informationen aus der html Datei auslesen:
Hier habe ich in Zeile 20 bei regex. Pattern entsprechende weitere Keywords/ Marker hinzugefügt.
Arbeite dazu erst mal das verlinkte Tutorial oben durch, bevor du via Trial and Error dort Dinge einfügst, das wird sonst zu 95 % nichts. Reguläre Ausdrücke muss man erst verstehen sonst wirst du damit keinen Erfolg haben.
Außerdem ab Zeile 28 weitere Submatches-Zuweisungen ("strPart5 = matches(0).submatches(5)"...).
dazu müssen natürlich die entsprechenden Klammern an der richtigen Stelle im regex gesetzt werden.
Abhängig von der Art der Information habe ich die Werte auch "zum Schreiben" hinzugefügt ("rngCurrent.Value = strPart5"...).
du musst hier ja auch den richtigen Spalten-Offset angeben. rngCurrent ist immer die aktuelle Zeile in Spalte A im Worksheet, je nachdem in welche Spalte du also den Wert schreiben willst musst du einen Spaltenoffset wie beim zweiten und bei den anderen Werten angeben.

2. Beim Fehlen der Information/ des Suchfragments für die fehlende Information eine "0" in die Zelle schreiben.
(Bei Arrays nur einmal eine 0):
Aktuell ist es so, dass wenn eine der Variablen in der html-Datei nicht vorkommt, die ganze html-Datei nicht berücksichtigt
Das liegt daran das ich die Regex in einer einzigen zusammengefasst habe, welche alle Parts die zu extrahieren sind zusammenfasst, wenn hier einer fehlt trifft der gesammte Match nicht mehr. Bei Fehlen von bestimmten Teilen musst du den Pattern also aufsplitten und jeweils separat ausführen lassen.

3. Beim Array nach "da" steht die Information teilw. nicht in Anführungszeichen.
Es kommt teilw. vor, dass die Information des Felds "da" ohne Anführungszeichen in der html-Datei steht. Das habe
das ist kein Problem wenn der Regex in Zeile 45 folgendermaßen angepasst wird:
regex.Pattern = """text"":""([\s\S]*?)"",""da"":""?([^}]*?)""?\}"
Druch die zwei zusätzlichen Fragezeichen werden die Anführungszeichen optional. Zur Info, Einfache Anführungszeichen müssen innerhalb einer VBA-Zeichenfolge verdoppelt werden.

Grüße Uwe
Bitte warten ..
Mitglied: jojojo
29.07.2014 um 08:25 Uhr
Hallo Uwe,

vielen Dank für die Hinweise. Läuft jetzt so, wie ich mir das vorgestellt habe

Grüße
jojojo
Bitte warten ..
Mitglied: jojojo
29.07.2014 um 13:01 Uhr
... Noch eine kurze Follow-up-Frage:
Beim zweiten Array können im Inhaltsteil auch Gleichheitszeichen vorkommen. Das ist kein Problem, wenn sie in der Textmitte stehen. Wenn das "=" jedoch am Anfang steht, wie z.B. bei der folgenden Konstellation, erhalte ich jedoch ein "Laufzeitfehler 1004: Anwendungs- oder objektdefinierter Fehler" in Zeile 49:
"festerbegriff":[{"text":"=== ===
= == Text, Text, noch mehr Text und weiterer Text.","da":"1 Angabe"},

Eigentlich müsste das doch durch [\s\S]*? gefunden werden, oder?!
Ich habe es auch schon mit [=]*? versucht, in Zeile 45.

Hast du diesbezüglich einen Tipp?

Viele Grüße
jojojo
Bitte warten ..
Mitglied: colinardo
29.07.2014, aktualisiert um 13:38 Uhr
Zitat von jojojo:
Eigentlich müsste das doch durch [\s\S]*? gefunden werden, oder?!
yip, matcht quasi alles([\s\S]) lazy(?)
Hast du diesbezüglich einen Tipp?
Ja, ein Gleichheitszeichen am Anfang eines Zellwertes interpretiert Excel als eine Formel ! Du musst den Wert beim schreiben in die Zelle also mit einem einfachen Hochkomma (') maskieren.
Bitte warten ..
Mitglied: jojojo
29.07.2014 um 14:44 Uhr
Der Fehler muss bei dir woanders liegen ... der Regex ist in Ordnung.

Ne. Funktioniert im Ursprungscode auch schon nicht, wenn das Bsp. wie oben beschrieben aussieht.
Bitte warten ..
Mitglied: colinardo
LÖSUNG 29.07.2014, aktualisiert um 15:28 Uhr
Zitat von jojojo:
Ne. Funktioniert im Ursprungscode auch schon nicht, wenn das Bsp. wie oben beschrieben aussieht.
siehe mein korrigierter Kommentar ...
Ein Gleichheitszeichen am Anfang eines Zellwertes interpretiert Excel als eine Formel ! Du musst den Wert beim schreiben in die Zelle also mit einem einfachen Hochkomma (') maskieren.
rngCurrent.Offset(0, col).Value = "'" & Match.submatches(0)
Bitte warten ..
Mitglied: jojojo
29.07.2014 um 15:27 Uhr
Zitat von colinardo:
rngCurrent.Offset(0, col).Value = "'" & Match.submatches(0)


Jo. Super. Klappt!
Viele, vielen Dank.
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Microsoft Office
gelöst Excel VBA Letzte Zelle Suchen dann rechnen und Wert in Zelle Übertragen (3)

Frage von Addi089 zum Thema Microsoft Office ...

VB for Applications
Excel VBA Sortierung von Daten (5)

Frage von easy4breezy zum Thema VB for Applications ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...