VBA Frontpage - Suche in Webseiten

Hallo,

ich möchte gerne mit einem VBA-Makro in Frontpage Webseiten nach speziellen Suchbegriffen im Quelltext durchsuchen. Ich stelle mir ein Suchfenster vor, in dem die Webseite und der Suchbegriff eingegeben wird. Frontpage soll die Seite dann laden und den Quelltext durchsuchen. Als Trefferset soll dann eine Excel-Liste erstellt werden.

Sicherlich kann man das ganze auch mit irgendwelchen anderen Programmiersprachen lösen - mich würde es aber mit VBA interessieren. Zudem möchte ich mit den Ergebnissen dann auch mit VBA weiterarbeiten und will mich nicht extra in eine neue Programmiersprache einarbeiten.

Leider habe ich zu VBA & Frontpage im Zusammenhang mit dem Laden von Internetseiten nichts passendes im WWW gefunden…

MfG

Stefan

Trotzdem eine Alternative

Hallo Stefan,

ich würde es mit VBS (Visual Basic Script) lösen, das ist fast das Gleiche wie VBA und Du kannst direkt auf den Internet Explorer zugreifen. Das Auslesen des Quelltextes ginge dann über innerHTML, nachdem Du ein Objekt vom IExplorer erstellt hast. Und auch mit VBS kann man auf Excel-Objekte zugreifen.

Schöne Grüße,

Mohamed.

Hallo Mohamed,

hast Du da einen fertigen Code?
Das muss dann nicht als .vbs laufen, der Code funktioniert dann mit wenigen Änderungen auch in VBA.

Gruß, Rainer

Hallo Rainer,

würde Dir auch ein Code reichen der unter VB läuft und eine Inet Seite öffnet, diese ausliest und nach etwas bestimmten gesucht wird?
Diesen Source koennte man doch dann nach VBA umbasteln :smile:

MfG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Alex,

würde Dir auch ein Code reichen der unter VB läuft und eine
Inet Seite öffnet, diese ausliest und nach etwas bestimmten
gesucht wird?
Diesen Source koennte man doch dann nach VBA umbasteln :smile:

ja, das wird Stefan reichen. Poste den Code doch mal, ich versuche ihn dann so umzustricken, daß er mit VBA läuft.

Gruß, Rainer

Hallo Rainer,

ein paar Infos brauche ich noch. Soll die zu ladende Seite sichtbar sein oder nicht? In welcher Form möchte er denn die gefundenen Daten wiederhaben? Dürfen ActiceX Objecte verwendet werden? Soll eine Prüfung stattfinden ob man online ist ?

MfG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Alex,

ein paar Infos brauche ich noch. Soll die zu ladende Seite
sichtbar sein oder nicht? In welcher Form möchte er denn die
gefundenen Daten wiederhaben? Dürfen ActiceX Objecte verwendet
werden? Soll eine Prüfung stattfinden ob man online ist ?

ich weiß auch nicht mehr, als im Ursprungsposting steht.

Gruß, Rainer

Hallo Rainer,

naja macht nichts :s
Ich habe aber mal wieder chronischen Zeitmangel :frowning:
Deshalb habe ich dir mal den Ansatz schnell getippselt.
Das was da noch fehlt, bekommst du selber hin :smile:

Es werden keine Verweise oder ActiveX Objecte benötigt :smile:

Option Explicit

Private Function GetDataFromUrl(Url As String) As String
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = False ' Nicht Sichtbar!
IE.Navigate Url ' Url laden
Do
 DoEvents
Loop Until IE.readystate = 4 ' Seite fertig geladen
'Welche Daten möchten wir?
'InnerHTML=(Inhalt eines Elements als HTML)
'OUTERHTML=(Elementinhalt plus äußeres HTML)
'INNERTEXT=(Inhalt eines Elements als Text)
'OUTERTEXT=(Elementinhalt plus äußerem Text)
'Anzeigen der Daten
Debug.Print IE.document.documentelement.innertext
Debug.Print IE.document.documentelement.innerhtml
Debug.Print IE.document.documentelement.outertext
Debug.Print IE.document.documentelement.outerhtml
'Zuweisung über
GetDataFromUrl = IE.document.documentelement.outerhtml
'hier noch den Internet Explorer schliessen!!!!
End Function

Private function SucheDaten(Daten As String) as deinRueckgabewert
 'hier die Daten aus dem String suchen, mit Instr :smile:
End Sub

Private Sub cmdSearch()
 Call SucheDaten(GetDataFromUrl("DeineWebseite.de"))
End Sub

Nen bissl komplizierter wird es, wenn die Webseite mit Frames arbeitet. Aber die Info’s haben wir ja nicht :S

Du musst hier eigentlich nur noch das schliessen des MIE veranlassen.
Die Webseite kennt er ja, ergo ist es ein Klacks das Fenster zu finden und dann zu beenden.

In der Function SucheDaten hast du nun, den Inhalt der Webseite. Diesen String musst du eigentlich nur noch durchsuchen :smile:

In der Function GetDataFromUrl sollte man noch eine Routine einbauen, das wenn die Seite zu lange zum laden dauert das diese dann abgebrochen wird.
Auch sollte man prüfen ob der MIE im Online Modus ist etc.
Wenn du das Project testest, überwache mal die Variable IE. Da siehst du was du alles für möglichkeiten hast :smile:

MfG Alex

1 Like

Hi Alex,

danke für die Unterstützung, ich mache mich gleich morgen daran, wenn ich ein Exel unter den Fingern habe.

Gruß, Rainer

Hallo ihr,

irgendwie hab ich nur nach dem erste Posting eine Email-Benachrichtigung bekommen. Zwischenzeitlich hat sich ja schon ziemlich viel getan.

Also die Funktion bräuchte ich von einem Firmen-Intranet aus. Und daher kann ich auch kein VBS laufen lassen, weil wir gar kein VB haben. VBA läuft aber prima und ist auch von den Sicherheitsrichtlinien erlaubt.

Die zu durchsuchenden Seiten sind i.d.R. ohne Frames und ohne irgendwelche Applets. Mir geht es auch nur um die Infos, die im normalen Quelltext drinstehen. Die Seiten schauen immer gleich aus, weswegen gut ein Skript laufen kann.

Stellt euch einfach eine Intranet bzw. Internetseite vor, die anhand einer ID in der Adresse aufgerufen werden kann:

www.intranet.de/seite[Zahl].html

Ich hab eine Liste mit allen Zahlen, die zu den relevanten Seiten führen. Die kann ich entweder in einer Excel-Tabelle ablegen, oder aber in einem Textstream, zum auslesen mit VBA.

Das VBA-Skript soll jetzt jeweils die Seite aufrufen, dann im Quelltext nach einer bestimmten Zeichenfolge suchen und ausgeben, was dahinter steht.

Bsp: Suche nach Text " Verantwortlicher"
Falls Text gefunden - trage den Namen des Verantwortlichen in die Excel-Liste ein

Dadurch kann ich z.B. den aktuellen Verantwortlichen der entsprechenden Seite in einer Excel-Liste aktuell eintragen lassen etc.

Die Anwendung klingt vielleicht etwas sinnlos - ich brauche bei uns in der Firma aber genau diese Möglichkeit, weil alles andere ziemlich schwierig zum Auswerten ist und die Liste mit den Nummern ziemlich lang ist.

Danke schon einmal für eure Hilfe!

MfG aus München

Stefan Bauer

Hallo Stefan,

irgendwie hab ich nur nach dem erste Posting eine
Email-Benachrichtigung bekommen.

die Benachrichtigung bekommt immer der, auf dessen Beitrag geantwortet wurde, das ist schon richtig so. :smile:

Also die Funktion bräuchte ich von einem Firmen-Intranet aus.
Und daher kann ich auch kein VBS laufen lassen, weil wir gar
kein VB haben.

Für VBS brauchst Du nur Windows. Weil Du das ergebnis aber in eine Exceltabelle schreiben willst bauen wir das gleich mit Excel und bauen uns da eine passende Userform.

VBA läuft aber prima und ist auch von den
Sicherheitsrichtlinien erlaubt.

Gut.

Bsp: Suche nach Text " Verantwortlicher"
Falls Text gefunden - trage den Namen des
Verantwortlichen in die Excel-Liste ein

OK, ich bau dann nachher mal eine Userform, die eine Website aufruft, Dir den Text sucht und eine Prozedur aufruft, die die Werte dann in die Tabelle schreibt.
Für den ersten Teil hat Alex ja schon geholfen, wenn Du den letzten Teil nicht selbst hin bekommst, muß uns Reinhard helfen, das kann ich nämlich auch nicht. :smile:

Ein paar Stunden dauert es aber noch, ich muss erst mal in eine Besprechung, in der Mittagspause habe ich Zeit.

Gruß, Rainer

Code - schreiben in Excel fehlt - REINHARD !! :smile:
Hallo Stefan,

ich habe mal noch etwas dazu getippt, eigentlich hatte Alex aber schon alles Wesentliche fertig.

Erst musst Du in Excel zu einer Userform kommen, Du weißt wie? Sicherheitshalber tippe ich es mal.

In Excel auf ‚Ansicht‘ -> ‚Symbolleisten‘ VBA aktivieren.
Dort den Entwurfsmodus aktivieren. (Zeichendreieck)
Den Editor aufrufen (zwei Button weiter links)
Userform hinzufügen. (Einfügen -> Userform)

Dann kommt auf die Userform ein CommandButton (Schaltfläche), ein Textfeld und zwei Label. Das erste Label etwas größer, das zweite muss nur eine Zeile sein.

Am oberen Rand des Projektfensters klickst Du dann ganz links auf ‚Code anzeigen‘.

Dann fügst Du den Code hier ein:

Option Explicit

Dim zl() As String

Private Sub UserForm\_Click()
 'Die Vorbereitungen sind nur für diesen Test nötig.
 Label1.Caption = ""
 Label2.Caption = ""
 Text1.Text = "http://www.wer-weiss-was.de"
 CommandButton1.Caption = "Laden"
End Sub

Private Sub CommandButton1\_Click()
 Dim po1 As Long
 Dim po2 As Long
 Dim Txt As String

 Dim su\_Start As String
 Dim su\_Ende As String

 'Nur mal eine Probe mit w-w-w
 Txt = GetDataFromUrl(TextBox1.Text)
 Label1.Caption = Txt 'Nur zur Kontrolle mal anzeigen, die Zeile kann weg.
 'Zur Demonstration den Titel im zweiten Label ausgeben
 po1 = InStr(Txt, "") + 7 'Anfang des Titels suchen, 7 ist die länge des Tags
 po2 = InStr(po1, Txt, "") 'Ende des Titels suchen
 Label2.Caption = Mid(Txt, po1, po2 - po1)

 'Vorbereitung für Deine Suche
 su\_Start = " Verantwortlicher"
 su\_Ende = " "
 po1 = 1
 po2 = 1
 ReDim zl(0)
 While po1 0 And po2 0
 po1 = InStr(po2, Txt, su\_Start)
 If po1 0 Then
 po1 = po1 + Len(su\_Start)
 po2 = InStr(po1, Txt, su\_Ende)
 If po2 0 Then
 ReDim Preserve zl(1, UBound(zl) + 1)
 zl(UBound(zl)) = Mid(Txt, po1, po2 - po1)
 End If
 End If
 Wend
 'Prozedur aufrufen, die den Inhalt des Arrays Zl() in die Excel-Tabelle schreibt.
End Sub

Private Function GetDataFromUrl(Url As String) As String
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = False ' Nicht Sichtbar!
IE.Navigate Url ' Url laden
Do
 DoEvents
Loop Until IE.readystate = 4 ' Seite fertig geladen
'Welche Daten möchten wir?
'InnerHTML=(Inhalt eines Elements als HTML)
'OUTERHTML=(Elementinhalt plus äußeres HTML)
'INNERTEXT=(Inhalt eines Elements als Text)
'OUTERTEXT=(Elementinhalt plus äußerem Text)
'Anzeigen der Daten
'Debug.Print IE.document.documentelement.innertext
'Debug.Print IE.document.documentelement.innerhtml
'Debug.Print IE.document.documentelement.outertext
'Debug.Print IE.document.documentelement.outerhtml
'Zuweisung über
GetDataFromUrl = IE.document.documentelement.outerhtml
'IE wieder schließen
Set IE = Nothing
End Function

Und kannst das Projekt schon mal starten.
So lange im Textfeld noch w-w-w steht, wird im ersten Label der Quelltext von w-w-w angezeigt, im zweiten Label der Titel von w-w-w, das Array bleibt leer.

Trägst Du in das Textfeld Deine URL ein, bleibt eventuell das zweite Label leer, das Array Zl() wird ab Zl(1) bis Zl(Ubound(zl)) mit den Daten gefüllt, die Du suchen wolltest.

Wie die in die Exceltabelle kommen, weißt Du entweder selbst, oder Reinhard hilft uns. :smile:

Gruß, Rainer

Hallo Rainer,

wie ich sehe, warst du fleissig gewesen :smile:

Was ich aber noch sagen wollte und was fehlt, ist …

Der IE wird geöffnet ( unsichtbar) Dort wird die Seite geladen!
Danach wird der Quelltext ausgelesen. Für sein Vorhaben, sollte InnerText reichen :smile:
Dazu musst du die Zuweisung abändern :smile:

GetDataFromUrl = IE.document.documentelement.innertext

Auch die Anzeigen (Debug.print) kannst du entfernen. Waren ja nur zu Testzwecken da :smile:, genauso wie die Kommentare

Die Instanz des IE läuft aber noch! Diese muss beendet werden und das muss noch in die Function mit rein :smile:
Auch sollte dort noch ein Timer mit rein, der besagt wenn die daten nicht binnen x Sekunden geladen sind, so breche ab :smile:
Das kannst du sehr gut in der Do Loop Schleife realisieren :smile:

MfG Alex

Hi Alex,

wie ich sehe, warst du fleissig gewesen :smile:

das war ja schon fertig, Du hast mir kaum etwas gelassen. :frowning:

Was ich aber noch sagen wollte und was fehlt, ist …

Der IE wird geöffnet ( unsichtbar) Dort wird die Seite
geladen!
Danach wird der Quelltext ausgelesen. Für sein Vorhaben,
sollte InnerText reichen :smile:
Dazu musst du die Zuweisung abändern :smile:

GetDataFromUrl = IE.document.documentelement.innertext

OK, das dürfte ankommen, den Beitrag möchte ich nicht ändern.

Auch die Anzeigen (Debug.print) kannst du entfernen. Waren ja
nur zu Testzwecken da :smile:, genauso wie die Kommentare

Die habe ich absichtlich nicht entfernt, dann sieht man, welche Möglichkeiten es noch gibt. Das ist schon perfekt, wie Du das gemacht hast, das lasse ich so. :smile:

Die Instanz des IE läuft aber noch! Diese muss beendet werden
und das muss noch in die Function mit rein :smile:

Reicht das ‚Set IE = Nothing‘ nicht?

Auch sollte dort noch ein Timer mit rein, der besagt wenn die
daten nicht binnen x Sekunden geladen sind, so breche ab :smile:
Das kannst du sehr gut in der Do Loop Schleife realisieren :smile:

OK, bau ich noch. :smile:

Gruß, Rainer

Hi Alex,

Hallo Rainer,

das war ja schon fertig, Du hast mir kaum etwas gelassen. :frowning:

Naja ein wenig schon :smile: Den Source kann man noch so schoen modifizieren, sprich, ist man Online ? Ist der IE installiert?
Ist er im Online oder Offline Modus und und und :smile:

Auch die Anzeigen (Debug.print) kannst du entfernen. Waren ja
nur zu Testzwecken da :smile:, genauso wie die Kommentare

Die habe ich absichtlich nicht entfernt, dann sieht man,
welche Möglichkeiten es noch gibt. Das ist schon perfekt, wie
Du das gemacht hast, das lasse ich so. :smile:

Ok, überredet :smile:

Die Instanz des IE läuft aber noch! Diese muss beendet werden
und das muss noch in die Function mit rein :smile:

Reicht das ‚Set IE = Nothing‘ nicht?

Nein, das ist eigentlich überfluessig, denn IE wird in der Function declariert. Wenn nun die Function verlassen wird, so verliert auch die Variable IE ihre Gueltigkeit. Ich habe es nur zur Schoenheit mit hingeschrieben :smile:

Solange IE declariert ist und nicht auf Nothing gesetzt ist, so kannst du auf die Eigenschaften des IE zugreifen. Zum Bsp. bei der Zuweisung
wenn du nun davor IE auf Nothing setzt, bekommst du eine Fehlermeldung :wink:

Der IE aber selbst ist ja gestartet (unsichtbar) und nicht geschlossen :smile: Also muss man des noch von Hand machen :smile:

Nur mal ein kleines Demo, was ich in jeden Project mache.

Erstelle mal ein Project. Darauf 4 Button und folgenden Code

'Code in der Form1
Option Explicit

Dim Stat As Boolean
Dim beenden As Boolean
Dim msgo As Boolean
Dim msgw As Boolean

Private Sub Command1\_Click()
Dim maus As New WaitCursor
 Call maus
 Timer1.Enabled = True
 Command2.Enabled = True
 Do
 DoEvents
 Label1.Caption = IIf(Stat, "0000", "0001")
 If msgo Then
 Set maus = Nothing
 MsgBox "Mauszeiger wieder normal, wird aber gleich wieder umgeschalten!"
 msgo = False
 Call maus
 End If
 If msgw Then
 MsgBox "Mauszeiger als Waitcursor!"
 msgw = False
 End If
 Loop Until beenden
End Sub

Private Sub Command2\_Click()
 beenden = True
End Sub

Private Sub Command3\_Click()
 msgo = True
End Sub

Private Sub Command4\_Click()
 msgw = True
End Sub

Private Sub Form\_Load()
Command1.Caption = "Test starten"
Command2.Caption = "Sub verlassen"
Command2.Enabled = False
Command3.Caption = "Msg anzeigen(Orginaler Mauszeiger)"
Command4.Caption = "Msg anzeigen ( Waitcursor)"
Label1.AutoSize = True
Label1.Caption = ""
Timer1.Interval = 500
Timer1.Enabled = False
End Sub

Private Sub Timer1\_Timer()
 Stat = Not (Stat)
End Sub

'Klasse erstellen, namens WaitCursor
'in den Procedure Eigenschaften stelle mal in der Klasse die Sub Show 
'als Default ein :smile: ( Procedure ID)
'Dann folgender Source :smile:

Option Explicit

Private mPrevMousePointer As Long

Private Sub Class\_Initialize()
 mPrevMousePointer = vbDefault
End Sub

Public Sub Show()
 With Screen
 mPrevMousePointer = .MousePointer
 .MousePointer = vbHourglass
 End With
End Sub

Private Sub Class\_Terminate()
 Screen.MousePointer = mPrevMousePointer
End Sub

Schau Dir das mal an :smile:

OK, bau ich noch. :smile:

Fein :smile:

Aber nun noch mal schnell was anderes. Ich habe gerade folgenden Tipp erhalten. Möchte man eine Zahl vom Typ Long, speichern oder uebers Netz uebertragen, so Bedarf das 4 Byte ( glaube). Warum also nicht als String speichern mit einer länge von 2 Bytes ?

Möchte man dies, so verwendet folgende Routinen :smile:

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal ByteLen As Long)

Public Function LongToString(Expression As Long) As String
Dim tmpString As String
tmpString = Space(2)
Call CopyMemory(StrPtr(tmpString), VarPtr(Expression), 4)
LongToString = tmpString
End Function
 
Public Function StringToLong(Expression As String) As Long
Dim tmpLong As Long
Call CopyMemory(VarPtr(tmpLong), StrPtr(Expression), 4)
StringToLong = tmpLong
End Function

Kannst ja in die FAQ stellen, denn eines Tages habsch das sicher auch vergessen :s

Gruß, Rainer

MfG Alex

Hi Alex,

Naja ein wenig schon :smile: Den Source kann man noch so schoen
modifizieren, sprich, ist man Online ? Ist der IE installiert?
Ist er im Online oder Offline Modus und und und :smile:

Ja, aber wir wollen ja nur helfen, daß das Projekt in die Gänge kommt. Alles was geht, können wir nicht einbauen, sonst wird es unübersichtlich. Ich mag die Beispiele immer nicht, in denen man den wesentlichen Code nicht findet. :smile:

Reicht das ‚Set IE = Nothing‘ nicht?

Nein, das ist eigentlich überfluessig, denn IE wird in der
Function declariert. Wenn nun die Function verlassen wird, so
verliert auch die Variable IE ihre Gueltigkeit. Ich habe es
nur zur Schoenheit mit hingeschrieben :smile:

Der IE aber selbst ist ja gestartet (unsichtbar) und nicht
geschlossen :smile: Also muss man des noch von Hand machen :smile:

Nur wie … IE.Close geht nicht … :frowning:

Nur mal ein kleines Demo, was ich in jeden Project mache.

Erstelle mal ein Project. Darauf 4 Button und folgenden Code

Schau Dir das mal an :smile:

Das werde ich gleich tun, habe ich noch nicht. Ich sehe aber schon, was passieren wird. :smile:

OK, bau ich noch. :smile:

Fein :smile:

Aber nun noch mal schnell was anderes. Ich habe gerade
folgenden Tipp erhalten. Möchte man eine Zahl vom Typ Long,
speichern oder uebers Netz uebertragen, so Bedarf das 4 Byte (
glaube). Warum also nicht als String speichern mit einer länge
von 2 Bytes ?

Geht nicht. Vier Bytes sind vier Bytes.

Möchte man dies, so verwendet folgende Routinen :smile:

Private Declare Sub CopyMemory Lib „kernel32“ Alias
„RtlMoveMemory“ (ByVal Destination As Long, ByVal Source As
Long, ByVal ByteLen As Long)

Public Function LongToString(Expression As Long) As String
Dim tmpString As String
tmpString = Space(2)

Zwei Zeichen Unicode. Das sind vier Bytes, deshalb funktioniert das. Du überträgst vier Bytes in vier Bytes.

Option Explicit

Private Sub Command1\_Click()
 Dim Txt As String
 Txt = "A"
 Debug.Print LenB(Txt)
End Sub

Es sieht nur anders aus, nützt aber nichts. :smile:

Gruß, Rainer

Hi Alex,

Problem mit Deinem Code … :smile:

'Klasse erstellen, namens WaitCursor

OK.

'in den Procedure Eigenschaften stelle mal in der Klasse die Sub Show
'als Default ein :smile: ( Procedure ID)

??? Verstehe ich nicht und finde es auch nicht. Vermutlich deshalb kommt ein Fehler bei ‚Call maus‘. (Objekt unterstützt diese Eigenschft nicht)

Gruß, Rainer

Hi Alex,

Hallo Rainer,

Problem mit Deinem Code … :smile:

naja das bekommen wir hin :smile:

OK.

??? Verstehe ich nicht und finde es auch nicht. Vermutlich
deshalb kommt ein Fehler bei ‚Call maus‘. (Objekt unterstützt
diese Eigenschft nicht)

Genau ! Du hast ja Maus als neue Instanz von Waitcursor declariert. Wenn du nun Maus aufrufst oder Call Maus. Ist beides das selbe, dann geht er auf die Klasse und ruft dort die Standard Procedure auf! Hast du sie nicht festgelegt, so bekommst du eine Fehlermeldung.

Ich habe hier VB6 Prof. drauf. Diese Version ist aber in Englisch.
Ich finde dort die Einstellungen an dieser Stelle. Sollte bei Dir an der selben sein.

Gehe in die Klasse.SO das du den Source siehst der in der Klasse geschrieben ist. Klicke danach im Menu auf Tools ( muesste Extras sein, ist links neben dem Menupunkt AddIn). Dort findest du folgende Menupunkte

Add Procedure
Dim Maus as new Waitcursor ’

MfG Alex

Gruß, Rainer

Hi Alex,

danke, jetzt läuft der Code! :smile:

Bei solchen Beispielen merke ich dann immer, wie viel ich über VB noch nicht weiß.

Gruß, Rainer

Nachtrag, neuer Code
Hallo Stefan,

der Code ist leicht geändert, wenn die Website nicht geladen werden kann, kommt eine Fehlermeldung. Wie das Ergebnis in die Excel-Tabelle kommt, habe ich auch gefunden, sicher geht das eleganter, aber es funktioniert erst mal :smile: Die Initialisierung stand im falscher Ereignis, das ist geändert. Ein Paar Kommentare aheb ich jetzt auch entfernt, die hast Du ja. OK soweit?

Nun fehlt noch, den IE wieder zu schließen, ich habe noch nicht gefunden, wie das geht.

Option Explicit

Dim Zl() As String

Private Sub UserForm\_Activate()
 'Die Vorbereitungen sind nur für diesen Test nötig.
 Label1.Caption = ""
 Label2.Caption = ""
 TextBox1.Text = "http://www.wer-weiss-was.de"
 CommandButton1.Caption = "Laden"
End Sub

Private Sub CommandButton1\_Click()
 Dim po1 As Long
 Dim po2 As Long
 Dim Txt As String
 Dim i As Integer

 Dim su\_Start As String
 Dim su\_Ende As String

 Txt = GetDataFromUrl(TextBox1.Text)
 If Txt "" Then
 'Nur mal eine Probe mit w-w-w
 Label1.Caption = Txt 'Nur zur Kontrolle mal anzeigen, die Zeile kann weg.
 'Zur Demonstration den Titel im zweiten Label ausgeben
 po1 = InStr(Txt, "") + 7 'Anfang des Titels suchen, 7 ist die länge des Tags
 po2 = InStr(po1, Txt, "") 'Ende des Titels suchen
 Label2.Caption = Mid(Txt, po1, po2 - po1)

 'Vorbereitung für Deine Suche
 su\_Start = " Verantwortlicher"
 su\_Ende = " "
 po1 = 1
 po2 = 1
 ReDim Zl(0)
 While po1 0 And po2 0
 po1 = InStr(po2, Txt, su\_Start)
 If po1 0 Then
 po1 = po1 + Len(su\_Start)
 po2 = InStr(po1, Txt, su\_Ende)
 If po2 0 Then
 ReDim Preserve Zl(1, UBound(Zl) + 1)
 Zl(UBound(Zl)) = Mid(Txt, po1, po2 - po1)
 End If
 End If
 Wend
 'Prozedur aufrufen, die den Inhalt des Arrays Zl() in die Excel-Tabelle schreibt.
 If UBound(Zl) \> 0 Then
 For i = LBound(Zl) To UBound(Zl)
 Worksheets("Tabelle1").Range("A" + CStr(i)).Value = Zl(i)
 Next
 End If
 End If
End Sub

Private Function GetDataFromUrl(Url As String) As String
Dim IE As Object
Dim Tm As Double
Dim Wt As Single
Wt = 5 'Wartezeit = 5 Sekunden
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = False ' Nicht Sichtbar!
IE.Navigate Url ' Url laden
Tm = Timer
Do
 If Timer - Tm \> Wt Then
 GetDataFromUrl = ""
 MsgBox "Website konnte nicht geladen werden", vbCritical, "Fehler beim Laden"
 Exit Function
 End If
 DoEvents
Loop Until IE.readystate = 4 ' Seite fertig geladen
 GetDataFromUrl = IE.document.documentelement.outerhtml
Set IE = Nothing
End Function

Gruß, Rainer