VBA Frontpage - Suche in Webseiten

Hallo Rainer,

also das du das schliessen des IE nicht hinbekommst, da enttaeuschst mich ein wenig :smile:
DafĂŒr gibt es viele Wege. Aber ich habe mir die Sache nochmal angeschaut und hab mal nen bissl rumgespielt und volla ich hab gefunden wie man ihn beendet :smile:

Schliessen kannst du den IE einfach mit der Methode Quit.
Rufe einfach vor der Anweisung

 Set IE=Nothing

die Methode Quit auf. Aber ich hab die Function nochmal nen bissl flexibler gemacht :smile:

Also

Private Function GetDataFromUrl(Url As String, Optional ShowExplorer As Boolean = False, Optional WaitTime As Long = 5, Optional ShowError As Boolean = True) As String
Dim IE As Object
Dim Tm As Double
Dim Wt As Single
 Screen.MousePointer = 11
 Wt = WaitTime 'Wartezeit
 Set IE = CreateObject("InternetExplorer.Application")
 IE.Visible = ShowExplorer ' Sichtbar?
 IE.Navigate Url ' Url laden
 Tm = Timer
 Do
 If Timer - Tm \> Wt Then
 GetDataFromUrl = ""
 If ShowError Then MsgBox "Website konnte nicht geladen werden", vbCritical, "Fehler beim Laden"
 IE.Quit
 Set IE = Nothing
 Exit Function
 End If
 DoEvents
 Loop Until IE.readystate = 4 ' Seite fertig geladen
 'Ich wĂŒrd fĂŒr seine Zwecke InnerText nehmen :wink:
 GetDataFromUrl = IE.document.documentelement.outerhtml
 IE.Quit
 Set IE = Nothing
 Screen.MousePointer = 0
End Function

MfG Alex

1 Like

Hi Alex,

also das du das schliessen des IE nicht hinbekommst, da
enttaeuschst mich ein wenig :smile:

Ich habs mit End, Close, Terminate 
 versucht, auf Quit bin ich nicht gekommen. Da hilft ja keine Intellisense. :frowning:

DafĂŒr gibt es viele Wege. Aber ich habe mir die Sache nochmal
angeschaut und hab mal nen bissl rumgespielt und volla ich hab
gefunden wie man ihn beendet :smile:

Schliessen kannst du den IE einfach mit der Methode Quit.
Rufe einfach vor der Anweisung

Set IE=Nothing

die Methode Quit auf. Aber ich hab die Function nochmal nen
bissl flexibler gemacht :smile:

Also

Private Function GetDataFromUrl(Url As String, Optional
ShowExplorer As Boolean = False, Optional WaitTime As Long =
5, Optional ShowError As Boolean = True) As String
Dim IE As Object
Dim Tm As Double
Dim Wt As Single
Screen.MousePointer = 11
Wt = WaitTime 'Wartezeit
Set IE = CreateObject(„InternetExplorer.Application“)
IE.Visible = ShowExplorer ’ Sichtbar?
IE.Navigate Url ’ Url laden
Tm = Timer
Do
If Timer - Tm > Wt Then
GetDataFromUrl = „“
If ShowError Then MsgBox „Website konnte nicht geladen
werden“, vbCritical, „Fehler beim Laden“
IE.Quit
Set IE = Nothing
Exit Function
End If
DoEvents
Loop Until IE.readystate = 4 ’ Seite fertig geladen
'Ich wĂŒrd fĂŒr seine Zwecke InnerText nehmen :wink:
GetDataFromUrl = IE.document.documentelement.outerhtml
IE.Quit
Set IE = Nothing
Screen.MousePointer = 0
End Function

Fein! Die optionalen Parameter gefallen mir. :smile: Das versuche ich mir mal zu merken, Du wirst mich ja gelegentlich daran erinnern.

Dann ist das Projekt wohl so weit abgeschlossen, wie wir helfen können. Mal sehen, ob noch ein Feedback kommt. Danke fĂŒr die Hilfe!

Gruß, Rainer

Hi Alex,

Hallo Rainer,

Ich habs mit End, Close, Terminate 
 versucht, auf Quit bin
ich nicht gekommen. Da hilft ja keine Intellisense. :frowning:

So hatte ich es auch versucht und dann urplötzlich fiel mir Quit ein :wink: Aber so haben wir beide etwas gelernt :wink:

Fein! Die optionalen Parameter gefallen mir. :smile: Das versuche
ich mir mal zu merken, Du wirst mich ja gelegentlich daran
erinnern.

Na aber sicher doch :smile: Bei einem Functions / Sub Aufruf ist Optional mein Liebling, Man muss nicht uebergeben, kann es aber :smile: Somit wird alles echt flexibel :smile: Das schoene dabei ist sogar das man sich die Declaration von Variablen und somit den Speicher schont :smile:
Genauso rufe ich immer Subs via Call auf. Somit weiss man sofort bescheid das es sich um einen Procedure Aufruf handelt :wink:

Aber wie das genau funktioniert das weisst du?
Also

Privat Sub XYZ(Status as boolean, Optional x as long=123, Optional y as long)
If ismissing y then
....
End Sub

Dann ist das Projekt wohl so weit abgeschlossen, wie wir
helfen können. Mal sehen, ob noch ein Feedback kommt. Danke
fĂŒr die Hilfe!

Nichts zu danken, dafĂŒr gibt es uns ja :smile:

Mal fix was anderes. MZ TOOLS kennst du? Wenn nicht google mal danach und installiere dir mal das Addin. Dort findest du viel nuetzliche Sachen. Vor allem was die Sache ErrorHandling angeht :wink:

Gruß, Rainer

MfG Alex

Hi Alex,

Aber wie das genau funktioniert das weisst du?

ja, das ist komplett klar.

Also

Privat Sub XYZ(Status as boolean, Optional x as long=123,
Optional y as long)
If ismissing y then


End Sub

Dann ist das Projekt wohl so weit abgeschlossen, wie wir
helfen können. Mal sehen, ob noch ein Feedback kommt. Danke
fĂŒr die Hilfe!

Nichts zu danken, dafĂŒr gibt es uns ja :smile:

Mal fix was anderes. MZ TOOLS kennst du?

nein, kenn ich (noch) nicht.

Wenn nicht google mal
danach und installiere dir mal das Addin. Dort findest du viel
nuetzliche Sachen. Vor allem was die Sache ErrorHandling
angeht :wink:

Danke!

Gruß, Rainer

Hallo Ihr,

erst einmal recht vielen Dank fĂŒr all die MĂŒhe, die ihr euch gemacht habt. Habt ihr eure Funktion aber schon einmal unter Echtbedingungen ausprobiert, also mit einem Trefferergebnis?

Bei mir kommt folgende Fehlermeldung:

„Laufzeitfehler 9: Index außerhalb des gĂŒltigen Bereichs“

und zwar zeigt mir das Debuggen an, dass der Fehler bei

ReDim Preserve Zl(1, UBound(Zl) + 1)

auftritt.

UnabhÀngig von dem Fehler gleich die nÀchste Frage bzw. Problemstellung. TatsÀchlich suche ich nach einem Quelltext, der immer so aufgebaut ist:

#########–[Username]–Profile

ist eine ID-Nummer, die dem User zugeordnet ist. Sie ist immer nummerisch und immer 9-stellig. Der Username ist beliebig lang (meist aber nicht zu lange - eben ein ganz normaler Username).

In meiner Excel-Liste brauche ich jetzt in der ersten Spalte die ID-Nummer und in der zweiten Spalte den jeweiligen Username.

Vielleicht habt ihr fĂŒr das Problem sogar auch noch eine Lösung parat.

Ich selbst kĂ€mpfe derweil noch mit einem anderen Problem. Wenn man bei uns vom Intranet aus eine Internetseite aufruft, kommt ein Sicherheitsfenster im IE, da nur einige wenige User Internetberechtigung haben. Wenn man die gewĂŒnschte Seite in einem anderen Fenster bereits aufgerufen hat, dann funktioniert es ohne Probleme mit dem Makro. Aber nachdem der IE ja praktisch „unsichtbar“ ist, kommt sonst eine Fehlermeldung, weil er die Seite nicht laden kann. Kann man so ein Sicherheitsfenster gleich immer mit okay bestĂ€tigen lassen? Sonst muss ich eben IE.Visible auf true schalten und selbst klicken. Ist aber mĂŒhsam


GrĂŒĂŸe

Stefan

Hallo ihr Beiden,

erst einmal supervielen Dank fĂŒr eure MĂŒhe in der Sache. Ohne eure Hilfe hĂ€tte ich wahrscheinlich noch lange nach einer Lösung gesucht. Allerdings hab ich noch ein paar kleine Probleme:

  1. Fehlermeldung im Trefferfall: ich hab die Suchbegriffe auf meine BedĂŒrfnisse angepasst und bekommt jetzt aber im Trefferfall die Fehlermeldung

„Laufzeitfehler ‚9‘: Index außerhalb des gĂŒltigen Bereichs“

in der Zeile

ReDim Preserve Zl(1, UBound(Zl) + 1)

Als Werte werden angezeigt:

po1 = 4831
po2 = 11378

Habt ihr das Skript schon einmal mit anderen Suchbegriffen ausprobiert? Hat es dann funktioniert?

  1. Sicherheitsfenster IE: wenn man aus unserem Intranet ins Internet möchte, kommt ein Sicherheitsfenster im IE, in dem man den Usernamen und das Passwort eingeben muss. FĂŒr den Internetzugang gibt es bei uns nĂ€mlich eine extra Berechtigung.

Da das Fenster versteckt ist, kommt natĂŒrlich erst eine Fehlermeldung, weil niemand die „OK“ Taste drĂŒckt. Man könnte jetzt natĂŒrlich den IE mit

IE.Visible = true

wieder auf sichtbar schalten. An sich wĂŒrde ich aber gerne das Skript selbst die OK-Taste drĂŒcken lassen, damit man es nicht immer selbst machen muss. Gibt es da eine Möglichkeit?

  1. Der eigentliche Text den ich Suche ist etwas komplexer aufgebaut und zwar immer:

/#########–[Username]–

Ich brauche in Excel in der ersten Spalte die Nr. ## (9-stellig) und in der zweiten Spalte den Username (nach hinten abgetrennt durch zwei Striche). Habt ihr eine Idee, wie ich die Infos möglichst einfach aus dem Quelltext „extrahieren“ kann??

GrĂŒĂŸe aus Bayern

Stefan

Hallo ihr Beiden,

Hallo Stefan,

erst einmal supervielen Dank fĂŒr eure MĂŒhe in der Sache. Ohne
eure Hilfe hÀtte ich wahrscheinlich noch lange nach einer
Lösung gesucht.

Nichts zu danken dafĂŒr sind wir ja da :wink:

Allerdings hab ich noch ein paar kleine
Probleme:

Na dann schauen wir einmal :smile:

  1. Fehlermeldung im Trefferfall: ich hab die Suchbegriffe auf
    meine BedĂŒrfnisse angepasst und bekommt jetzt aber im
    Trefferfall die Fehlermeldung

„Laufzeitfehler ‚9‘: Index außerhalb des gĂŒltigen Bereichs“

in der Zeile

ReDim Preserve Zl(1, UBound(Zl) + 1)

Ok, ich habe den Source von Rainer mal fix ĂŒberflogen.
Was er hier versucht ist ein 2 Dimensionales Array zu dimensionieren!
Ist es einmal dimensioniert, so kann man dies nicht mehr ueber Redim Preserve veraendern. Oder soweit ich weiss nur die letzte Dimension. Möchte man dies, so muss man sich ne Hilfsfunktion basteln die das erledigt :wink:
Aber lange Rede kurzer Sinn. Im ganzen Code den Rainer gepostet hat, hat er nur ein Eindimensionales Array genutzt! Scheinbar war er dort in Gedanken gewesen :s
Ändere mal die Zeile wiefolgt ab

ReDim Preserve Zl(UBound(Zl) + 1)

Als Werte werden angezeigt:

po1 = 4831
po2 = 11378

Das bedeutet nur das noch Daten vorhanden sind :wink:

Habt ihr das Skript schon einmal mit anderen Suchbegriffen
ausprobiert? Hat es dann funktioniert?

Also ich nicht :s

  1. Sicherheitsfenster IE: wenn man aus unserem Intranet ins
    Internet möchte, kommt ein Sicherheitsfenster im IE, in dem
    man den Usernamen und das Passwort eingeben muss. FĂŒr den
    Internetzugang gibt es bei uns nÀmlich eine extra
    Berechtigung.

Musst du nur die Daten eingeben um ins Inet zu kommen oder um auf die Seite zu gelangen? Geht der Aufruf Http://Username:stuck_out_tongue:assword@deineWebseite nicht?

Ansonsten muessten wir mal schauen, was man da machen kann!
Lösbar ist das aber.Nur Bedarf es einer Benutzereingabe und ein wenig Code :smile:

Da das Fenster versteckt ist, kommt natĂŒrlich erst eine
Fehlermeldung, weil niemand die „OK“ Taste drĂŒckt. Man könnte
jetzt natĂŒrlich den IE mit

IE.Visible = true

wieder auf sichtbar schalten. An sich wĂŒrde ich aber gerne das
Skript selbst die OK-Taste drĂŒcken lassen, damit man es nicht
immer selbst machen muss. Gibt es da eine Möglichkeit?

Die gibt es sicherlich :smile: Aber wie sollen die Daten eingetragen werden? Also der benutzername und das Password?
Ist der Benutzername = der des angemeldeten Benutzers ?

  1. Der eigentliche Text den ich Suche ist etwas komplexer
    aufgebaut und zwar immer:

/#########–[Username]–

Ok, wie liest du ihn denn aus? Mit InnerHTML oder InnerText ?

Ich brauche in Excel in der ersten Spalte die Nr. ##
(9-stellig) und in der zweiten Spalte den Username (nach
hinten abgetrennt durch zwei Striche). Habt ihr eine Idee, wie
ich die Infos möglichst einfach aus dem Quelltext
„extrahieren“ kann??

Also wie du die Daten nach Excel bekommst, das weiss ich nicht :s
Aber wenn der String in der Form wie oben dargestellt vorliegt, so bekommst du die Daten wiefolgt

'Der Text liegt in der Variable sagen wir Z(1) vor
'Der String beinhaltet "/12345678--[Alex]--"

'Variante 1

Dim Nr As String
Dim Username As String
Nr = Left(z(1), 9)
Username = Left(Right(z(1), Len(z(1)) - 12), Len(z(1)) - 14)
'Nr=/12345678
'Username= [Alex]

'Variante 2'Ab VB6, ansonsten Hilfsfunktion schreiben

Dim Nr As String
Dim Username As String
Dim vRet As Variant
vRet = Split(z(1), "--")
Nr = vRet(0)
PW = vRet(1)

GrĂŒĂŸe aus Bayern

MfG Alex

Stefan

Hallo Ihr,

Hallo Stefan,

erst einmal recht vielen Dank fĂŒr all die MĂŒhe, die ihr euch
gemacht habt. Habt ihr eure Funktion aber schon einmal unter
Echtbedingungen ausprobiert, also mit einem Trefferergebnis?

Nein das habe ich nicht. Aber dazu habe ich dir in deinem Statement oben weiter etwas geschrieben. Auch die Loesungen zu deinen Problemen :smile:

Bei mir kommt folgende Fehlermeldung:
„Laufzeitfehler 9: Index außerhalb des gĂŒltigen Bereichs“
und zwar zeigt mir das Debuggen an, dass der Fehler bei
ReDim Preserve Zl(1, UBound(Zl) + 1)
auftritt.

Richtig und die Lösung ist weiter oben :smile:

UnabhÀngig von dem Fehler gleich die nÀchste Frage bzw.
Problemstellung. TatsÀchlich suche ich nach einem Quelltext,
der immer so aufgebaut ist:
#########–[Username]–Profile

In deinem anderen Posting war es, wiefolgt

/########–[Username]–

Darauf habe ich dir eine Lösung zugeschnitten :smile:
Aber das erste Zeichen ist eigentlich nur anders, insofern sollte es gehen da du dort nur 8 mal das # zeichen hast und ich die ersten 9 Zeichen eingelesen habe. Was aber nicht mehr geht, ist dadurch du nict gesagt hast das hinten noch das Profile dranhaengt, er nun den rest weniger 2 zeichen einliest und du somit eine falsche Angabe erhaelst.
Die 1 Variante die ich dir gepostet habe, klappt deswegen nun nicht mehr. DafĂŒr aber die 2 Variante ( Die mit Split) :wink:

Aber was mich wundert ist, Willst du wirklich den Username mit den eckigen Klammern haben?
Wenn nicht, dann aendere mal die 2 Variante wiefolgt ab

Dim Nr As String
Dim Username As String
Dim vRet As Variant
vRet = Split(z(1), "--")
Nr = vRet(0)
Username = Replace(Replace(vRet(1), "]", ""), "[", "")
Erase vRet
Set vRet = Nothing

ist eine ID-Nummer, die dem User zugeordnet ist. Sie ist

immer nummerisch und immer 9-stellig. Der Username ist
beliebig lang (meist aber nicht zu lange - eben ein ganz
normaler Username).
In meiner Excel-Liste brauche ich jetzt in der ersten Spalte
die ID-Nummer und in der zweiten Spalte den jeweiligen
Username.
Vielleicht habt ihr fĂŒr das Problem sogar auch noch eine
Lösung parat.

Die habe ich dir gepostet :smile:

Ich selbst kÀmpfe derweil noch mit einem anderen Problem. Wenn
man bei uns vom Intranet aus eine Internetseite aufruft, kommt
ein Sicherheitsfenster im IE, da nur einige wenige User
Internetberechtigung haben. Wenn man die gewĂŒnschte Seite in
einem anderen Fenster bereits aufgerufen hat, dann
funktioniert es ohne Probleme mit dem Makro. Aber nachdem der
IE ja praktisch „unsichtbar“ ist, kommt sonst eine
Fehlermeldung, weil er die Seite nicht laden kann. Kann man so
ein Sicherheitsfenster gleich immer mit okay bestÀtigen
lassen? Sonst muss ich eben IE.Visible auf true schalten und
selbst klicken. Ist aber mĂŒhsam


Auch dazu habe ich dir etwas in dem anderen Posting geschrieben :smile:

MfG Alex

GrĂŒĂŸe
Stefan

1 Like

Hi Alex,

Ok, ich habe den Source von Rainer mal fix ĂŒberflogen.
Was er hier versucht ist ein 2 Dimensionales Array zu
dimensionieren!

*gg* ja, so sieht es aus, das war natĂŒrlich ein Tippfehler.

ReDim Preserve Zl(UBound(Zl) + 1)

So war’s gemeint. Danke.

Gruß, Rainer

Hallo Stefan,

Habt ihr eure Funktion aber schon einmal unter
Echtbedingungen ausprobiert, also mit einem Trefferergebnis?

Nein. Ich habe keine solche Seite, das konnte ich nicht testen, deshalb haben sich da unbemerkte Fehler einschleichen können.

Alex hat die ja schon korrigiert.

Gruß, Rainer

Hallo ihr,

tut mir leid, dass meine Antwort zwei Mal gepostet wurde. Beim ersten Mal brachte er eine Fehlermeldung und alles war weg. Ich hab mich geĂ€rgert, nochmal alles geschrieben und nicht vorher nachgeprĂŒft, ob er die Antwort nicht doch gepostet hatte. Ich Doofmann - die doppelte Arbeit hĂ€tte ich mir natĂŒrlich sparen können.

Entsprechend reicht mir natĂŒrlich die erste Antwort aus. Sobald ich Zeit habe, werd ich den Code entsprechend anpassen und ausprobieren.

Danke schonmal

GrĂŒĂŸe

Stefan

Hallo Stefan,

tut mir leid, dass meine Antwort zwei Mal gepostet wurde. Beim
ersten Mal brachte er eine Fehlermeldung und alles war weg.

das ist nicht schlimm. Wir haben ja in beiden Teiltreads geantwortet, deshalb lasse ich einfach alles stehen.

Ich hab mich geÀrgert, nochmal alles geschrieben und nicht
vorher nachgeprĂŒft, ob er die Antwort nicht doch gepostet
hatte. Ich Doofmann - die doppelte Arbeit hÀtte ich mir
natĂŒrlich sparen können.

Pech, aber so schlimm ist das ja nun auch wieder nicht.

Entsprechend reicht mir natĂŒrlich die erste Antwort aus.
Sobald ich Zeit habe, werd ich den Code entsprechend anpassen
und ausprobieren.

Mail mir doch einfach mal eine Adresse, mit der ich alles testen kann, ich kann eventuell etwas schneller mit den Fehlermeldungen etwas anfangen.

Gruß, Rainer

Hallo Stefan,

dann schaue in dein zweiten Posting, denn dort ist eine Aenderung drinnen :smile:

MfG Alex

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

Hallo Alex,

vielleicht hab ich ein bißchen mißverstĂ€ndlich geschrieben, was ich wirklich brauch. Aber Dank eurer Hilfe bin ich jetzt selbst weitergekommen. Hier der Code, den ich mir erstellt hab.

Was ich genau brauche ist die erste Spalte meiner Excel-Tabelle mit der mir unbekannten Usernummer und dann die zweite Spalete mit dem mir unbekannten Usernamen. Beides aus dem Html-Text der Seite entnommen, da es sich um Hyperlinks handelt, die auf der Seite selbst nicht so angezeigt werden.

Sonst könnte ich natĂŒrlich gezielt nach den Daten suchen, so habe ich jetzt einfach nach den Strichen gesucht und dann nach der Zahl etc. - jetzt ist die Ausgabe richtig.

Nachdem automatisch einige Webseiten durchsucht werden sollen, wĂ€re ggf. noch zu prĂŒfen, was passiert, wenn eine Webseite leer ist. Bzw. bei Fehlermeldungen („Keine Seite gefunden“) weiterzumachen.

Private Sub CommandButton1\_Click()

'Variablen setzen
Dim po1 As Long
Dim po2 As Long

Dim Txt As String
Dim strUsernummer As String
Dim strUsername As String
Dim strZĂ€hler As String

Dim i As Integer
Dim a As Integer
Dim b As Integer
Dim intTextlÀnge As Integer
Dim intDifferenz As Integer
Dim intZĂ€hler As Integer

intZĂ€hler = 1


'Webseite auslesen
Txt = GetDataFromUrl(TextBox1.Text)

'Falls Webseite nicht leer, Titel und Inhalt bestimmen & anzeigen
If Txt "" Then
 Label1.Caption = Txt
 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)

 intTextlÀnge = Len(Txt)

 For a = 1 To intTextlÀnge 'Schleife von Beginn des Textes bis zum Ende
 If Mid(Txt, a, 2) = "--" Then 'Es werden zwei Striche gefunden
 If IsNumeric(Mid(Txt, a - 9, 9)) Then 'die letzten 9 Zeichen vor den Strichen ist eine Nummer
 strUsernummer = Mid(Txt, a - 9, 9)
 For b = a + 2 To intTextlÀnge 'Schleife vom Treffer bis zum Ende
 If Mid(Txt, b, 2) = "--" Then 'Die zweiten Striche werden gefunden
 If Mid(Txt, b + 2, 7) = "Profile" Then
 GoTo ZweiteBegrenzungGefunden 'Aus der Schleife raus
 End If
 GoTo DochKeinTreffer
 End If
 Next b

ZweiteBegrenzungGefunden:

 intDifferenz = b - (a + 2) 'Zeichen zwischen ersten und zweiten Strichen
 strUsername = Mid(Txt, a + 2, intDifferenz)

 Worksheets("Tabelle1").Range("A" & intZĂ€hler).Value = strUsername
 Worksheets("Tabelle1").Range("B" & intZĂ€hler).Value = strUsernummer

 intZĂ€hler = intZĂ€hler + 1

 End If
 End If

DochKeinTreffer:

 Next a

 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.innerhtml
IE.Quit
Set IE = Nothing
End Function

[MOD] Tag in pre geÀndert.

Hallo Alex,

Hallo Stefan,

vielleicht hab ich ein bißchen mißverstĂ€ndlich geschrieben,
was ich wirklich brauch. Aber Dank eurer Hilfe bin ich jetzt
selbst weitergekommen. Hier der Code, den ich mir erstellt
hab.

Na das ist doch chick :smile:

Was ich genau brauche ist die erste Spalte meiner
Excel-Tabelle mit der mir unbekannten Usernummer und dann die
zweite Spalete mit dem mir unbekannten Usernamen. Beides aus
dem Html-Text der Seite entnommen, da es sich um Hyperlinks
handelt, die auf der Seite selbst nicht so angezeigt werden.

Hmm, du lÀdst doch die Seite. Die Daten hast du dann ja.
Wie das eintragen bei Excel geht, das weiss ich nicht :confused:
Ich habe mich damit aber noch nie auseinander gesetzt :smile:
Aber wenn du die daten eintraegst, je nachdem welche Variante du gewaehlt hast, so hast du doch bereits die Daten und kannst damit weiter arbeiten :smile:

Sonst könnte ich natĂŒrlich gezielt nach den Daten suchen, so
habe ich jetzt einfach nach den Strichen gesucht und dann nach
der Zahl etc. - jetzt ist die Ausgabe richtig.

Ok, wenn die Ausgabe passt, denn ist es ja ok :smile:

Nachdem automatisch einige Webseiten durchsucht werden sollen,
wĂ€re ggf. noch zu prĂŒfen, was passiert, wenn eine Webseite
leer ist. Bzw. bei Fehlermeldungen („Keine Seite gefunden“)
weiterzumachen.

Die Function, liefert dir den Inhalt der Seite.
Ist die Seite leer, so ist auch der Inhalt den du zurueckbekommst ="" und deine Suche sollte nichts finden. Alternativ kannst du hier die LĂ€nge abfragen und entsprechend darauf agieren :smile:

Private Sub CommandButton1_Click()

'Variablen setzen
Dim po1 As Long
Dim po2 As Long

Dim Txt As String
Dim strUsernummer As String
Dim strUsername As String
Dim strZĂ€hler As String

Dim i As Integer
Dim a As Integer
Dim b As Integer
Dim intTextlÀnge As Integer
Dim intDifferenz As Integer
Dim intZĂ€hler As Integer

intZĂ€hler = 1

'Webseite auslesen
Txt = GetDataFromUrl(TextBox1.Text)

'Falls Webseite nicht leer, Titel und Inhalt bestimmen &
anzeigen
If Txt „“ Then
Label1.Caption = Txt
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)

intTextlÀnge = Len(Txt)

For a = 1 To intTextlÀnge 'Schleife von Beginn des Textes
bis zum Ende
If Mid(Txt, a, 2) = „–“ Then 'Es werden zwei Striche
gefunden
If IsNumeric(Mid(Txt, a - 9, 9)) Then 'die letzten 9
Zeichen vor den Strichen ist eine Nummer
strUsernummer = Mid(Txt, a - 9, 9)
For b = a + 2 To intTextlÀnge 'Schleife vom
Treffer bis zum Ende
If Mid(Txt, b, 2) = „–“ Then 'Die zweiten
Striche werden gefunden
If Mid(Txt, b + 2, 7) = „Profile“ Then
GoTo ZweiteBegrenzungGefunden 'Aus der
Schleife raus
End If
GoTo DochKeinTreffer
End If
Next b

ZweiteBegrenzungGefunden:

intDifferenz = b - (a + 2) 'Zeichen zwischen
ersten und zweiten Strichen
strUsername = Mid(Txt, a + 2, intDifferenz)

Worksheets(„Tabelle1“).Range(„A“ &
intZĂ€hler).Value = strUsername
Worksheets(„Tabelle1“).Range(„B“ &
intZĂ€hler).Value = strUsernummer

intZĂ€hler = intZĂ€hler + 1

End If
End If

DochKeinTreffer:

Next a

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.innerhtml
IE.Quit
Set IE = Nothing
End Function

Ich habe mir den Quelltest net genau angeschaut.
Was mir aber auffaellt sind folgende sachen

1:
Du declarierst eine Variable (intTextlÀnge), weisst ihr einen Wert zu und arbeitest mit ihr. Warum?

for a=1 to len(txt) '-\> Tut es auch!

Warum also nuetzlichen Speicher verschwenden?

2:
Du durchlaeufst den Text Zeichen fĂŒr Zeichen. Warum?
Das nimmt nur unnötige Rechenzeit in Anspruch :frowning:
Um die Position eines Zeichens zu erhalten, bietet sich hervorragend der Befehl INSTR an!
Also warum so umstaendlich und den Quelltest zu aufblÀhen lassen ?

3:
Du verwendest Sprungmarken! Davon rate ich dir tuenlichst ab!

4: So wie ich dich verstanden habe, ist immer zwischen den Werten die folgende Zeichenfolge „–“
Warum also nicht einfach den Befehl Split verwenden?
Hast du dir mal die von mir geposteten Varianten angeschaut?

Schau mal. So wie ich das erkenne schaut doch dein txt so aus

123456789--Alex--Profile--987654321--Stefan--Profile

Schau dir mal den Befehl Split an!

Dim vData As Variant
Dim I As Long
vData = Split(txt, "--")
If IsArray(vData) Then
 For I = LBound(vData) To UBound(vData)
 'hier nun die Zuweisung an Excel
 'Ich gehe mal von aus, das das von dir stimmt
 If I Mod 3 2 Then Worksheets("Tabelle1").Range(Chr(I Mod 3 + 65) & CStr(Fix(I / 3) + 1)).Value = vData(I)
 Next I
End If

Willst du eine PrĂŒfung einbauen, ob es sich um eine Zahl bei der Usernummer handelt. So könntest du das Demo wiefolgt erweitern

Dim vData As Variant
Dim I As Long
vData = Split(txt, "--")
If IsArray(vData) Then
 For I = LBound(vData) To UBound(vData)
Select case i mod 3
 case 0 
 'Hier ist die Usernummer
 'Daten zuweisen
 case 1
 'Hier der Username
 if isnumeric(vdata(i)) then ... ' hier die daten zuweisen
 case 2
 'Hier das Profil
 'irgendwas damit machen :smile:
end select 
 Next I
End If

Ist nicht getestet, sollte aber klappen :smile:

So nun schaue dir mal beide Routinen an. Welche ist schneller. Welche ost speicherschonender?

MfG Alex

1 Like

Hallo Alex,

1:
Du declarierst eine Variable (intTextlÀnge), weisst ihr einen
Wert zu und arbeitest mit ihr. Warum?

for a=1 to len(txt) '-> Tut es auch!

Hier hast du natĂŒrlich recht - ich hab es entsprechend geĂ€ndert.

2:
Du durchlaeufst den Text Zeichen fĂŒr Zeichen. Warum?
Das nimmt nur unnötige Rechenzeit in Anspruch :frowning:
Um die Position eines Zeichens zu erhalten, bietet sich
hervorragend der Befehl INSTR an!
Also warum so umstaendlich und den Quelltest zu aufblÀhen
lassen ?

Ich hab mir lange Gedanken darĂŒber gemacht, wie es besser geht, aber leider schaut der Quelltext nicht so ĂŒbersichtlich aus, wie bei dir:

X-ZeilenMitSchmarrn/123456789–Alex–Profile–
Y-ZeilenMitSchmarrn/987654321–Stefan–Profile–

Entsprechend kann ich nicht einfach mit – auftrennen - zudem die beiden – auch bei nicht benötigten Quelltext verwendet wird. Das einzige Alleinstellungsmerkmal ist eine 9-stellige Nummer, dann zwei Striche, dann der Username, dann zwei Striche und dann der Text „Profile“. Wobei ersteres eigentlich schon ausreicht.

Da Excel in der Tat sehr lang braucht um Zeichen fĂŒr Zeichen zu durchsuchen, wĂ€re mir auch sehr geholfen, wenn es irgendwie schneller geht. Maximal sind allerdings 12 User auf einer Seite aufgefĂŒhrt, dann muss ich schon die nĂ€chste Seite laden lassen.

3:
Du verwendest Sprungmarken! Davon rate ich dir tuenlichst ab!

Hmm - nachdem ich nie einen richtigen VB-Kurs besucht habe, weiß ich auch nicht wirklich, wie man „sauber“ programmiert. Gibt es mit den Sprungmarken Probleme? Und wie mache ich es ohne?

Mit der Wartezeit habe ich auch schon mehrmals Probleme gehabt - manchmal braucht er etwas lĂ€nger um sie zu laden. Lege ich aber die Wartezeit höher und muss er mehrere Seiten laden, dann dauert es bei jeder Seite so lange. Kann man nicht einfach sagen: „warte so lange, bis die Seite fertig geladen ist, maximal aber 30 Sekunden“? Dann wĂ€re er meistens wesentlich schneller fertig, wĂŒrde aber zur Not auch lange genug warten


GrĂŒĂŸe

Stefan

Hallo Stefan,

Ich hab mir lange Gedanken darĂŒber gemacht, wie es besser
geht, aber leider schaut der Quelltext nicht so ĂŒbersichtlich
aus, wie bei dir:

Naja das kommt dann mit der Zeit :smile:

X-ZeilenMitSchmarrn/123456789–Alex–Profile–
Y-ZeilenMitSchmarrn/987654321–Stefan–Profile–
Entsprechend kann ich nicht einfach mit – auftrennen - zudem
die beiden – auch bei nicht benötigten Quelltext verwendet
wird. Das einzige Alleinstellungsmerkmal ist eine 9-stellige
Nummer, dann zwei Striche, dann der Username, dann zwei
Striche und dann der Text „Profile“. Wobei ersteres eigentlich
schon ausreicht.

Ok, also gehen wir einmal systematisch an die Sache.
Du hast ja mehrere Zeilen! Das bedeutet das jede Zeile mit einem
vbCrLf endet.

Dann wĂŒrde ja jede Zeile so ausschauen

x-Irgendein Text/987654321--Stefan--Profile

Nun kannst du den Quelltext erst einmal in jede Zeile aufsplitten.
Wenn du nun auf die Zeile ein Split anwendest und als Kriterium die – angibst, so erhaelst du ein Array mit einer GrĂ¶ĂŸe von 3 Elementen.
Im ersten Element( welches 0 ist) hast du nun in den letzten 9 Zeichen die Nummer. Im zweiten 2 Element, den Usernamen und im 3 Element das Profile :smile:

Nun haben wir alle Infos, um mal schnell was zu basteln :smile:

Eine Routine schreibe ich dir dann zum Ende nochmal :smile:

Da Excel in der Tat sehr lang braucht um Zeichen fĂŒr Zeichen
zu durchsuchen, wÀre mir auch sehr geholfen, wenn es irgendwie
schneller geht. Maximal sind allerdings 12 User auf einer
Seite aufgefĂŒhrt, dann muss ich schon die nĂ€chste Seite laden
lassen.

Die Anzahl der User sind unrelevant :smile:
Aber wenn ich nun wieder falsch liege, so poste hier mal einen kleinen Inhalt der Webseite. Die Daten die keiner wissen sollte kannst du ja mit willkuerlichen Namen ersetzen :smile:

3:
Du verwendest Sprungmarken! Davon rate ich dir tuenlichst ab!

Hmm - nachdem ich nie einen richtigen VB-Kurs besucht habe,
weiß ich auch nicht wirklich, wie man „sauber“ programmiert.
Gibt es mit den Sprungmarken Probleme? Und wie mache ich es
ohne?

Sagen wir mal so. Dadurch wird es unuebersichtlicher und es kann passieren das du schnell in einer Endlosschleife endest etc :s
Wie es ohne Sprungmarken geht, das hast du ja in meinem Posting gesehen :smile:
Allein die Befehl „Select Case“ und „IF, ELSEIF, ELSE“ bringen dich weiter :smile:

Mit der Wartezeit habe ich auch schon mehrmals Probleme gehabt

  • manchmal braucht er etwas lĂ€nger um sie zu laden. Lege ich
    aber die Wartezeit höher und muss er mehrere Seiten laden,
    dann dauert es bei jeder Seite so lange. Kann man nicht
    einfach sagen: „warte so lange, bis die Seite fertig geladen
    ist, maximal aber 30 Sekunden“? Dann wĂ€re er meistens
    wesentlich schneller fertig, wĂŒrde aber zur Not auch lange
    genug warten


Das macht sie ja! Ich hatte dir aber mal eine verbesserte Version mit optionalen Parameter geschrieben. Diese hast du aber nicht eingebaut :frowning:
Ich poste dir hier auch nochmal diese Variante. Dann kannst du optional die Wartezeit angeben. Entweder die Seite ist geladen oder die Zeit ist abgelaufen. Danach kehrt er zurueck.

Optional heisst hierbei, das wenn du die Seite aufrufen möchtest, dort ein vordefinierter Wert dasteht. Übergibst du den Parameter mit, so wird dieser eingesetzt. Übergibst du ihn nicht, so nimmt er den voreingestellten Wert :smile:

'Verbesserte Version der Funktion

Private Function GetDataFromUrl(Url As String, Optional ShowExplorer As Boolean = False, Optional WaitTime As Long = 5, Optional ShowError As Boolean = True) As String
Dim IE As Object
Dim Tm As Double
Dim Wt As Single
 Screen.MousePointer = 11
 Wt = WaitTime 'Wartezeit
 Set IE = CreateObject("InternetExplorer.Application")
 IE.Visible = ShowExplorer ' Sichtbar?
 IE.Navigate Url ' Url laden
 Tm = Timer
 Do
 If Timer - Tm \> Wt Then
 GetDataFromUrl = ""
 If ShowError Then MsgBox "Website konnte nicht geladen werden", vbCritical, "Fehler beim Laden"
 IE.Quit
 Set IE = Nothing
 Exit Function
 End If
 DoEvents
 Loop Until IE.readystate = 4 ' Seite fertig geladen
 'Ich wĂŒrd fĂŒr seine Zwecke InnerText nehmen :wink:
 GetDataFromUrl = IE.document.documentelement.outerhtml
 IE.Quit
 Set IE = Nothing
 Screen.MousePointer = 0
End Function

'Willst du nun die Wartezeit bestimmen, so ĂŒbergebe fĂŒr den Parameter
'WaitTime die Zeit in Sekunden. Möchtest du keine Meldung angezeigt 
'bekommen, so ĂŒbergebe fĂŒr den Parameter ShowError einfach False.
'Willst du das man den IE sieht, so uebergebe fĂŒr den Parameter 
'ShowExplorer einfach True

'Hier eine andere Variante, um die Daten auszulesen
' Ist ungetestet sollte aber klappen :smile:
'Schaue dir mal im Debug Modus die Daten in vData an :wink:

Dim vRet As Variant
Dim vData As Variant
Dim I As Long
Dim Count As Long
'Wir holen die Daten: Explorer wird nicht angezeigt, keine Ausgabe der Fehlermeldung und Max. Wartezeit 30 Sekunden
txt = GetDataFromUrl("DeineWebseite.de", , 30, False)
If Len(txt) = 0 Then Exit Sub 'keine Daten vorhanden
vRet = Split(txt, vbCrLf) 'Aufsplitten in jede zeile
If Not (IsArray(vRet)) Then Exit Sub 'Keine Daten vorhanden
For I = LBound(vRet) To UBound(vRet) 'jetzt durchlaufen wir jede Zeile
 vData = Split(vRet(I), "--") 'Wir splitten nach --
 'hier tricksen wir ein wenig!
 'Es muessen mind. 3 Elemente vorhanden sein, ansonsten steht schmarn im Array
 If UBound(vData) = 0 Then Exit For 'Sind Daten vorhanden?
 'Man koennte hier auch schreiben if ubound(vData)=3 then ....
 ' Im Array stehen nun folgende Werte
 'vData (0)=x\_Irgendein Text/987654321
 'vData (1)=Stefan
 'vData (2)=Profile
 Count = Count + 1 'Wir muessen eine Variable zaehlen, da auch ungueltige Eintraege vorhanden sein koennen!
 If IsNumeric(Right(CStr(vData(0)), 9)) Then Worksheets("Tabelle1").Range("A" & CStr(Count)).Value = Right(CStr(vData(0)), 9)
 Worksheets("Tabelle1").Range("B" & CStr(Count)).Value = CStr(vData(I))
Next I

Aber da wir hier den Thread langsam sprengen :s und wir das ja nicht wollen. Du weisst wie du die Daten von einer Webseite bekommst und du nur noch die Probleme mit dem auslesen der Daten hast, so mache mal ein neues Thema auf :smile: So ist es dann ĂŒbersichtlicher!

GrĂŒĂŸe
Stefan

MfG Alex