Wpis z mikrobloga

#excel #vba #visual #basic

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.
  • 4
  • Odpowiedz