Domanda Power Query Dati da Web

Mies91

Nuovo utente
22 Maggio 2019
9
1
28
Excell2019
0
Buonasera a tutti.
Mi sto avvicinando da poco a questo mondo, cominciando a guardare vari tutorial ( anche quelli proposti qui nel sito per la quale vi ringrazio).
Provando ad importare dati da web da un sito di cui possiedo le credenziali ( username e password ) ed impostando tali credenziali nella pagina di impostazioni di origini dei dati nella sezione Basic, una volta incollato l'url della pagina di cui vorrei importare i dati mi si apre la stessa pagina dove inserisco le credenziale nelle impostazioni delle query e mi dice "fornite credenziali non valide"

Anche se volessi farlo in modalità anonima, incollando l'url, mi si blocca alla pagina di login in cui non mi fa nemmeno inserire le credenziali.

Come posso risolvere il problema?Ho provato anche con vba ( seguendo un post sempre qui del forum ) e riesco a caricare la pagina ed inserire le credenziali.... ma non riesco a cloccare il bottone per collegarmi xD
Sarebbe per me comodo poter importare da query senza usare vba, ma se fosse necessario, potreste reindirizzarmi ad un tutorial che possa aiutarmi? O magari fornirmi la soluzione?

Grazie in anticipo!
 

klingklang

Ciappinaro VBA_Expert
Expert
20 Ottobre 2017
5.238
213
43
San Giovanni in Persiceto (BO)
www.excelswissknife.com
2016, 365
376
Ciao. Se la maschera di login del sito è proprietaria, nel senso che richiede l'inserimento di nome utente e password all'interno di campi specifici predisposti nel codice HTML del sito, il procedimento di autenticazione non può essere "indovinato" da Power Query. Ti occorre una procedura in VBA che identifichi gli oggetti dentro cui inserire i codici di autenticazione, e possa simulare la digitazione all'interno degli stessi. Forse quindi la discussione è da spostare in Macro e VBA, oppure ne puoi aprire un'altra in quella sezione
 
  • Like
Reactions: Mies91

Mies91

Nuovo utente
22 Maggio 2019
9
1
28
Excell2019
0
Innanzitutto grazie per la risposta.
Ho già letto la discussione in merito alla questione login con vba. Anche riuscendo ad accedere tramite macro, il problema sarebbe comunque andare a filtrare i dati che mi interesso scrivendo il codice (dovendo avere conoscenze anche di html tra l'altro). Power query sarebbe stata, per così dire, più intuitiva grazie all'interfaccia. Non si può con una macro loggarsi per poi passare la palla al power query, vero?
 

ibernet

Utente abituale
31 Maggio 2019
101
28
O365
5
In teoria si può fare ma è un po' complicato, va fatto tutto in vba, powerquery compreso sempre in vba.
Spiegarti come fare mi richiederebbe un po' di ricerca e dovrei scrivere un codice abbastanza complesso che mi porterebbe via troppo tempo, mi dispiace ^^

Ti lascio uno spunto condividendoti un codice da cui partire se ci vuoi provare, io qui non leggo dal web e faccio una cosa diversa.. ma il metodo di lavoro per arrivarci al momento penso sia solo questo.
Visual Basic:
Private Function CreateQuery(EnvType As String, Type_of_Run As String, BaseDati As String, WF_TKT As String)
Dim M As String
Dim qName As String
Dim qDesc As String
Dim i As Integer
Dim QuerySQL As String
Dim qry As WorkbookQuery
Dim currentSheet As Worksheet
Dim TentativiErrore As Integer

On Error GoTo QueryUpdateWaring
Application.DisplayAlerts = False
TentativiErrore = 1

    ' We load the query defintions from the first worksheet
    qName = BaseDati
    qDesc = ""
    'M = "let Source = Sql.Database(""" & "ISTANZA" & """, """ & "DATABASE" & """, [Query=""Select *#(lf)From [" & "SCHEMA" & "].[" & BaseDati & "]#(lf)WHERE [ENVTYPE]='" & EnvType & "' And [TYPE_OF_RUN]='" & Type_of_Run & "' And [WF_TKT]=" & WF_TKT & """]) in Source """
    M = "let Source = Sql.Database(""" & Sheets("Staging").Cells(7, "B").Text & """, """ & Sheets("Staging").Cells(8, "B").Text & _
    """, [Query=""Select *#(lf)From [" & Sheets("Staging").Cells(9, "B").Text & "].[" & BaseDati & "]#(lf)WHERE [ENVTYPE]='" & _
    EnvType & "' And [TYPE_OF_RUN]='" & Type_of_Run & "' And [WF_TKT]=" & WF_TKT & """]) in Source "
   
    If DoesQueryExist(qName) Then
        ' This query already exists We will delete it first
        Call DeleteQuery(qName, qDesc, M, i)
        ' In case we have worksheet that was created by this macro for the new query, let's delete it
        CleanSheet (qName)
    End If
   
    ' The new interface to create a new Power Query query. It gets as an input the query name, M formula and description
    Set qry = ThisWorkbook.Queries.Add(qName, M, qDesc)
   
    ' We check if data should be loaded to Data Model
    shouldLoadToDataModel = "FALSO"
   
    ' We check if data should be loaded to worksheet
    shouldLoadToWorksheet = "FALSO"
   
    If shouldLoadToWorksheet Then
        ' We add a new worksheet with the same name as the Power Query query
        Set currentSheet = Sheets.Add(After:=ActiveSheet)
        currentSheet.Name = qName
   
        If Not shouldLoadToDataModel Then
            ' Let's load to worksheet only
            LoadToWorksheetOnly qry, currentSheet
        Else
            ' Let's load to worksheet and Data Model
            LoadToWorksheetAndModel qry, currentSheet
        End If
    ElseIf shouldLoadToDataModel Then
        ' No need to load to worksheet, only Data Model
        LoadToDataModel qry
    End If

Exit Function

QueryUpdateWaring:
If TentativiErrore < 5 Then
    Call sSleep(30000) 'attendo 30 secondi prima di riprovare
    Resume
Else
    'Se il ciclo è andato in errore per 5 volte
    'Termino la procedura dando un messaggio all'utente e invio una mail al Team RNP
    Dim nome As String
    nome = Left(ActiveWorkbook.Name, InStr(ActiveWorkbook.Name, ".") - 1)
    Dim UserName As String
    Call invio_errore_UpdatePowerBI(nome, User_Detection)
    Exit Function
End If

End Function

Private Function DeleteQuery(qName As String, qDesc As String, M As String, i As Integer)
   
    Dim qry As WorkbookQuery
    Dim answer As VbMsgBoxResult
    Dim LoadToDataModel As Boolean
    Dim loadToWorksheet As Boolean
    Dim currentSheet As Worksheet
   
    shouldLoadToDataModel = "FALSO"
    shouldLoadToWorksheet = "FALSO"
    ' We get from the first worksheets all the data in order to know which query to delete, including its worksheet, connection and Data Model is needed
   
    If shouldLoadToDataModel Or shouldLoadToWorksheet Then
        Dim con As WorkbookConnection
        Dim conString As String
                   
        For Each con In ThisWorkbook.Connections
            If Not con.InModel Then
                ' This is not a Data Model conenction. We created this connection without the "Power Query - " prefix, to determine if we should delete it, let's check the connection string
                If Not IsNull(con.OLEDBConnection) Then
                    ' This is a OLEDB Connection. Good chance it is our connection. Let's check the connection string
                    conString = con.OLEDBConnection.Connection
                    Dim prefix As String
                    prefix = "Provider=Microsoft.Mashup.OleDb.1;"
                    If (Left(conString, Len(prefix)) = prefix) And (0 < InStr(conString, "Location=" & qName)) Then
                        ' This is our connection
                        ' It starts with "Provider=Microsoft.Mashup.OleDb.1;" and contains "Location=" with our query name. This is our connection.
                        con.Delete
                    End If
                End If
            ElseIf (InStr(1, con.Name, "Query - " & qName)) Then
                ' We created this connection with "Power Query - "  prefix, so we can this connection
                con.Delete
            End If
        Next
    End If
   
    If shouldLoadToWorksheet Then
        CleanSheet (qName)
    End If
   
    If DoesQueryExist(qName) Then
        ' Deleting the query
        Set qry = ThisWorkbook.Queries(qName)
        qry.Delete
    End If
       
End Function

Private Function CleanSheet(ByVal sheetName As String)
    ' Helper function to try to delete the worksheet if exists
    On Error Resume Next
    ThisWorkbook.Sheets(sheetName).Delete
End Function

Private Function DoesQueryExist(ByVal queryName As String) As Boolean
    ' Helper function to check if a query with the given name already exists
    Dim qry As WorkbookQuery
   
    If (ThisWorkbook.Queries.Count = 0) Then
        DoesQueryExist = False
        Exit Function
    End If
   
    For Each qry In ThisWorkbook.Queries
        If (qry.Name = queryName) Then
            DoesQueryExist = True
            Exit Function
        End If
    Next
    DoesQueryExist = False
End Function

Private Function LoadToWorksheetOnly(query As WorkbookQuery, currentSheet As Worksheet)
    ' The usual VBA code to create ListObject with a Query Table
    ' The interface is not new, but looks how simple is the conneciton string of Power Query:
    ' "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=" & query.Name
   
    With currentSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=" & query.Name _
        , Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdDefault
        .CommandText = Array("SELECT * FROM [" & query.Name & "]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = False 'Aggiorna query in BackGround
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = False
        .Refresh BackgroundQuery:=False
    End With
   
End Function

Private Function LoadToWorksheetAndModel(query As WorkbookQuery, currentSheet As Worksheet)
    ' Let's load the query to the Data Model
    LoadToDataModel query
   
    ' Now we can load the data to the worksheet
    With currentSheet.ListObjects.Add(SourceType:=4, Source:=ActiveWorkbook. _
        Connections("Query - " & query.Name), Destination:=Range("$A$1")).TableObject
        .RowNumbers = False
        .PreserveFormatting = True
        .PreserveColumnInfo = False
        .AdjustColumnWidth = True
        .RefreshStyle = 1
        .ListObject.DisplayName = Replace(query.Name, " ", "_") & "_ListObject"
        .Refresh
    End With
End Function

Private Function LoadToDataModel(query As WorkbookQuery)
   
    ' This code loads the query to the Data Model
    ThisWorkbook.Connections.Add2 "Query - " & query.Name, _
        "Connection to the '" & query.Name & "' query in the workbook.", _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=" & query.Name _
        , """" & query.Name & """", 6, True, False

End Function
 

klingklang

Ciappinaro VBA_Expert
Expert
20 Ottobre 2017
5.238
213
43
San Giovanni in Persiceto (BO)
www.excelswissknife.com
2016, 365
376
Ciao ibernet @ibernet , premetto che non ho mai lavorato facendo interagire VBA e Power Query, ma senza entrare nel merito della tua procedura, presumo si tratti di un modo per generare il codice M in modo dinamico e parametrizzato. Se ho capito bene, non vedo comunque come si possa iniziare il web scraping tramite VBA, inserire l'autenticazione e POI passare il sito così visualizzato a Power Query... mi sfugge qualcosa?

Grazie come sempre
E.
 

ibernet

Utente abituale
31 Maggio 2019
101
28
O365
5
Ciao ibernet @ibernet , premetto che non ho mai lavorato facendo interagire VBA e Power Query, ma senza entrare nel merito della tua procedura, presumo si tratti di un modo per generare il codice M in modo dinamico e parametrizzato. Se ho capito bene, non vedo comunque come si possa iniziare il web scraping tramite VBA, inserire l'autenticazione e POI passare il sito così visualizzato a Power Query... mi sfugge qualcosa?

Grazie come sempre
E.
Ciao klingklang @klingklang , dici bene, il codice che ho girato era di esempio per mostrare come far interagire vba con powerquery.
va sicuramente fatta un po' di ricerca per capire come passare i parametri di login oppure come fare il login in vba e poi permettere a powerquery l'accesso.

Diciamo che tramite vba/powershell ho fatto uno script che interagisce con le schedulazioni di PBI Desktop e li faccio anche il login, quindi sulla falsa riga presumo si possa fare anche in questo caso.

E' il motivo per cui ho scritto "in teoria" :)

Purtroppo sono sempre con le bombe e non ho tempo per fare esperimenti a meno che non rientrino nel contingente di quello che sto seguendo :p

Questo caso specifico non l'ho mai trattato
 

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!