Excel 2010 VB Makro Inhalt einer Webseite in Browser kopieren schlägt fehlt
Hallo liebe Leute!
ich möchte den Inhalt einer Webseite in ein Excel Sheet kopieren.
Hier mein aktueller code:
Grundsätzlich funktioniert das auch. Nur nicht bei der gewünschten (internen!) Seite.
ich vermute folgdendes als Ursache:
Diese erfordert eine Browser Authentifizierung.
Sprich der Broser überträgt die Nutzerdaten authomatisch.
Wie so üblich bei ERP Systemen..
Bei der Seite handelt es sich um eine .aspx Seite,
falls dass eine Rolle spielt.
Gruß aus dem noch nebeligen Bayern
SweetOne
ich möchte den Inhalt einer Webseite in ein Excel Sheet kopieren.
manueller Weg: Seite öffnen>Str+A>Str+C>Excel>Str+V
also nicht den Code kopieren und einfügen (!)
also nicht den Code kopieren und einfügen (!)
Hier mein aktueller code:
Private Sub CopyHtmlToClipboard(wwwAdress As String)
Dim appIE As Object
Set appIE = CreateObject("InternetExplorer.Application")
appIE.navigate wwwAdress
appIE.Visible = False
Do: Loop Until appIE.Busy = False
appIE.ExecWB 17, 0 'Select All
Do: Loop Until appIE.Busy = False
appIE.ExecWB 12, 0 'Copy
Do: Loop Until appIE.Busy = False
appIE.Application.Quit
Set appIE = Nothing
End Sub
Grundsätzlich funktioniert das auch. Nur nicht bei der gewünschten (internen!) Seite.
ich vermute folgdendes als Ursache:
Diese erfordert eine Browser Authentifizierung.
Sprich der Broser überträgt die Nutzerdaten authomatisch.
Wie so üblich bei ERP Systemen..
Bei der Seite handelt es sich um eine .aspx Seite,
falls dass eine Rolle spielt.
Gruß aus dem noch nebeligen Bayern
SweetOne
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 254556
Url: https://administrator.de/contentid/254556
Ausgedruckt am: 14.11.2024 um 15:11 Uhr
17 Kommentare
Neuester Kommentar
Hallo SweetOne!
Hast Du es auch mal per Daten>Externe Webabfrage versucht?
Teste mal damit:
Wahr oder Falsch?
Wenn Wahr, kompletten Inhalt (body) oder nur Tabellen (table)?
Grüße Dieter
Hast Du es auch mal per Daten>Externe Webabfrage versucht?
Teste mal damit:
Sub TestUrl(ByRef sUrl)
Dim sText As String
On Error Resume Next
With CreateObject("WinHttp.WinHttpRequest.5.1")
.Open "Get", sUrl, False
.Send
sText = .ResponseText
End With
On Error GoTo 0
If sText <> "" Then
MsgBox True
Else
MsgBox False
End If
End Sub
Wenn Wahr, kompletten Inhalt (body) oder nur Tabellen (table)?
Grüße Dieter
Hallo SweetOne!
Und wie funktioniert es hiermit:
Grüße Dieter
Und wie funktioniert es hiermit:
Public Sub Test()
'Body=xlEntirePage, AllTables=xlAllTables
Call GetWebDaten("https://www.google.de/?gws_rd=ssl", xlEntirePage)
'Call GetWebDaten("https://www.google.de/?gws_rd=ssl", xlAllTables)
End Sub
Private Sub GetWebDaten(ByRef sUrl, ByVal iMode As Long)
Dim sHtmlText As String, sHtmlFile As String, sHtmlQuery As String
Dim sText As String, i As Integer
On Error Resume Next
With CreateObject("WinHttp.WinHttpRequest.5.1")
For i = 1 To 3 'Max 3 Versuche
.Open "Get", sUrl, False
.Send
sText = .ResponseText
If sText <> "" Then
Exit For
End If
Next
End With
On Error GoTo 0
If sText <> "" Then
sHtmlText = "<html><head><title></title></head><body>"
sHtmlText = sHtmlText & Split(sText, "<body")(1)
sHtmlFile = Environ("Temp") & "\Temp.html"
sHtmlQuery = "FINDER;File:///" & Replace(sHtmlFile, "\", "/")
With CreateObject("Scripting.FileSystemObject")
.CreateTextFile(sHtmlFile).Write sHtmlText
Do Until .FileExists(sHtmlFile): Loop
End With
With ActiveSheet
.UsedRange.Cells.Clear
With .QueryTables.Add(Connection:=sHtmlQuery, Destination:=.Range("A1"))
.AdjustColumnWidth = True
.WebSelectionType = iMode 'xlAllTables, xlEntirePage
.WebFormatting = xlWebFormattingNone
.Refresh BackgroundQuery:=False
.Delete
End With
End With
End If
End Sub
Grüße Dieter
Hallo SweetOne!
Sorry, da ich keine Möglichkeit habe den Vorgang nachzustellen, kann ich Dir leider nicht weiterhelfen
Eventuell hätte Uwe (colinardo) als Allround-Experte diesbezüglich mehr Möglichkeiten und könnte weiterhelfen?
Versuchs mal mit einer PN an colinardo
Deine geposteten Links sind auch für mich sehr hilfreich, von daher mal Danke dafür...
Grüße Dieter
Sorry, da ich keine Möglichkeit habe den Vorgang nachzustellen, kann ich Dir leider nicht weiterhelfen
Eventuell hätte Uwe (colinardo) als Allround-Experte diesbezüglich mehr Möglichkeiten und könnte weiterhelfen?
Versuchs mal mit einer PN an colinardo
Deine geposteten Links sind auch für mich sehr hilfreich, von daher mal Danke dafür...
Grüße Dieter
Hallo SweetOne!
Yepp, HttpRequest wartet. Du kannst auch noch nach dem '.Send' eine Statusabfrage (MsgBox .Status) in den HttpRequest einbauen, wobei der Wert '200' für 'OK' steht...
Grüße Dieter
Yepp, HttpRequest wartet. Du kannst auch noch nach dem '.Send' eine Statusabfrage (MsgBox .Status) in den HttpRequest einbauen, wobei der Wert '200' für 'OK' steht...
Grüße Dieter
OK, dann versuchs mal damit:
Wobei Du bei Bedarf die Codezeile 17 mit einer Wartezeit versehen kannst...
Grüße aus (dem trüben) Baden-Württemberg
Dieter
Option Explicit
Option Compare Text
Private Const IE_READYSTATE_COMPLETE = 4
Public Sub Test()
'Body=xlEntirePage, AllTables=xlAllTables
Call GetWebDaten("https://www.google.de/?gws_rd=ssl", xlEntirePage)
End Sub
Private Sub GetWebDaten(ByRef sUrl, ByVal iMode As Long)
Dim sHtmlText As String, sHtmlFile As String, sHtmlQuery As String, sText As String
With CreateObject("InternetExplorer.Application")
.Navigate sUrl
Do Until .ReadyState = IE_READYSTATE_COMPLETE: Loop
'Call WaitOfLoad(2) 'Falls Seite noch nicht geladen Wartezeit aktivieren
sText = .document.body.innerHtml
.Quit
End With
If sText <> "" Then
sHtmlText = "<html><head><title></title></head><body>" & sText & "</body></html>"
sHtmlFile = Environ("Temp") & "\Temp.html"
sHtmlQuery = "FINDER;File:///" & Replace(sHtmlFile, "\", "/")
With CreateObject("Scripting.FileSystemObject")
.CreateTextFile(sHtmlFile).Write sHtmlText
Do Until .FileExists(sHtmlFile): Loop
End With
With ActiveSheet
.UsedRange.Cells.Clear
With .QueryTables.Add(Connection:=sHtmlQuery, Destination:=.Range("A1"))
.AdjustColumnWidth = True
.WebSelectionType = iMode 'xlAllTables, xlEntirePage
.WebFormatting = xlWebFormattingNone
.Refresh BackgroundQuery:=False
.Delete
End With
End With
End If
End Sub
'Funktion Warten auf Ausführung in Sekunden ( 1s = 1, 100ms = 0.1, 500ms = 0.5, 10ms = 0.01...)
Private Sub WaitOfLoad(ByVal Sekunden As Double)
Dim StopTime As Double
StopTime = Date + ((Timer + Sekunden) / 86400)
Do While StopTime >= (Date + Timer / 86400)
DoEvents
Loop
End Sub
Grüße aus (dem trüben) Baden-Württemberg
Dieter
Hallo SweetOne!
Normalerweise kann bei Https-Seiten im Browser nicht auf den Documentinhalt zugegriffen werden oder der Quelltext angezeigt werden, was dann aber per Http-Request wiederum geht. Wenn die Tabellinhalte allerdings nach dem Öffnen der Website erst nachträglich mit einer Verzögerung geladen werden, sehe ich da keine Chance die Inhalte auszulesen.
Ändert sich nach dem Laden der Daten in der Address-Leiste irgendwas?
Grüße Dieter
Normalerweise kann bei Https-Seiten im Browser nicht auf den Documentinhalt zugegriffen werden oder der Quelltext angezeigt werden, was dann aber per Http-Request wiederum geht. Wenn die Tabellinhalte allerdings nach dem Öffnen der Website erst nachträglich mit einer Verzögerung geladen werden, sehe ich da keine Chance die Inhalte auszulesen.
Ändert sich nach dem Laden der Daten in der Address-Leiste irgendwas?
Grüße Dieter
Hallo SweetOne!
Hast Du Zugriff (Rechte, Username, Passwort...) auf die Datenbank und kennst Tabellenname, Feldnamen...?
Grüße Dieter
Unter diesen Umständen muss ich wohl doch direkt die SQL Datenbank befragen.
Excel selbst schafft es nicht die SQL Abfrage durchzuführen.
Das war auch mein erster Gedanke, wollte Dich damit aber nicht überfordernExcel selbst schafft es nicht die SQL Abfrage durchzuführen.
Hast Du Zugriff (Rechte, Username, Passwort...) auf die Datenbank und kennst Tabellenname, Feldnamen...?
Grüße Dieter
Hallo SweetOne!
Zum Testen:
Connection-Beispiele sind hier noch zu finden...
Das Ganze dann in etwa so:
Grüße Dieter
Zum Testen:
SQL = "SELECT * From adressen" |
Connection-Beispiele sind hier noch zu finden...
Das Ganze dann in etwa so:
Public Sub GetData()
Call DataImport("Tabelle1", "SELECT * From [Adressen]")
End Sub
Private Sub DataImport(ByRef sSheetName, ByRef sSQL)
'Verweis-Bibliothek: Microsoft ActiveX Data Object 6.1 Library
Dim con As ADODB.Connection, rs As Recordset
Dim Wks As Worksheet, RowNext As Long, i As Long
Set con = New ADODB.Connection 'Instanzierung des Objektes
Set rs = New ADODB.Recordset 'Instanzierung des Recordsets
'Öffnen der ODBC Schnittstelle DSN ist der DataSourceName
con.ConnectionString = "Connect-Daten"
con.Open
'Dieser Teil schreibt die Daten (Spaltenüberschrift, Werte) in die Tabelle
If con.State = adStateOpen Then
rs.Open sSQL, con
Set Wks = Sheets(sSheetName): Wks.UsedRange.ClearContents
RowNext = 1
With rs
If .Fields.Count Then 'Import Spaltenüberschriften (Feldnamen)
For i = 0 To .Fields.Count - 1
Wks.Cells(RowNext, i + 1).Value = .Fields(i).Name
Next
End If
Do Until .EOF 'Import Werte
RowNext = RowNext + 1
For i = 0 To .Fields.Count - 1
Wks.Cells(RowNext, i + 1).Value = .Fields(i).Value
Next
.MoveNext
Loop
.Close
End With
con.Close
Else
MsgBox "Keine Verbindung!"
End If
End Sub