Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: jojojo

jojojo (Level 1) - Jetzt verbinden

26.07.2014, aktualisiert 22:36 Uhr, 4098 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 ..
Ähnliche Inhalte
VB for Applications

Excel VBA Formel "WENN" einfügen

gelöst Frage von chef1568VB for Applications2 Kommentare

Hallo zusammen, ich möchte per Excel-Makro folgende Formel eintragen: EXCEL: VBA: Leider bekomme ich hier immer einen anwendungsrelevanten Fehler ...

VB for Applications

Mit VBA im Monatskalender Datum suchen - aus anderer Datei einfügen

gelöst Frage von Otto1699VB for Applications6 Kommentare

Hi, eigentlich eine einfache Sache, aber ich dreh mich im Kreis. Ich suche eine Lösung für Excel 2010 VBA ...

Microsoft Office

Bilder in Excel automatisch einfügen

gelöst Frage von GundelputzMicrosoft Office2 Kommentare

Hallo alle da draussen, ich möchte in Excel ein Angebot erstellen welches mir auf Grund der Artikelnummer ein Bild ...

Microsoft Office

Excel mit VBA: Bild aus dem Internet einfügen

gelöst Frage von peterhaMicrosoft Office2 Kommentare

Hallo zusammen, ich habe gestern etliche vba-Schnipsel ausprobiert, aber keines hat so richtig hingehauen Ich möchte: Ein Bild aus ...

Neue Wissensbeiträge
Humor (lol)
IoT-Gefahr: Smartes Aquarium leckt!
Information von Lochkartenstanzer vor 19 StundenHumor (lol)3 Kommentare

Moin, Die IoT-Manie hat weitere Opfer gefunden. Ein Casino-Leck durch ein smartes Aquarium: Allerdings haben sie kein Wasser, sondern ...

Router & Routing

Alte Fritzbox 7270 mit VPN und SIP-Telefonie hinter O2 Homebox 6641 als "Modem"

Erfahrungsbericht von the-buccaneer vor 1 TagRouter & Routing3 Kommentare

Nun war es soweit: Auch O2 hat mich mit VOIP zwangsbeglückt. Heute am Privatanschluss, in 2 Wochen ist das ...

Sicherheit

Ungepatchte Remote Code Execution-Lücke in LG NAS

Information von kgborn vor 1 TagSicherheit

Nutzt wer LG NAS-Einheiten? In den NAS-Einheiten der LG Network Storage-Einheiten gibt es eine sehr unschöne Schwachstelle, die einen ...

Windows Update

Neue Version KB4099950 NIC Einstellungen gehen verloren

Information von sabines vor 1 TagWindows Update2 Kommentare

Es ist eine neue Version des KB4099950 verfügbar, die das Problem mit den verlorenen Netzwerkeinstellungen lösen soll. Das Datum ...

Heiß diskutierte Inhalte
Sicherheit
Verbindliche Zustellung per E-Mail?
Frage von ahussainSicherheit18 Kommentare

Hallo allerseits, ein Kunde von mir nutzt intensiv Fax. Hauptgrund: zusammen mit einer Empfangsbestätigung ist eine verbindliche Zustellung gewährleistet. ...

Sonstige Systeme
Wie Normenkataloge im Unternehmen bereit stellen?
Frage von MuzzepuckelSonstige Systeme14 Kommentare

Hallo Kollegen, ich lese schon lange hier mit, nun mein ersrer Beitrag, bzw. Frage. :-) Wir benötigen für unsere ...

Linux Netzwerk
Raspberry Pi 3: WLAN Power save deaktivieren
Frage von nordie92Linux Netzwerk13 Kommentare

Moin moin, mein Raspberry Pi 3 Model B benötigt eine dauerhaft aktive WLAN-Verbindung. Leider bricht die WLAN-Verbindung nach einigen ...

SAN, NAS, DAS
Entscheidung SAN Dell oder HP
Frage von VincorSAN, NAS, DAS13 Kommentare

Hallo, wir wollen uns für unsere Hyper V Umgebung eine neue SAN Anschaffen. Es laufen 30 VM's darunter, DC; ...