Query da File Excel



  • Query da File Excel
    di Piero (utente non iscritto) data: 29/12/2014 18:35:38

    Buonasera, cercherò di spiegare in modo chiaro e semplice il mio quesito, per quanto la natura piuttosto complessa del problema me lo consenta. In un file excel ho creato una semplice tabella che costituisce il mio database da interrogare, i cui campi sono: Nome, Cognome, Sesso, Età, Residenza, ad altri dati di rubrica. Devo estrarre da questa tabella, tramite Microsoft Query, una sotto tabella con gli stessi campi, inserendo dei criteri di selezione sul campo "Età": ad esempio età>=18. Fino ora tutto semplice, è sufficiente che nello stesso file, ma su un nuovo foglio di lavoro, creo una query attraverso il seguente percorso: Dati--> Connessione Dati Esterni-->Da Altre origini-->Da Microsoft Query-->Excel File. Seguendo la maschera di creazione guidata che excel mi propone, sono in grado di creare la mia query e restituire in output la sotto tabella desiderata, nel nuovo foglio di lavoro. Questa procedura è semplice ed intuitiva a patto che si utilizzi come denominazione degli attributi del DB, l'intestazione delle colonne della tabella indicate nelle prime celle disponibili. In particolare Microsoft Query riconosce automaticamente come intestazione delle colonne della tabella, e quindi come nome degli attributi del DB, i valori inseriti nelle celle A1, B1, C1, etc. Pertanto se inserisco le denominazioni delle colonne, "Nome, "Cognome", nelle rispettive posizioni A1, B1,.., non ho problemi nella creazione guidata della query. Il problema è che vorrei creare una tabella più articolata in cui ad esempio le intestazioni di colonna "Nome", "Cognome", verrebbero inseriti nelle celle A2 e B2, mentre nelle celle unificate A1 e B1, vorrei inserire le denominazione del metadato, cioè "Dati Anagrafici". Idem nel caso dei dati di "Rubrica", come: "Telefono fisso", "Cell", "Mail", etc. In quest'ultimo caso non riesco ad indicare, durante la creazione guidata della Query, che i gli attributi del DB da interrogare sono indicati nelle Celle A2, B2, ..etc.



  • di Piero (utente non iscritto) data: 30/12/2014 09:43:25

    Ragazzi ho allegato il file excel, con l'esempio della tabella su cui devo fare la query. La tabella 1 non mi da problemi. La tabella 2, che è quella che intendo usare, mi da invece problemi e non riesco a fargli capire che il nome degli attributi del db li deve prendere a partire dalla seconda cella, per ogni colonna.



  • di Piero (utente non iscritto) data: 30/12/2014 09:46:01

    Il nome del file corretto è Data Base. Ho allegato per errore un altro file.



  • di Grograman data: 31/12/2014 09:04:05

    Ciao!

    Ti alelgo un esempio, non proprio elegante, ma giusto per farti vedere come si possono parametrizzare le query con VBA.

    Ancora meglio sarebbe che tu modificassi i parametri direttamente dalal scheda "Dati" -> "Connessioni" -> "Proprietà" -> "Definizione" -> "Parametri"
    in quel caso puoi linkare i parametri alle celle che vuoi, ma non so perchè nell'esempio postato non lo permette, forse si può fare solo quando il DB NON è il file stesos in cui si importano i dati.

    Ad ogni modo, allego il file "Data base.zip" di cui riporto il codice.
    E' molto debole, nel senso che è solo come esempio, infatti se come campo2 scegli un campo che NON sia filtrabile in base ai due valori del "criterio" andrà in errore, e penso abbia altri mille problemi di adattabilità ;)

     
    Option Explicit
    
    Sub Import_Dati()
      Dim sPath As String, sFile As String, sQuery As String
      Dim sCampo1 As String, sCampo2 As String
      Dim rDest As Range
      Dim lMax As Long, lMin As Long
      Dim ws As Worksheet
      
      sPath = "C:Prove" 'dove pescare il file
      sFile = "Data base.xlsm" 'quale file pescare
      
      
      Set ws = ThisWorkbook.Worksheets("Query - tab1") 'in che foglio importare i dati
      
      On Error Resume Next
      ws.ListObjects("Dati_Importati").Delete
      On Error GoTo 0
      
      Set rDest = ws.Range("I2") 'dove importare i dati
      
      '''MACRO IMPOSTATA SU DUE SOLI CAMPI, VOLENDO MODIFICABILE CON UN CICLO IF PER CONTROLLARE QUANTI CAMPI SONO STATI INSERITI
      sCampo1 = ws.Range("B2")
      sCampo2 = ws.Range("B3")
      lMin = ws.Range("C3")
      lMax = ws.Range("D3")
      
      'stringa SQL per la query
      sQuery = "SELECT `'Tabella 1$'`." & sCampo1 & ",`'Tabella 1$'`." & sCampo2 & Chr(13) & _
               "FROM `'Tabella 1$'` `'Tabella 1$'`" & Chr(13) & _
               "WHERE (`'Tabella 1$'`." & sCampo2 & ">" & lMin & "And `'Tabella 1$'`." & sCampo2 & "<=" & lMax & ")" & Chr(13) & _
               "ORDER BY `'Tabella 1$'`.età DESC"
        With ws.ListObjects.Add(SourceType:=0, Source:= _
          "ODBC;DSN=Excel Files;DBQ=" & sPath & "" & sFile & ";DefaultDir=" & sPath & ";DriverId=1046;MaxBufferSize=2048;PageTimeout=5;" _
          , Destination:=rDest).QueryTable
          .CommandText = sQuery
          .RowNumbers = False
          .FillAdjacentFormulas = False
          .PreserveFormatting = True
          .RefreshOnFileOpen = False
          .BackgroundQuery = True
          .RefreshStyle = xlOverwriteCells
          .SavePassword = False
          .SaveData = True
          .AdjustColumnWidth = True
          .RefreshPeriod = 0
          .PreserveColumnInfo = True
          .ListObject.DisplayName = "Dati_Importati"
          .Refresh BackgroundQuery:=False
        End With
      Set rDest = Nothing
      Set ws = Nothing
    End Sub



  • di Piero (utente non iscritto) data: 08/01/2015 12:59:56

    Grazie mille per il prezioso aiuto. proverò ad adattare il codice alle mie esigenze. L'unica cosa è che non riesco a scaricare più il file allegato, potresti inserirlo nuovamente?