mabue88
Goto Top

Rekursiver Datentyp nicht möglich, Alternativen?

Hallo,

in einem VBA-Programm soll der Inhalt einer HTML-Seite verarbeitet werden. Dafür hätte ich mir gerne eine eigenen Datentyp erstellt, in dem ich die HTML-Elemente ähnlich der Ordnerstruktur in Windows Explorer einsortieren kann. Der HTML-Quellcode liegt als String vor. Den Datentyp wollte ich so in VBA erstellen:

Type myHTMLElement
    DefinitionLine As String
    Content as String
    Children() As myHTMLElement
End Type

Beim Erstellen einer Variable des Datentyps kommt die Fehlermeldung:
"Fehler beim Kompilieren: Wechselseitige Abhängigkeit von Modulen"

Hier ein Beispiel HTML-Code, der in der folgenden Art in einem Datentyp abgelegt werden soll:

<html>
    <head>
        <title>Beispieltitel</title>
    </head>
    <body>
        Das ist der Body
    </body>
</html>

Meine "Wurzelvariable" heisst HTML.

HTML.DefinitionLine = "<html>"
HTML.Children(0).DefinitionLine = "<head>"
HTML.Children(0).Children(0).DefinitionLine = "<title>"
HTML.Children(0).Children(0).Content = "Beispieltitel"
HTML.Children(1).DefinitionLine = "<body>"
HTML.Children(1).Children(0).Content = "Das ist der Body"


Welche Möglichkeiten habe ich hierfür in VBA?

Content-Key: 236650

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

Printed on: April 18, 2024 at 03:04 o'clock

Member: colinardo
colinardo Apr 28, 2014 updated at 15:56:20 (UTC)
Goto Top
Hallo mabue,
nur das wir uns nicht missverstehen du meinst VBA (Visual Basic for Applications) und nicht VB.Net ?
In VBA geht das z.B. mit dem InternetExplorer Objekt. Das kann dein HTML aus deinem File laden, und dann kannst du es mit den Standard-DOM-Methoden bearbeiten und auslesen.

Beispiel:
'IE Objekt erstellen  
Set objIE = CreateObject("InternetExplorer.Application")  

'HTML Dokument laden  
objIE.Navigate "C:\test.html"  
Set doc = objIE.Document

' HTML-Body Element holen  
Set bodyNode = doc.getElementsByTagName("body")(0)  

'Neues Element und einem Textnode erstellen  
Set divNode = doc.createElement("div")  
Set textNode = doc.CreateTextNode("Das ist ein Testtext in einem DIV-Container")  

' Textnode an das DIV anhängen  
divNode.appendChild(textNode)

'das neue Element in den Body einfügen  
bodyNode.appendChild(divNode)

'HTML testweise in einer MessageBox ausgeben  
MsgBox doc.documentElement.outerHTML

'IE schließen  
objIE.Quit
Set objIE = Nothing
Set doc = Nothing
Grüße Uwe
Member: mabue88
mabue88 Apr 28, 2014 at 14:05:49 (UTC)
Goto Top
Hallo Uwe,

du hast mich richtig verstanden, ich meine Tatsächlich VBA (Visual Basic for Applications). Ich verwende die Sprache gerne in Kombination mit Excel, da für ihre Ausführung auf Geschäftsrechnern nur Office installiert sein muss (ich habe noch keinen normalen Geschäfts-Arbeitsplatzrechner gesehen, auf dem das nicht installiert war). Der Austausch geschieht über eine Exceldatei. Nichts muss installiert werden...

Ich werde mir deinen Vorschlag heute abend mal genauer anschauen und mich dann wieder melden.

Danke schon mal!

Gruss
mabue
Member: mabue88
mabue88 Apr 29, 2014 at 08:53:53 (UTC)
Goto Top
Hallo Uwe,

ich hab mir gestern mal deinen Vorschlag angesehen. Prinzipiell ist es genau das, was ich will. Aber gibt es keine Möglichkeit das in einem weniger umfangreichen Datentyp abzulegen?

Danke schon mal!
Gruss
mabue
Member: colinardo
colinardo Apr 29, 2014 updated at 09:07:17 (UTC)
Goto Top
weniger umfangreichen Datentyp
was ist hier Umfangreich ? Der IE ist doch sowieso auf jedem Rechner verfügbar. Womit begründet sich dein Wunsch ?
Dann bau dir halt eine COM-Bibiliothek mit Visual Studio die deine gewünschte Funktionalität implementiert und binde sie mit CreateObject() in dein VBA ein. Dann hast du aber die zusätzliche Aufgabe die Bibliothek auf den Clients zu registrieren. Ansonsten musst du dir die Funktionalität mit Regex selber nachbauen...

Grüße Uwe