Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

trasferire una query in Excel

56 views
Skip to first unread message

Savux

unread,
Jan 22, 2011, 7:19:44 PM1/22/11
to
Devo trasferire i risultati di una query parametrica in Excel.
Il metodo docmd.transferspreashsheet attende l'imputazione dei
parametri. Creare una form con delle caselle dove salvare il valore dei
parametri mi sembra eccessivo.
C'è un modo più semplice per eseguire l'operazione in automatico? Grazie.

@Alex

unread,
Jan 23, 2011, 4:51:20 AM1/23/11
to


Questo codice consente di esportare in EXCEL, eventualmente anche in
un XLT(Template) definendo la cella origine dell'INCOLLA...!

Dim xlApp As Object ' Oggetto EXCEL
Dim oWkb As Object ' Oggetto WORKBOOK

Set xlApp = CreateObject("Excel.Application")

Set oWkb = xlApp.Workbooks.Add()

oWkb.SaveAs "C:\TestExport.xls", 43

' Scrivo nella Cella A1 il Recordset proveniente dalla Query
parametrica...
oWkb.Sheets(1).Range("A1").CopyFromRecordset GetRS(IdCliente)

Questa è una Funzione che restituisce un RS da una Query Parametrica
come la intendi tu... ovviamente modificala con i Parametri che ti
servono...!

Function GetRS(IdCodiceCliente As Long)
Dim qdf As DAO.QueryDef
Dim rs As DAO.Recordset
Set qdf = CurrentDb.QueryDefs("QryMovimenti")
qdf.Parameters![CodiceCliente:] = IdCodiceCliente
Set rs = qdf.OpenRecordset
If rs.EOF And rs.BOF Then
Msgbox "Nessun Movimento per questo Cliente"
Exit Function
End IF
' In RS ho tutti i dati
End Function

Ciao
@Alex

Savux

unread,
Jan 23, 2011, 6:55:48 AM1/23/11
to
Grazie della risposta. Immagino che in questa funzioni manchi una riga
del tipo
GetRS=rs

> Function GetRS(IdCodiceCliente As Long)
> Dim qdf As DAO.QueryDef
> Dim rs As DAO.Recordset
> Set qdf = CurrentDb.QueryDefs("QryMovimenti")
> qdf.Parameters![CodiceCliente:] = IdCodiceCliente
> Set rs = qdf.OpenRecordset
> If rs.EOF And rs.BOF Then
> Msgbox "Nessun Movimento per questo Cliente"
> Exit Function
> End IF
> ' In RS ho tutti i dati
> End Function

Una volta sistemato questo particolare, il codice viene eseguito senza
errori. Perň mi ritrovo con un foglio di Excel vuoto.
Al momento ho risolto trasformando la query di selezione in una query di
creazione, e quindi andando a scrivere in Excel il recordset della
tabella fisica e non della query, anche se mi piacerebbe capire il
mtovio di questo problema. Grazie.

Savux

unread,
Jan 23, 2011, 8:08:06 AM1/23/11
to

> Al momento ho risolto trasformando la query di selezione in una query di
> creazione, e quindi andando a scrivere in Excel il recordset della
> tabella fisica e non della query

Il che, me ne accorgo ora, rende inutile il codice vba alternativo al
comando docmd.transferspreadsheet...

@Alex

unread,
Jan 23, 2011, 5:38:24 PM1/23/11
to
On 23 Gen, 12:55, Savux <sa...@mailinator.com> wrote:
> Grazie della risposta. Immagino che in questa funzioni manchi una riga
> del tipo
> GetRS=rs

No la funzione restituisce già un'oggetto Recordset... quindi non
serve.
Oltretutto l'assegnazione di Oggetti si fa, eventualmente serva, con
il SET:

Set Oggetto=AltroOggetto

Ma nel tuo caso non serve.... ovvio che il codice che ti ho postato
andava sistemato essendo uno stralcio di una mia routine.

> > Function GetRS(IdCodiceCliente As Long)
> >     Dim qdf As DAO.QueryDef
> >     Dim rs As DAO.Recordset
> >     Set qdf = CurrentDb.QueryDefs("QryMovimenti")
> >     qdf.Parameters![CodiceCliente:] = IdCodiceCliente
> >     Set rs = qdf.OpenRecordset
> >     If rs.EOF And rs.BOF Then
> >         Msgbox "Nessun Movimento per questo Cliente"
> >         Exit Function
> >     End IF
> >     ' In RS ho tutti i dati
> > End Function
>
> Una volta sistemato questo particolare, il codice viene eseguito senza

> errori. Però mi ritrovo con un foglio di Excel vuoto.


> Al momento ho risolto trasformando la query di selezione in una query di
> creazione, e quindi andando a scrivere in Excel il recordset della
> tabella fisica e non della query, anche se mi piacerebbe capire il
> mtovio di questo problema. Grazie.

Secondo me non hai capito bene cosa fa quello che ti ho postato.

@Alex

Savux

unread,
Jan 25, 2011, 4:39:20 PM1/25/11
to
> On 23 Gen, 12:55, Savux <sa...@mailinator.com> wrote:
>> Grazie della risposta. Immagino che in questa funzioni manchi una riga
>> del tipo
>> GetRS=rs
>
> No la funzione restituisce già un'oggetto Recordset... quindi non
> serve.

Dove? Io non vedo l'assegnazione...

> Oltretutto l'assegnazione di Oggetti si fa, eventualmente serva, con
> il SET:
>
> Set Oggetto=AltroOggetto

Sì, hai ragione.

> Ma nel tuo caso non serve.... ovvio che il codice che ti ho postato
> andava sistemato essendo uno stralcio di una mia routine.

D'accordo, andava sistemato. Ma perché non serve restituire l'oggetto
rs? A me pare una cosa obbbligatoria...

>>> Function GetRS(IdCodiceCliente As Long)
>>> Dim qdf As DAO.QueryDef
>>> Dim rs As DAO.Recordset
>>> Set qdf = CurrentDb.QueryDefs("QryMovimenti")
>>> qdf.Parameters![CodiceCliente:] = IdCodiceCliente
>>> Set rs = qdf.OpenRecordset
>>> If rs.EOF And rs.BOF Then
>>> Msgbox "Nessun Movimento per questo Cliente"
>>> Exit Function
>>> End IF
>>> ' In RS ho tutti i dati
>>> End Function

> Secondo me non hai capito bene cosa fa quello che ti ho postato.

Evidentemente è come dici tu, ma ancora non capisco. Se copio alla
lettera quanto mi hai suggerito, la riga

oWkb.Sheets(1).Range("A1").CopyFromRecordset GetRS(IdCliente)

mi restituisce Errore di run-time 13 - Tipo non corrispondente.

0 new messages