PDA

View Full Version : [Access 2007]


Teo@Unix
27-03-2009, 08:40
ho necessità di creare una query che mi esporta dei record da una tabella ad un foglio di excel, con mio rammarico ho visto che la query di esportazione in excel non viene più implementata in access 2007,:cry:

vorrei inserire un bottone nella mia maschera che mi esegue tale esportazione, qualcuno sa come posso fare?

grazie.

MarcoGG
27-03-2009, 09:27
Puoi farcela sempre con VBA, creando un semplice RecordSet sulla Tabella, ciclandolo, e copiando record per record su Excel.
In particolare, da Access puoi creare la connessione semplicemente in questo modo :

Dim CN As ADODB.Connection
Set CN = CurrentProject.Connection

Teo@Unix
27-03-2009, 09:46
Aspetta non ho capito questo codice dove lo inserisco? nel private sub del bottone che ho creato?

MarcoGG
27-03-2009, 09:52
Aspetta non ho capito questo codice dove lo inserisco? nel private sub del bottone che ho creato?

Esatto, sono le prime 2 righe di codice che devi scrivere.
Ma per ADODB assicurati di avere i riferimenti di progetto adeguati :
Microsoft ActiveX Data Objects Library 2.x ( nel tuo caso dovrebbero essere i 2.8 ).
I Rif li trovi nell'editor VBA / menu Strumenti / Riferimenti... ;)

Teo@Unix
27-03-2009, 09:58
ho capito, ho poca dimestichezza però con programmazzione windows, quindi non saprei il codice VB da inserire, come faccio a richiamare i record della tabella?

MarcoGG
27-03-2009, 10:01
Ad esempio in questo modo :

Dim CN As ADODB.Connection
Set CN = CurrentProject.Connection
Dim RS As ADODB.Recordset
Set RS = New ADODB.Recordset
Dim strSqlSelect As String
strSqlSelect = "SELECT * FROM " & nomeTabella
RS.Open strSqlSelect, CN, adOpenKeyset, adLockOptimistic

RecordSet popolato e pronto all'uso. ;)

Teo@Unix
27-03-2009, 10:07
mmm... mi da errore di run-time a questa riga però:
Set CN = CurrentProject.Connenction

Ho inserito un bottone nella maschera e inserito il codice in routine evento, mettendo il nome della mia tabella,
il comando strSqlSelect mi esporta quindi tutti i campi del record corrente?

MarcoGG
27-03-2009, 11:00
mmm... mi da errore di run-time a questa riga però:
Set CN = CurrentProject.Connenction


Se lo hai scritto così, ovvio che da errore...


Ho inserito un bottone nella maschera e inserito il codice in routine evento, mettendo il nome della mia tabella,
il comando strSqlSelect mi esporta quindi tutti i campi del record corrente?

strSqlSelect è una stringa, non un comando.
Il comando che "fa il lavoro" è il metodo RS.Open().

Teo@Unix
27-03-2009, 14:02
Alla fine ho risolto con il comando:

DoCmd.TransferSpreadsheet, che mi estrae tutti i record del database in un fglio di excel.

Ti riporto tutto il codice:

Private Sub Comando172_Click()
stDocName = "tb_Dati_analisi"
nameFile = "Db_export_Commesse_progetto"
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, stDocName, nameFile, export_Commesse_progetto, Current
MsgBox "Esportazione record riuscita in Documenti", vbInformation, "Esportazione:"
End Sub

forse puoi darmi una mano per fare in modo di selezionare solo il record corrente e non tutti record della tabella, e mi piacerebbe anche decidere dove salvare il file, non i Documenti come è impostato di default.

Grazie mille.

MarcoGG
27-03-2009, 14:25
Bah, non so. Io rimango della mia idea, anche perchè spesso i metodi semplificati difettano proprio in fase di successive modifiche. Con poche righe di codice in più hai un RecordSet popolato con cui fai quello che vuoi, in più hai la possibilità di salvare il file Xls dove ti pare :

Dim CN As ADODB.Connection
Set CN = CurrentProject.Connection
Dim RS As ADODB.Recordset
Set RS = New ADODB.Recordset
Dim strSqlSelect As String
strSqlSelect = "SELECT * FROM " & nomeTabella
RS.Open strSqlSelect, CN, adOpenKeyset, adLockOptimistic

'Applicazione Excel
Dim E As Excel.Application
Set E = New Excel.Application
E.Visible = True
Dim WBK As Excel.Workbook
Set WBK = E.Workbooks.Add()

Dim cnt As Long
cnt = 1
While RS.EOF = False
WBK.Sheets("Foglio1").Range("A" & cnt).FormulaR1C1 = RS.Fields("id").Value
WBK.Sheets("Foglio1").Range("B" & cnt).FormulaR1C1 = RS.Fields("nome").Value
WBK.Sheets("Foglio1").Range("C" & cnt).FormulaR1C1 = RS.Fields("cognome").Value
'...
'...
'...
cnt = cnt + 1
RS.MoveNext
Wend

;)