Microsoft Excel

Herbers Excel/VBA-Archiv

Frage an Zwenn! Script


Betrifft: Frage an Zwenn! Script von: Martin
Geschrieben am: 09.07.2017 08:42:13

Hallo Zwenn,

wegen dem Script wollte ich fragen ob Du das mir noch fertig stellen kannst. Ich weiß leider nicht weiter wie ich an die Daten ran komme.

Lg Martin

  

Betrifft: AW: Frage an Zwenn! Script von: Martin
Geschrieben am: 09.07.2017 10:36:07

Hallo Zwenn,

die Adresse mit dem tag
schaffe ich nicht!
Und dort wo ich die Faxnummer auslese aber nicht immer eine drinnen steht versetzt er mir hin und wieder die anderen Felder von der E-Mail Adresse und der Web Adresse in die falsche Spalte.

Habe das Update hier:
https://www.herber.de/bbs/user/114777.xlsm

Lg Martin


  

Betrifft: Zeitknappheit, aber Hilfe zur Selbsthilfe von: Zwenn
Geschrieben am: 09.07.2017 15:30:41

Hallo Martin,

die kommende Woche werde ich zu nix kommen, weil ich zwar Urlaub, aber Besuch habe. Im Grunde genommen bist Du doch auch auf dem richtigen Weg. Du musst nur noch mehr verinnerlichen, was das Makro eigentlich macht, an den Stellen, die Dir Probleme bereiten.

Zuordnung der Kontaktdaten zu den richtigen Spalten:
Du hast das Auslesen der Daten immer nach dem gleichen Muster gestaltet. Das kann man machen. Das System ist aber recht flexiebel und das Einizige, was sich bei TelNr, FaxNr, Mail Adresse und Web Adresse ändert, ist der Index des Datenfeldes, in dem diese Werte drin stehen.

Du liest die TelNr. aus mit:

knotenAst.GetElementsByTagName("dd")(0)

Die FaxNr mit:
knotenAst.GetElementsByTagName("dd")(1)

Die Mail Adresse mit:
knotenAst.GetElementsByTagName("dd")(2)

Die Web Adresse mit:
knotenAst.GetElementsByTagName("dd")(3)

Das sind 4 Felder, die im Grunde aus dem gleichen Array stammen. Dieses wird aufgebaut durch:
.GetElementsByClassName("tk-box tk-blue-gradient tk-supplier-detail-class")(0)

Wenn auf der auszulesenden Seite aber eines der Elemente fehlt, in der Regel ist das die FaxNr., dann ist Element 2 des Arrays, mit dem Index 1 bereits die Mail Adresse. Das gibt die Seitenstruktur so vor. Es wird kein Platzhalter für die FaxNr. in der HTML Struktur vorgesehen. Wozu auch?

Du musst also prüfen, ob es eine FaxNr. gibt oder nicht. Das machst Du, indem Du den ausgelesenen Wert, der eigentlich die FaxNr. ist, auf das @-Zeichen prüfst. Ist es enthalten, ist es mit Sicherheit keine FaxNr. sondern es muss bereits die Mail Adresse sein. Für die Web Adresse kannst Du prüfen, ob die ersten 4 Zeichen des ausgelesenen Strings http lauten.

Anhand dieser Vergleiche kannst Du die Splalten, in die der jeweilige Wert geschriebnen werden soll, auswählen. Das läuft in beiden Fällen über eine einfache If-Then-Else Struktur.

Eine weitere Möglichkeit, um zu Prüfen welcher ausgelesene Wert welche Entität reprtäsentiert ist, die davor zugeordneten Werte als Schlüssel zu verwenden. In den dt-Tags steht ja vorher immer drin, um was es sich beim nächsten dd-Tag handelt. Tel: = Telefonnummer, Fax: = Fax Nummer, usw. Diese Aufschlüsselung kannst Du verwenden, wenn Du sicher gehen willst, ob der erste Wert eine Telefon- oder FaxNr. ist. Denn diese Nummern haben das gleiche Muster im Aufbau des eigentlichen Wertes und man kann sie nicht anders unterscheiden. Ich habe allerdings bisher keinen Anbieter gesehen, der an dieser Stelle keine Telefonnummer eingetragen hat.

Auseinanderpflücken der Adresse
Du liest die richtige Information bereits aus mit:
knotenAst.GetElementsByTagName("address")(0)

Hier besteht das Problem nun darin, dass Du diesen Block über keinen der DOM Befehle getElementsBy... weiter aufschlüsseln kannst. Man könnte versuchen über nexChild und nextSibling zu gehen, um damit wirklich den Pfad durch den DOM-Baum zu beschreiten. Das würde ich in diesem Fall aber nicht machen.

Es dürfte wesentlich einfacher sein, den Informationsblock nicht direkt mit innertext auszugeben, sondern mit innerHTML in eine String-Variable zu schreiben und dann mit String-Operationen in seine gewünschten Bestandteile zu zerlegen. Der Unterschied zwischen innertext und innerHTML besteht darin, dass innertext die HTML-Tags im Ergebnisstring weglässt, während innerHTML die Tags beinhaltet. Du musst einen dieser Wege beschreiten, um den Inhalt der Objektvariable knoten bzw. knotenAst in die weiter verarbeitbare reine Textform zu bekommen. Also einen String zu erzeugen.

Deine ersten Trennstellen sind die [br /] Abschnitte. Du kannst diese Zeichenkette verwenden, um Straße mit Hausnummer und Postleitzahl mit Ort zu separieren. Straße und Hausnummer kannst Du direkt in die richtige Spalte schreiben. Postleitzahl und Ort brauchst Du dann nur noch über split auseinander nehmen und in die richtigen Spalten schreiben.

Berechnete Werte
Wenn Du das soweit fertig hast, kommst Du in den Zahlenbereich, den ich in der Zieltabelle mit einer Kopfzeile in unterschiedlichen Blautönen versehen habe. Die Blautöne sind der entsprechenden Tabelle der Anbieterseiten entnommen. Da sind also auch die aufgenommen, die sich aus anderen auszulesenden Werten berechnet haben. Diese Berechnungen solltest Du nicht auslesen, sondern gib Formeln in den entsprechenden Spalten aus, die die zugehörigen Werte summieren.

Z.B. ergibt sich der Energiepreis aus Arbeitspreis gesamt + Grundpauschale

Ausserdem zu berechnende Felder sind Netztarif, Steuern und Abgaben, Nettogesamtpreis, Umsatzsteuer und Bruttogesamtpreis

Die restlichen Datenfelder
Der Rest der Werte wird dann wieder ausgelesen wie die ersten Werte. Du musst innerhalb der Gruppen nur darauf achten, dass Du entsprechende Prüfungen für die Spaltenzuordnung einbaust, wie für FaxNr. und Mail Adresse, falls notwendig.

Weitere Überlegungen
Solltest Du während des Auslesens daruaf kommen, dass "irgendetwas" beim Auslesen durcheinander kommt, kann es sein, dass es noch Datenfelder gibt, die ich nicht gefunden habe. Diese musst Du dann nachpflegen oder überspringen, damit das Makro wieder richtig läuft.

Die Grafiksymbole, von denen ich neulich schrieb, befinden sich in der Anbieterübersicht in der jeweiligen Anbieterzeile. Die Legende dazu findest Du auf den Anbieterseiten selbst ganz unten.

Die Insolvenz, die ich gesehen habe, wurde nicht direkt ausgegeben, sondern es wird in Sonderfällen über das orangene Symbol mit dem Ausrufezeichen darin signalisiert, dass eine wichtige Information zum entsprechenden Unternehmen vorliegt. Du kannst die Texte, die dazu aufploppen, wenn man mit dem Mauszeiger drüberfährt, auch auslesen und in eine eigene Spalte Deiner Excel-Tabelle schreiben.

Die Spalten in Deiner Datentabelle sind bisher nicht formatiert. Du solltest z.B. die TelefonNrn. und FaxNrn. Spalte als Text formatieren. Sonst gehen Dir bei Vorwahlen unter Umständen die führenden Nullen verloren. Alle Betragsfelder kannst Du mit der Euro Währung formatieren. Ansonsten musst Du mal sehen, was sinnvoll für Dich ist.

Das ist jetzt für die nächste Woche die Hilfestellung, die ich Dir geben kann. Ich hoffe das hilft Dir.

Viele Grüße,

Zwenn


Beiträge aus den Excel-Beispielen zum Thema "Frage an Zwenn! Script"