Mam problem z makro. Niestety jestem Amatorem- w VBA (wiedza polega na losowym edytowaniu kodu). Dodatkowy problem to to, że makro ma działać w środowisku firmowym, na pobieraniu danych ze stron zabezpieczonych dwu etapową weryfikacją. Co ciekawe to już mam za sobą – makro odpytuje o hasło, makro akceptuje klucz weryfikacyjny, tworzy cookie itd. Itp. Niestety format pobranych danych bardzo mi nie odpowiada, bo jest to kod źródłowy strony, a nie sama strona z wartościami. Same wartości są pobrane, ale ukryte w HTML'owych komendach. Jak zrobić by skoroszyt został sformatowany z wartościami pobranymi danymi np. tak by nie było widocznego kodu HTML a każda kolejna wartość była w osobnej komórce. Właściwie tak byśmy widzieli stronę, która nas iteruje w Excelu, ale bez szaty graficznej, jedynie tekst, który jest umiejscowiony niemal identycznie (jeżeli chodzi o szerokość i wysokość) jak na stronie w przeglądarce. Przed wprowadzeniem podwójnej weryfikacji korzystałem z funkcji QueryTables.Add, która działała cudowie. Obecnie nie jestem wstanie tego dokonać (sama strona nie uległa zmianie).
Fragment makra który, obecnie funkcjonuje (gdzie mamy weryfikacje i pobranie danych):
ThisURL = "https://jakaś strona dynamiczna"
Dim H As Object Set H = CreateObject("WinHTTP.WinHTTPRequest.5.1") H.SetAutoLogonPolicy 0 H.SetClientCertificate "CURRENT_USER\MY\" & Environ("USERNAME") H.SetTimeouts 0, 0, 0, 0 H.Open "GET", ThisURL, False H.SetRequestHeader "Cookie", VBAMid_v1 H.Send H.WaitForResponse DoEvents A tak kiedyś było (gdzie NIE mamy weryfikacje, ale za to dane były formatowane i prezentowały się przejrzyście ):
Sheets("XXX").Range("A1:U15000").ClearContents With Sheets("XXX").QueryTables.Add(Connection:= "URL; "https://jakaś strona dynamiczna", Destination:=Sheets("XXX ").Range("$A$1"))
.Name = "Macro" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .WebSelectionType = xlEntirePage .WebFormatting = xlWebFormattingNone .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .WebDisableRedirections = False .Refresh BackgroundQuery:=False Jak zrobić tak by w kodzie weryfikacyjnym wrzucić również formatowanie? Zwykłe zastąpienie lub dopisywanie parametrów tym razem nie daje efektu np.:
Z pierwszego kodu zamiana linii:
ThisURL = "https://jakaś strona dynamiczna" Na:
ThisURL=QueryTables.Add(Connection:="URL; "https://jakaś strona dynamiczna" , Destination:=Sheets("XXX ").Range("$A$1")) Lub np. na:
ThisURL = "https://jakaś strona dynamiczna" With Sheets("XXX").QueryTables.Add(Connection:= "URL; " ThisURL" , Destination:=Sheets("XXX ").Range("$A$1")) lub też dopisują parametry z drugiego kodu .RowNumbers = False .FillAdjacentFormulas = False itd itp do pierwszego makra nie daje efektu. Bardzo bym prosił o pomoc.
Mam problem z makro. Niestety jestem Amatorem- w VBA (wiedza polega na losowym edytowaniu kodu).
Dodatkowy problem to to, że makro ma działać w środowisku firmowym, na pobieraniu danych ze stron zabezpieczonych dwu etapową weryfikacją. Co ciekawe to już mam za sobą – makro odpytuje o hasło, makro akceptuje klucz weryfikacyjny, tworzy cookie itd. Itp.
Niestety format pobranych danych bardzo mi nie odpowiada, bo jest to kod źródłowy strony, a nie sama strona z wartościami. Same wartości są pobrane, ale ukryte w HTML'owych komendach.
Jak zrobić by skoroszyt został sformatowany z wartościami pobranymi danymi np. tak by nie było widocznego kodu HTML a każda kolejna wartość była w osobnej komórce. Właściwie tak byśmy widzieli stronę, która nas iteruje w Excelu, ale bez szaty graficznej, jedynie tekst, który jest umiejscowiony niemal identycznie (jeżeli chodzi o szerokość i wysokość) jak na stronie w przeglądarce.
Przed wprowadzeniem podwójnej weryfikacji korzystałem z funkcji QueryTables.Add, która działała cudowie. Obecnie nie jestem wstanie tego dokonać (sama strona nie uległa zmianie).
Przedtem dane prezentowały się następująco:
Dane sformatowane
Obecnie:
Chaos z przeplatanym językiem HTML
Fragment makra który, obecnie funkcjonuje (gdzie mamy weryfikacje i pobranie danych):
ThisURL = "https://jakaś strona dynamiczna"
Dim H As Object
Set H = CreateObject("WinHTTP.WinHTTPRequest.5.1")
H.SetAutoLogonPolicy 0
H.SetClientCertificate "CURRENT_USER\MY\" & Environ("USERNAME")
H.SetTimeouts 0, 0, 0, 0
H.Open "GET", ThisURL, False
H.SetRequestHeader "Cookie", VBAMid_v1
H.Send
H.WaitForResponse
DoEvents
A tak kiedyś było (gdzie NIE mamy weryfikacje, ale za to dane były formatowane i prezentowały się przejrzyście ):
Sheets("XXX").Range("A1:U15000").ClearContents
With Sheets("XXX").QueryTables.Add(Connection:= "URL; "https://jakaś strona dynamiczna", Destination:=Sheets("XXX ").Range("$A$1"))
.Name = "Macro"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlEntirePage
.WebFormatting = xlWebFormattingNone
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
Jak zrobić tak by w kodzie weryfikacyjnym wrzucić również formatowanie? Zwykłe zastąpienie lub dopisywanie parametrów tym razem nie daje efektu np.:
Z pierwszego kodu zamiana linii:
ThisURL = "https://jakaś strona dynamiczna"
Na:
ThisURL=QueryTables.Add(Connection:="URL; "https://jakaś strona dynamiczna" , Destination:=Sheets("XXX ").Range("$A$1"))
Lub np. na:
ThisURL = "https://jakaś strona dynamiczna"
With Sheets("XXX").QueryTables.Add(Connection:= "URL; " ThisURL" , Destination:=Sheets("XXX ").Range("$A$1"))
lub też dopisują parametry z drugiego kodu .RowNumbers = False .FillAdjacentFormulas = False itd itp do pierwszego makra nie daje efektu. Bardzo bym prosił o pomoc.
https://stackoverflow.com/questions/62369756/error-when-scraping-data-from-a-given-website
Tylko w Twoim przypadku będzie to coś takiego:
D.body.innerHTML = H.ResponseText
wartosci = D.getElementsByTag("td").outerHTML