Una famiglia di sistemi di gestione per database relazionali di Microsoft progettati per semplificare l'uso.
Ciao Sandro
grazie per la risposta, proverò a seguire il suggerimento, farò qualche prova e ti farò sapere
a presto
Ciro
Questo browser non è più supportato.
Esegui l'aggiornamento a Microsoft Edge per sfruttare i vantaggi di funzionalità più recenti, aggiornamenti della sicurezza e supporto tecnico.
Buongiorno e Buon Anno a tutti
una form visualizza un elenco di dati provenienti da una Query composta da più tabelle (tre tabelle), la form contiene inoltre diverse combo con le quali attraverso routine vado a filtrare i dati da visualizzare.
Ho la necessità di esportare i dati in Excel ma, non voglio esportare i dati di tutta la query ma solo quelli filtrati, ossia una volta impostati i filtri, premendo sul pulsante "EXCEL" voglio esportare i dati che visualizzo a video.
Ho provato in due modi che, vi illustro di seguito:
La query oggetto della form si chiama "Q_STATISTICHE_CLIENTI", questa è ottenuta da tre tabelle: "CLIENTI"; "DBDDT"; e "DBDDT_DETTAGLIO", da notare che nelle tabelle oggetto della query ci sono alcuni campi "CALCOLATI".
Le COMBO della form che permettono di visualizzare i dati filtrati, per ognuna di esse sull'evento "DOPO AGGIORNAMENTO" richiamano una routine "ApplicaFiltro" che vi riporto:
Private Sub ApplicaFiltro()
Dim wFiltro As String
On Error Resume Next
wFiltro = ""
If Len(Me.cboCLIENTE & "") > 0 Then
wFiltro = wFiltro & " And RAGIONE_SOCIALE = '" & Replace(Me.cboCLIENTE, "'", "''") & "' "
End If
If Len(Me.cboDESCRIZIONE & "") > 0 Then
wFiltro = wFiltro & " And DESCRIZIONE = '" & Replace(Me.cboDESCRIZIONE, "'", "''") & "' "
End If
If Len(Me.cboMESE & "") > 0 Then
wFiltro = wFiltro & " And MESE = '" & Replace(Me.cboMESE, "'", "''") & "' "
End If
If Len(Me.cboANNO & "") > 0 Then
wFiltro = wFiltro & " And ANNO = '" & Replace(Me.cboANNO, "'", "''") & "' "
End If
If Len(wFiltro) = 0 Then
Me.SM_STAT_CLIENTI.Form.Filter = ""
Me.SM_STAT_CLIENTI.Form.FilterOn = False
Else
Me.SM_STAT_CLIENTI.Form.Filter = Mid(wFiltro, 6, Len(wFiltro))
Me.SM_STAT_CLIENTI.Form.FilterOn = True
End If
End Sub
La prima strada che ho provato a percorrere è stata quella di creare una query, la chiamo "query3", quindi all'evento click del pulsante EXCEL eseguo:
Private Sub cmdEXCEL_Click()
Const strSql As String = "select * from Q_STATISTICHE_CLIENTI "
Dim qdf As DAO.QueryDef
Set qdf = DBEngine(0)(0).QueryDefs("query3")
qdf.SQL = strSql & Me.Filter
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "query3", Me.PERCORSO & "" & "pluto" & ".xlsx", t
qdf.Close
Set qdf = Nothing
End Sub
ma, anche se filtrato, mi esporta l'intera query.
Altra strada provata, quella di creare una tabella temporanea e, all'evento click del pulsante "EXCEL" eseguo:
Private Sub cmdEXCEL_Click()
On Error GoTo Errore
DoCmd.SetWarnings (WarningOff)
'DoCmd.DeleteObject acTable, "tblFiltrati"
If Me.Filter = "" Then
DoCmd.RunSQL "SELECT Q_STATISTICHE_CLIENTI.* INTO tblFiltrati FROM Q_STATISTICHE_CLIENTI"
Else
DoCmd.RunSQL "SELECT Q_STATISTICHE_CLIENTI.* INTO tblFiltrati FROM Q_STATISTICHE_CLIENTI Where " & Me.Filter
End If
Dim Message, Title, Default, MyValue
Message = "Inserire il nome del File da salvare...!" & vbCrLf & vbCrLf & "Il File sarà salvato nella cartella: " & vbCrLf & vbCrLf & Me.PERCORSO & "" ' Set prompt.
Title = "Esporta Tabella Clienti in Excel" ' Set title.
Default = "pluto" ' Set default.
' Display message, title, and default value.
MyValue = InputBox(Message, Title, Default)
If MyValue = "" Then GoTo Errore
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "tblFiltrati", Me.PERCORSO & "" & MyValue & ".xlsx", t
Dim strInput As String
strInput = (Me.PERCORSO & "" & MyValue & ".xlsx")
Application.FollowHyperlink strInput, , True
GetUserAddress = True
GoTo A
Errore:
Select Case Err.Number
Case Is = 7874
Resume Next
Case Else
MsgBox "Non hai selezionato il nome del file " & vbCrLf & vbCrLf & "o stai tentando di aprire un file non correttamente salvato" & vbCrLf & vbCrLf & "prova a ripetere la procedura!!!", vbCritical, "ATTENZIONE!!!"
End Select
A:
DoCmd.SetWarnings (WarningOn)
End Sub
Ma mi viene segnalato l'errore di RunTime 3959 "Le colonne calcolate non sono consentite nelle istruzioni SELECT INTO"
Qualcuno sa come posso fare per poter esportare solo quello che ho precedentemente filtrato?
Grazie a tutti per la collaborazione
A presto
Ciro
Una famiglia di sistemi di gestione per database relazionali di Microsoft progettati per semplificare l'uso.
Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.
Ciao Sandro
grazie per la risposta, proverò a seguire il suggerimento, farò qualche prova e ti farò sapere
a presto
Ciro
ciao Ciro,
lascia perdere la strada della temporanea e prova a seguire il suggerimento di Nicola.
La stringa wFiltro ( non mi piace moltissimo la modalità di costruzione, ma questo e' un altro aspetto) contiene il filtro che imposti nella form e che e' contenuto nelle proprieta' filter appunto.
Quindi, impostandola come clausola where, dovresti ottenere un predicato sql per le sole righe coinvolte dallo statement, che sia o meno in join con altre tabelle, e' indifferente, e poi procedere all'esportazione su xls con il metodo transferSpreadSheet.
Studiaci su e facci sapere.
Ciao, Sandro.
Ciao Nicola
grazie per la tua risposta, ho visto la discussione del grande Sandro e, non credo si possa adattare al mio problema, nella discussione sembra si faccia riferimento a un solo filtro io invece ne ho fino a quattro in contemporanea, non riesco quindi a interpretare e a trasferire al mio programma la soluzione proposta.
Grazie comunque per l'aiuto e il suggerimento
a presto
Ciro
Ciao Ciro, guarda se questo può fare al caso tuo.
E' una discussione simile alla tua dove il grande Sandro Peruz ha dato come sempre il suo preziosissimo contributo.
Ciao Nicola.