Newsgroup: it.comp.appl.access
Titolo: Urgente...esportare in excel con filtro

Salve a tutti, riposto un'aiuto urgentissimo.
Ho bisogno di esportare urgentemente 2 tabelle con filtraggio su di
una di queste.
Cercando una soluzione nel ng ho trovato un codice che fa al caso mio,
ma non so come far estrapolare da due tabelle invece di una. Mi date
un consiglio di come fare? Dovrei consegnare il consolidato dei soci
al piu' presto possibile.
Riporto sotto il codice che ho trovato e adattato per le mie esigenze,
dategli un'occhiata e fatemi sapere come posso fare per il mio
problema.
-------------------------------------------------------------
Private Sub ESPORTA_Click()
Dim excApp As Object
    Dim excDoc As Object
    Dim blOpen As Boolean
    Dim rst As Recordset
    Dim n As Integer
   On Error Resume Next
    blOpen = True
    Set excApp = GetObject(, "Excel.Application")
    If Err.Number = 429 Then
        Set excApp = CreateObject("Excel.Application")
        blOpen = False
        Err.Number = 0
            End If
    On Error GoTo gestErrori
    Set excDoc = excApp.Workbooks.Open("C:\Documents and Settings
\Bifulco1\Desktop\SOCI\CONSOLIDATO 2011\CONSOLIDATO.xlsx")
    excApp.Visible = True
    'Apro il recordset
    Set rst = CurrentDb.OpenRecordset("ESPORTA_EXCELQuery")
    'contatore righe ESPORTA_EXCELQuery
    n = 1
   'Copia tutti i record di ESPORTA_EXCELQuery nel file excel
    With rst
    .MoveFirst ' mi sposto su primo record
    While Not .EOF
    n = n + 1
    excDoc.Worksheets(1).Cells(n, 1) = !GruppoDi  'Cells(Riga,Colonna)
    excDoc.Worksheets(1).Cells(n, 2) = !COGNOME
    excDoc.Worksheets(1).Cells(n, 3) = !NOME
    excDoc.Worksheets(1).Cells(n, 4) = !LuogoNascita
    excDoc.Worksheets(1).Cells(n, 5) = !DataNascita
    excDoc.Worksheets(1).Cells(n, 6) = !CompCri
    excDoc.Worksheets(1).Cells(n, 7) = !DataVer    'qui deve riportare
la data filtrata del 1° anno cioe' 2009
    excDoc.Worksheets(1).Cells(n, 8) = !DataVer    'qui deve riportare
la data filtrata del 2° anno cioe' 2010
    excDoc.Worksheets(1).Cells(n, 9) = !DataVer    'qui deve riportare
la data filtrata del 3° anno cioe' 2011
    .MoveNext 'passa al prossimo record
    Wend
    End With
   rst.Close
   Set rst = Nothing
    If Not blOpen Then
        excDoc.Close savechanges:=True
        excApp.Application.Quit
    End If
esci:
    Set excDoc = Nothing
    Set excApp = Nothing
    Exit Sub
gestErrori:
    MsgBox Err.Number & " - " & Err.Description
    GoTo esci
End Sub
--------------------------------------
sono riuscito ad esportare quello che mi serve in excel, ma non so
come filtrare DataVer.
Come vedete nel codice invece di inserire una tabella, ho inserito una
query, perche' i dati da esportare si trovano su due tabelle. Solo che
ho un problema, non so come filtrare il campo DataVer ed ed esportare
il filtraggio su tre colonne del file excel.
Nella query ho inserito una tabella con i primi 6 campi, e dalla
seconda tabella ho prelevato solo il campo DataVer che si trovano le
date dei pagamenti dei soci.
Ora io avrei bisogno di filtrare questo campo esportando solo un range
di date, e riportarle su tre colonne del file excel.
esempio:
----------------
  DataVer
----------------
24/06/2005
19/01/2006
19/01/2007
13/01/2009
26/01/2010
15/02/2011
----------------
Questi sono i dati presenti nel campo DataVer per ogni socio.
Dovrei filtrare questo unico campo estrapolando solo tre date e
riportarlo nel file excel, una data per ogni colonna.
Spero di non aver fatto un casino per farmi capire.
Vi ringrazio dell'aiuto.

      MsgBox Err.Number&  " - "&  Err.Description

Non so se ho capito cosa intendi, ma provo:
     While Not .EOF
     	n = n + 1
	'metti qui il controllo generale sulla data
	if !dataver between dAnnoInizio and dAnnoFine then 'ovviamente devi definire le variabile del range interessato oppure usi le costanti con year(!dataver)
    		 excDoc.Worksheets(1).Cells(n, 1) = !GruppoDi  'Cells(Riga,Colonna)
     		excDoc.Worksheets(1).Cells(n, 2) = !COGNOME
     		excDoc.Worksheets(1).Cells(n, 3) = !NOME
     		excDoc.Worksheets(1).Cells(n, 4) = !LuogoNascita
     		excDoc.Worksheets(1).Cells(n, 5) = !DataNascita
     		excDoc.Worksheets(1).Cells(n, 6) = !CompCri
		select case year(!dataver)
			case 2009
		    		excDoc.Worksheets(1).Cells(n, 7) = !DataVer    'qui deve riportare
			case 2010
		    		excDoc.Worksheets(1).Cells(n, 8) = !DataVer    'qui deve riportare
			case 2011
		    		excDoc.Worksheets(1).Cells(n, 9) = !DataVer    'qui deve riportare
		end select
	endif
     	.MoveNext 'passa al prossimo record
     Wend
Nicoletta


Grazie della tua risposta, ho inserito il codice mi da questo errore
su between: Errore di compilazione: Previsto: Then oppure Goto.
Ho provato a leggere l'help, ma non sono riuscito a risolvere il
problema, mi dici cosa devo cambiare o inserire?
Ti ringrazio.

 problema, mi dici cosa devo cambiare o inserire?
AFAIK l'operatore "between" non esiste in VBA, bensi' in SQL ;)
Popi


E cosa puoi consigliarmi tu?

 E cosa puoi consigliarmi tu?
Di dirci com'e' fatta la query ESPORTA_EXCELQuery e la struttura delle
tabelle, tanto per cominciare.
Ad esempio: se la query estrae N righe per socio, in cui ogni riga
contiene gli stessi dati tranne la data e' un conto.
Se, invece, hai messo in piedi una query che estrae una sola riga per
socio con N colonne contenenti le diverse date la cosa si fa un
tantino diversa.
In pratica, a seconda delle strutture dati potrebbe essere conveniente
modificare:
- la query per farle estrarre direttamente le 3 date ultime,
- la routine per estrarre separatamente i dati dei soci e dei
pagamenti.
Popi
Popi


Ciao,
apri la query "ESPORTA_EXCELQuery in visualizzazione SQL, copia tutte
le istruzioni  e incollale prima di aprire il recordset aggiungendo il
filtro per le date;
in pratica:
Dim strsql as string
strsql = "Select.... (prime righe istruzione sql  escluso From + uno
spazio bianco) " _
            &" FROM ....... (origine tabelle e links +uno spazio
bianco) " _
            &"WHERE  qui metti il filtro per anno between ... and ...
come indicato da Nicoletta + spazio bianco se ci sono ulteriori
istruzioni altrimenti chiudi semplicemente le virgolette"
Set rst = CurrentDb.OpenRecordset(strsql)
etc.
Buona fortuna


certo che s�, penso a sql e scrivo gli if...... :-)
sostituisci con !dataver >= dAnnoInizio and !dataver <= dAnnoFine then
Nicoletta


Ciao, le query sono queste:
Esporta:
SELECT [SOCI GENERALE].GruppoDi, [SOCI GENERALE].Cognome, [SOCI
GENERALE].Nome, [SOCI GENERALE].LuogoNascita, [SOCI
GENERALE].DataNascita, [SOCI GENERALE].CompCri, PAGAMENTI.DataVer, *
FROM [SOCI GENERALE] INNER JOIN PAGAMENTI ON [SOCI GENERALE].ID =
PAGAMENTI.IdSoc
WHERE (((PAGAMENTI.DataVer) Between [FORMS]![CONSOLIDATO]![Dalla Data]
And [FORMS]![CONSOLIDATO]![Alla Data]));
SOCI GENERALE Query:
SELECT [SOCI GENERALE].ID, [SOCI GENERALE].COGNOME, [SOCI
GENERALE].NOME, [SOCI GENERALE].SESSO, [SOCI GENERALE].DataNascita,
[SOCI GENERALE].LuogoNascita, [SOCI GENERALE].CodFisc, [SOCI
GENERALE].INDIRIZZO, [SOCI GENERALE].CITTA, [SOCI GENERALE].CAP, [SOCI
GENERALE].PROV, [SOCI GENERALE].EMAIL, [SOCI GENERALE].TelDom, [SOCI
GENERALE].TelCell, [SOCI GENERALE].LINGUE, [SOCI GENERALE].TipoPat,
[SOCI GENERALE].BREVETTI, [SOCI GENERALE].CompCri, [SOCI
GENERALE].GruppoDi, [SOCI GENERALE].NTess, [SOCI GENERALE].DataTess,
[SOCI GENERALE].AnnoIscr, [SOCI GENERALE].DataEsame, [SOCI
GENERALE].TitoloStudio, [SOCI GENERALE].NOTE, [SOCI
GENERALE].DataRegScheda
FROM [SOCI GENERALE]
ORDER BY [SOCI GENERALE].ID, [SOCI GENERALE].COGNOME, [SOCI
GENERALE].NOME;
La struttura delle tabelle sono composte in questo modo:
Una tabella SOCI GENERALE con i dati anagrafici dei soci.
Una tabella PAGAMENTI con i dati dei pagamenti
Una maschera DETTAGLI SOCIO come origine record la query SOCI GENERALE
Query
Una sottomaschera PAGAMENTI nella maschera DETTAGLI SOCIO
ecco questa è la struttura del db.
Ora quello che mi servirebbe fare, esportare solo da alcuni campi
dalla tabella SOCI GENERALE (vedi query ESPORTA)
e le date di pagamento dalla tabella PAGAMENTI.
Ovviamente ad ogni socio deve corrispondere la sua data di pagamento.
Essendo che nella tabella pagamenti c'e' solo un campo "DataVer" con
inserite date differenti tra loro.
Esempio: ogni socio fa il pagamento ogni anno e viene inserita la data
del pagamento, nella sua scheda personale mi escono tutti pagamenti
effettuati nei divesi anni.
Ora ho bisogno di estrapolare (oltre ad alcuni campi del db) anche gli
ultimi tre anni di pagamento e riportarli in un foglio excel, ogni
anno nella sua colonna.
esempio da esportare nel foglio excel.
Gruppo di | Cognome | Nome | luogo di nascita | Data di Nascita |
Componente CRI | Anno 2009 | Anno 2010 | Anno 2011|
Ti ringrazio in anticipo della tua disponibilità.
Se riesci a risolvermi il problema, avrei risolto un enorme lavoro che
ora faccio ancora a mano.


Ciao,
per ottenere il risultato voluto, io modificherei il codice  in questa
maniera:
.....
dim strsql as string
strsql="SELECT [SOCI GENERALE].ID, [SOCI GENERALE].GruppoDi, [SOCI
GENERALE].Cognome, [SOCI
GENERALE].Nome, [SOCI GENERALE].LuogoNascita, [SOCI
GENERALE].DataNascita, [SOCI GENERALE].CompCri, PAGAMENTI.DataVer, * "
_
&" FROM [SOCI GENERALE] LEFT JOIN PAGAMENTI ON [SOCI GENERALE].ID =
PAGAMENTI.IdSoc " _
&" WHERE (((Right(PAGAMENTI.DataVer,4) Between '"& Right([FORMS]!
[CONSOLIDATO]![Dalla Data],4)
&"' And '" & RIGHT([FORMS]![CONSOLIDATO]![Alla Data],4) &"')) " _
&" ORDER BY   [SOCI GENERALE].Cognome, [SOCI
GENERALE].Nome,PAGAMENTI.DataVer"
'***  L'istruzione SQL seleziona tutti i soci, che abbiano o non
abbiano effettuato versamenti tra le date indicate nel form.
Naturalmente ci saranno più records per ogni socio ,'ordinamento è per
Cognome,Nome e data pagamento del socio ma può essere modificato a
piacere cercando però di avere sempre un ordinamento che tenga vicini
gli id socio
Dim MyIDSocio as long     '***** ritenendo che l'ID delle tabell soci
sia un camo long dichiaro un campo MyIDSocio per evitare di aver nel
foglio di excel più righe con il nome dello stesso socio
myIDsocio=0
 Set rst = CurrentDb.OpenRecordset(strsql)
    'contatore righe ESPORTA_EXCELQuery
    n = 1
   'Copia tutti i record di ESPORTA_EXCELQuery nel file excel
    rst.MoveFirst ' mi sposto su primo record
    DO Until rst.EOF
   if  MyIDSocio=rst!ID then goto ScriveData
    n = n + 1
    excDoc.Worksheets(1).Cells(n, 1) =rst!GruppoDi
'Cells(Riga,Colonna)
    excDoc.Worksheets(1).Cells(n, 2) = rst!COGNOME
    excDoc.Worksheets(1).Cells(n, 3) = rst!NOME
    excDoc.Worksheets(1).Cells(n, 4) = rst!LuogoNascita
    excDoc.Worksheets(1).Cells(n, 5) = rst!DataNascita
    excDoc.Worksheets(1).Cells(n, 6) = rst!CompCri
ScriveData:
   if Right(rst!DataVer,4) =RIGHT([FORMS]![CONSOLIDATO]![Alla Data],4)
- 2  'qui filtra la data del 1° anno cioe' 2009
        excDoc.Worksheets(1).Cells(n, 7) = rst!DataVer
    end if
    if Right(rst!DataVer,4) =RIGHT([FORMS]![CONSOLIDATO]![Alla Data],
4) - 1 ''qui  filtra la data del 2° anno cioe' 2010
        excDoc.Worksheets(1).Cells(n, 8) = rst!DataVer
    End if
     if Right(rst!DataVer,4) =RIGHT([FORMS]![CONSOLIDATO]![Alla Data],
4)
         excDoc.Worksheets(1).Cells(n, 9) = rst!DataVer    'qui filtra
la data del 3° anno cioe' 2011
     End If
MyIDSocio=rst!ID
    rst.MoveNext 'passa al prossimo record
   loop
   rst.Close
   Set rst = Nothing
........................
Penso che debba funzionare.
Ciao


Ciao, grazie di avermi risposto stavo controllando in continuazione se
qualcuno  avesse risposto.
Scusami della molta poca esperienza in campo, ma il primo codice e' un
sql che devo copiare al posto del mio Esporta?
Il secondo va nella query SOCIO GENERALE?
Il terzo va collegato al pulsante Esporta?
Perche' dopo aver copiato ed incollato il tuo codice sql nella mia sql
Esporta mi da questo errore:
Istruzione SQL non valida. Prevista
'DELETE','INSERT','PROCEDURE','SELECT' o 'UPDATE'.
Lo stesso errore me lo da anche con la query di SOCI GENERALE.
Sul codice da applicare al pulsante per la conversione mi da questo
errore:
"errore di compilazione  errore di sintassi" suquesta riga
   if Right(rst!DataVer,4) =RIGHT([FORMS]![CONSOLIDATO]![Alla Data],4)
La verita' non so dove mettere le mani.
Me lo potersti spiegare piu' maccheronicamente?
Scusa dell'incompetenza
Grazie.


Ciao,
da quanto ho capito dovresti avere due query salvate che hai chiamato
"ESPORTA_EXCELQuery" e "SOCI GENERALE": lasciale come erano in origine
e non ci pensare più.
Probabilmente non sono stato chiaro nella risposta: io ho modificato
un po' il tuo codice  (ritengo sia la routine dell'evento su clic del
pulsante "esporta") usando una istruzione sql invece della query
salvata ESPORTA_EXCELQuery;
e per questo ho aggiunto l'istruzione
...
dim strsql as string    ' dichiara il campo strsql come stringa
...
strsql=" Select .... etc. un istruzione SQL che non fa altro che
prendere dati dalla query originale ESPORTA_EXCELQuery e dalla query
"Soci Generale" aggiungendo il campo [Soci Gnenerale]ID e cambiando la
Inner Join in Left Join per avere anche i soci che non hanno pagato.
Sarebbe meglio prendere i dati direttamente dalla tabelle Soci e quidi
ti conviene sostituire nella istruzione SQL [Soci] a [Soci Generale]
l'errore 1) "Istruzione SQL non valida." potrebbe accadere perchè
probabilmente qualche chiusura di doppi apici o qualche spazio non è
stato correttamente rispettato nel trasferire l'istruzione nell'editor
VBA; ti consiglio di portare su di una unica riga l'istruzione:
strsql="SELECT [SOCI].ID, [SOCI].GruppoDi, [SOCI].Cognome,
[SOCI].Nome, [SOCI].LuogoNascita, [SOCI].DataNascita, [SOCI].CompCri,
PAGAMENTI.DataVer,* " _
badando che non ci siano spazi fra " e Select, ci sia uno spazio
libero dopo DataVer,* prima della chiusura degli apici e uno spazio
libero prima del trattino basso.
altrettanto fai per
&"FROM [SOCI] LEFT JOIN PAGAMENTI ON [SOCI].ID = PAGAMENTI.IdSoc " _
quindi no spazi fra " e FROM, spazio prima della chiusura degli apici
e uno spazio libero prima del trattino basso
per
&"WHERE (((Right(PAGAMENTI.DataVer,4) Between '"& Right([FORMS]!
[CONSOLIDATO]![Dalla Data],4) &"' And '" & RIGHT([FORMS]![CONSOLIDATO]!
[Alla Data],4) &"')) " _
l'istruzione estrapola l'anno di pagamento (ultimi 4 caratteri di
dataVer) e li confronta con l'anno della data del form. Qui devi stare
attento che gli apici e i doppi apici siano correttamente posizionati
e no spazio tra " e WHERE, dopo between ci vuole un apice singolo
seguito da un doppio apice. L' apice singolo serve ad indicare che
stai confrontando una stringa, il doppio apice chiude l'istruzione SQL
per far riferimento ad un campo di un form (Right([FORMS]!
[CONSOLIDATO]![Dalla Data],4)) con la & più il doppio apice riapri
l'istruzione SQL e subito dopo, con l'apice singolo chiudi la stringa
di confronto. Segui la stessa identica sequenza di apici e e doppi
apici dopo l'istruzione AND. Alla fine del rigo bada bene che ci sia
uno spazio dopo le due parentesi e prima del doppio apice ed uno
spazio dopo il doppio apice prima del trattino basso
l'ultimo rigo della istruzione SQL:
&"ORDER BY   [SOCI].Cognome, [SOCI].Nome,PAGAMENTI.DataVer"
no spazi tra " e ORDER
ordina per nome, cogome e data di pagamento: se hai più persone con lo
stesso nome e cognome puoi aggiungere [Soci].ID
in quest'ultimo rigo non c'è bisogno di lasciare lo spazio prima degli
apici finali.
Errore 2: Come ho detto sopra, ristabilisci la query [Soci Generale]
originale
Errore 3: questo è un mio errore di distrazione e probabilmente il
debug te lo da sulla prima riga dove ho aggiunto -2 per ottenere
l'anno 2009 (o meglio due anni prima di FORMS]![CONSOLIDATO]![Alla
Data)
invece di scrivere  if Right(rst!DataVer,4) =RIGHT([FORMS]!
[CONSOLIDATO]![Alla Data],4) - 2
devi scrivere
if Val(Right(rst!DataVer,4)) = Val(RIGHT([FORMS]![CONSOLIDATO]![Alla
Data],4)) - 2
in pratica usando Right estrapolo gli ultimi 4 caratteri delle date
che voglio confrontare come stringa e naturalmente non posso detrarre
2. Ho aggiunto quindi l'istruzione Val che trasforma la stringa
ottenuta in numero.
Tale correzione deve essere fatta per tutti e tre gli If.
Spero, questa volta, di essere stato un po' più chiaro
fammi sapere...


Ciao,
ho inserito tutto il codice corretto come riferisci su di un nuovo
pulsante, ma quando inserisco l'istruzione
if Val(Right(rst!DataVer,4)) = Val(RIGHT([FORMS]![CONSOLIDATO]![Alla
Data],4)) - 2
in debug mi da questo errore:
"errore di compilazione: previsto: Then oppure GoTo"
Grazie nella speranza che tutto funzioni.
ho provato a dare un'occhiata se c'erano errori nel copiare la
stringa, ma niente non sono riuscito a trovare l'errore.

 wrote:

---------------------------------------------------------------
Ti posto tutto il codice inserito sul pulsante:
---------------------------------------------------------------
Private Sub Comando637_Click()
Dim strsql As String
strsql = "SELECT [SOCI GENARALE].ID, [SOCI GENARALE].GruppoDi, [SOCI
GENERALE].Cognome, [SOCI GENERALE].Nome, [SOCI GENERALE].LuogoNascita,
[SOCI GENERALE].DataNascita, [SOCI GENERALE].CompCri,
PAGAMENTI.DataVer,*" _
& "FROM [SOCI GENERALE] LEFT JOIN PAGAMENTI ON [SOCI GENERALE].ID =
PAGAMENTI.IdSoc" _
& "WHERE (((Right(PAGAMENTI.DataVer,4) Between '" & Right([Forms]!
[CONSOLIDATO]![Dalla Data], 4) & "' And '" & Right([Forms]!
[CONSOLIDATO]![Alla Data], 4) & "')) " _
& "ORDER BY   [SOCI GENERALE].Cognome, [SOCI
GENERALE].Nome,PAGAMENTI.DataVer"
Set rst = CurrentDb.OpenRecordset(strsql)
    'contatore righe ESPORTA_EXCELQuery
    n = 1
   'Copia tutti i record di ESPORTA_EXCELQuery nel file excel
    rst.MoveFirst ' mi sposto su primo record
    Do Until rst.EOF
   If MyIDSocio = rst!ID Then GoTo ScriveData
    n = n + 1
    excDoc.Worksheets(1).Cells(n, 1) = rst!GruppoDi
'Cells(Riga,Colonna)
    excDoc.Worksheets(1).Cells(n, 2) = rst!COGNOME
    excDoc.Worksheets(1).Cells(n, 3) = rst!NOME
    excDoc.Worksheets(1).Cells(n, 4) = rst!LuogoNascita
    excDoc.Worksheets(1).Cells(n, 5) = rst!DataNascita
    excDoc.Worksheets(1).Cells(n, 6) = rst!CompCri
ScriveData:
    if Val(Right(rst!DataVer,4)) = Val(RIGHT([FORMS]![CONSOLIDATO]!
[Alla Data],4)) - 2  'qui filtra la data del 1° anno cioe' 2009
        excDoc.Worksheets(1).Cells(n, 7) = rst!DataVer
    End If
    if Val(Right(rst!DataVer,4)) = Val(RIGHT([FORMS]![CONSOLIDATO]!
[Alla Data],4)) - 2 'qui  filtra la data del 2° anno cioe' 2010
        excDoc.Worksheets(1).Cells(n, 8) = rst!DataVer
    End If
     if Val(Right(rst!DataVer,4)) = Val(RIGHT([FORMS]![CONSOLIDATO]!
[Alla Data],4)) - 2
        excDoc.Worksheets(1).Cells(n, 9) = rst!DataVer  'qui filtra la
data del 3° anno cioe' 2011
     End If
MyIDSocio = rst!ID
    rst.MoveNext 'passa al prossimo record
   Loop
   rst.Close
   Set rst = Nothing
End Sub
------------------------------------------------------------------------------------
Dagli un'occhiata


Scusa ,
l'errore che ti da è  dovuto ancora ad una mia disattenzione: mi sono
dimenticato il then alla fine di ogni if
If Val(Right(rst!DataVer,4)) = Val(RIGHT([FORMS]![CONSOLIDATO]![Alla
Data],4)) - 2  then    'qui filtra la data del 1° anno cioe' 2009
        excDoc.Worksheets(1).Cells(n, 7) = rst!DataVer
End If
If Val(Right(rst!DataVer,4)) = Val(RIGHT([FORMS]![CONSOLIDATO]![Alla
Data],4)) - 1 then 'qui  filtra la data del 2° anno cioe' 2010
        excDoc.Worksheets(1).Cells(n, 8) = rst!DataVer
End If
If Val(Right(rst!DataVer,4)) = Val(RIGHT([FORMS]![CONSOLIDATO]![Alla
Data],4)) then  'qui filtra la data del 3° anno cioe' 2011
        excDoc.Worksheets(1).Cells(n, 9) = rst!DataVer
     End If
MyIDSocio = rst!ID
    rst.MoveNext 'passa al prossimo record
   Loop
   rst.Close
   Set rst = Nothing
'Devi anche aggiungere l'ultima parte del tuo precedente codice e
cioè:
If Not blOpen Then
        excDoc.Close savechanges:=True
        excApp.Application.Quit
    End If
esci:
    Set excDoc = Nothing
    Set excApp = Nothing
    Exit Sub
gestErrori:
    MsgBox Err.Number & " - " & Err.Description
    GoTo esci
End Sub
Nel tuo messaggio iniziale chiedevi di filtrare una data di pagamento
per ogni anno collocandola in una diversa colonna del foglio di excel
e Il codice riportato qui sopra dovrebbe funzionare; nel caso però ci
fossero più pagamenti nello stesso anno, il foglio di excel  ti
riporterà solo l'ultima data di pagamento registrata.


Ho risposto ieri sera ma oggi non ho trovato il mio post quindi lo
riscrivo:
il debug ti da errore perchè manca il then alla fine di ogni if. devi
correggere il codice come segue:
if Val(Right(rst!DataVer,4)) = Val(RIGHT([FORMS]![CONSOLIDATO]![Alla
Data],4)) - 2  then   'qui filtra la data del 1° anno cioe' 2009
        excDoc.Worksheets(1).Cells(n, 7) = rst!DataVer
    End If
    if Val(Right(rst!DataVer,4)) = Val(RIGHT([FORMS]![CONSOLIDATO]!
[Alla Data],4)) - 1 then 'qui  filtra la data del 2° anno cioe' 2010
        excDoc.Worksheets(1).Cells(n, 8) = rst!DataVer
    End If
     if Val(Right(rst!DataVer,4)) = Val(RIGHT([FORMS]![CONSOLIDATO]!
[Alla Data],4))         ''qui filtra la data del 3° anno cioe' 2011
        excDoc.Worksheets(1).Cells(n, 9) = rst!DataVer
     End If
inoltre devi sempre aggiungere il resto del tuo codice originale dopo
set rst=nothing e quindi
  If Not blOpen Then
        excDoc.Close savechanges:=True
        excApp.Application.Quit
    End If
esci:
    Set excDoc = Nothing
    Set excApp = Nothing
    Exit Sub
gestErrori:
    MsgBox Err.Number & " - " & Err.Description
    GoTo esci
Vorrei inoltre precisare che tale codice esporta su excel solo la data
di un versamento all'anno come, del resto hai chiesto nel tuo primo
messaggio. se ci sono più versamenti nello stesso anno, il codice
riporta la data dell'ultimo versamento.
Fammi sapere...

 leggi tutto
Scusa è la seconda volta in due giorni che rispondo e il post non
appare!!! :-(
il debug ti da errore perchè alla fine di ogni riga di IF devi
aggiungere un then
il codice sarà quindi:
if Val(Right(rst!DataVer,4)) =Val(RIGHT([FORMS]![CONSOLIDATO]![Alla
Data],4)) - 2  then 'qui filtra la data del 1° anno cioe' 2009
excDoc.Worksheets(1).Cells(n, 7) = rst!DataVer
end if
if Val(Right(rst!DataVer,4)) =Val(RIGHT([FORMS]![CONSOLIDATO]![Alla
Data],4)) - 1  then 'qui filtra la data del 1° anno cioe' 2010
excDoc.Worksheets(1).Cells(n, 7) = rst!DataVer
end if
if Val(Right(rst!DataVer,4)) =Val(RIGHT([FORMS]![CONSOLIDATO]![Alla
Data],4))  then 'qui filtra la data del 1° anno cioe' 2011
excDoc.Worksheets(1).Cells(n, 7) = rst!DataVer
end if
dopo rst=nothing devi aggingere il resto del tuo vecchio codice e
cioè:
  If Not blOpen Then
        excDoc.Close savechanges:=True
        excApp.Application.Quit
    End If
esci:
    Set excDoc = Nothing
    Set excApp = Nothing
    Exit Sub
gestErrori:
    MsgBox Err.Number & " - " & Err.Description
    GoTo esci
il codice, come da te richiesto nel messaggio iniziale,  seleziona la
data di versamento per i due anni precedenti alla data impostata come
data finale + l'anno corrente ma se ci sono più versamenti nello
stesso anno riporta solo l'ultimo versamento registrato per l'anno
Fammi sapere sviluppi....

Scusa è la seconda volta in due giorni che rispondo e il post non appare!!! :-(
il debug ti da errore perchè alla fine di ogni riga di IF devi aggiungere un then
il codice sarà quindi:
if Val(Right(rst!DataVer,4)) =Val(RIGHT([FORMS]![CONSOLIDATO]![Alla Data],4)) - 2  then 'qui filtra la data del 1° anno cioe' 2009
excDoc.Worksheets(1).Cells(n, 7) = rst!DataVer
end if
if Val(Right(rst!DataVer,4)) =Val(RIGHT([FORMS]![CONSOLIDATO]![Alla Data],4)) - 1  then 'qui filtra la data del 1° anno cioe' 2010
excDoc.Worksheets(1).Cells(n, 7) = rst!DataVer
end if
if Val(Right(rst!DataVer,4)) =Val(RIGHT([FORMS]![CONSOLIDATO]![Alla Data],4))  then 'qui filtra la data del 1° anno cioe' 2011
excDoc.Worksheets(1).Cells(n, 7) = rst!DataVer
end if
dopo rst=nothing devi aggingere il resto del tuo vecchio codice e cioè:



Ciao,
ho inserito il then alla fine di ogni riga if come suggerisci, ma esce
ancora un'altro errore e sarebbe.
Errore di run-time '2450':
SCHEDE soci: impossibile trovare la maschera 'CONSOLIDATO' a cui si fa
riferimento in un'espressione macro o nel codice Visual Basic.
Ma la form CONSOLIDATO esiste e ci sono solo due caselle di testo con
nome elemento 'Dalla Data'  'Alla Data'.
Ho notato che dalla finestra di gestione progetti di visual basic, non
visualizza form che al suo interno ci sono solo caselle di testo
(compreso quella in oggetto 'CONSOLIDATO').
Cosa bisogna fare ancora per farlo funzionare?
Ciao e grazie ancora.


Grazie! Grazie! Grazie!
Con il tuo aiuto hai risolto un mio grandissimo problema e funziona
alla grande, ho adattato il codice al mio programma e lo sto testando
e funziona benissimo.
L'unica cosa che ti chiedo è se mi servirebbe ancora il tuo aiuto, per
migliorare il programma, posso contare su di te?
Di nuovo graziiiisssiiimooo!
Antonio Bifulco

Ciao,
ti rinnovo i ringraziamenti della buona riuscita del tuo consiglio, ti
volevo chiedere alcune modifiche.
Vorrei aggiungere allo stesso codice, questo:
1) - Quando clicco sul pulsante per esportare in excel, nel file excel
che mi va a riempire, vorrei che mi riportasse nella prima riga i nomi
dei campi:
es: | GruppoDi | Cognome | Nome | Luogo di Nascita | Data di Nascita |
CompCri | DataVer | DataVer | DataVer |
2) - Inserire una colonna prima del campo "Gruppo Di" con la
numerazione progressiva delle righe.
3) - Al momento dell'esportazione delle date di versamento, far in
modo che sul foglio excel invece di riportare la data cosi' come e'
stata registrata, al posto della data la deve convertire in una "X"
che sta a significare che quella persona in quella data ha pagato la
quota associativa.
Non so se mi sono fatto capire, spero di si.
Vorrei far fare queste modifiche in automatico ad access per evitare
di farle a mano, cosi' con un solo clic mi crea il consolidato senza
apportare ulteriori modifiche al foglio excel.
Grazie e scusami se do troppo fastidio, mi hai gia' risolto un
grossissimo problema, e se non puoi mi basta anche quello che gia' hai
fatto.
Grazie.


------------------------------
Ciao,
mi devi scusare se dopo un po di tempo mi rifaccio vivo con lo stesso problema ti spiego subito il problema.
Avevo chiesto di creare un pulsante che mi esportasse in excel alcuni campi filtrati da due tabelle e la cosa era andata (dopo tante domande che ti ho posto) a buon fine e l'ho utilizzata che andava un'amore.
Essendo che le direttive hanno cambiato alcune cosucce ho dovuto mettere mano di nuovo al codice per aggiornarlo ma probalbilmente ho fatto qualche errore ed ora quando mi esporta in excel mi esporta solo una riga e senza inserirmi le colonne con le date da asportare. Al codice ho fatto alcune modifiche esempio nel file excel deve iniziare ad inserire i dati dalla riga 12 e non piu' dalla riga 1, l'intestazione vorrei che mi iniziasse sulla riga precedente ai dati che sarebbe la 11, isomma facendo di testa mia ora il codice mi esporta le modifiche appena mensionate ma solo una riga e senza le tre colonne delle date. Dove ho sbagliato? Ti incollo il codice che ho modificato e se puoi dargli un'occhiata ed aggiungere le correzioni da fare.
Ti ringrazio dellla tua pazienza.
----------------------------------------------
Private Sub Comando4_Click()
On Error GoTo gestErrori
Dim excApp As Object
    Dim excDoc As Object
    Dim blOpen As Boolean
    Dim rst As Recordset
    Dim n As Integer
 
   On Error Resume Next
    blOpen = True
    Set excApp = GetObject(, "Excel.Application")
 
    If Err.Number = 429 Then
        Set excApp = CreateObject("Excel.Application")
        blOpen = False
        Err.Number = 0
            End If
    On Error GoTo gestErrori
 
    Set excDoc = excApp.Workbooks.Open("W:\CRI SOCI\CONSOLIDATO.xlsx") 'Percorso del file excel
    excApp.Visible = True
Set DB = CurrentDb()
Dim strsql, mystart, myfinish As String
mystart = Right(Forms![CONSOLIDATO]![Dalla data], 4)
myfinish = Right(Forms![CONSOLIDATO]![Alla data], 4)
 
strsql = "SELECT 
SOCI.ID
, SOCI.GruppoDi, SOCI.Cognome, SOCI.Nome, SOCI.LuogoNascita, SOCI.DataNascita,PAGAMENTI.Att, PAGAMENTI.DataVer, Year(Pagamenti.DataVer) AS AnnoData " _
        & "FROM SOCI LEFT JOIN PAGAMENTI ON 
SOCI.ID
 = PAGAMENTI.IdSoc " _
        & "WHERE Year(Pagamenti.DataVer) between '" & Year(Forms![CONSOLIDATO]![Dalla data]) & "' And '" & Year(Forms![CONSOLIDATO]![Alla data]) & "' " _
        & "ORDER BY SOCI.Cognome, SOCI.Nome, PAGAMENTI.DataVer"
 
 
    Debug.Print ("SQL: " + strsql)
    Set rst = DB.OpenRecordset(strsql)
 
    'contatore righe ESPORTA_EXCELQuery
 
 
   'Copia tutti i record di ESPORTA_EXCELQuery nel file excel
 
    'testata
    excDoc.Worksheets(1).Cells(11, 1) = "N." 'Contatore di riga
    excDoc.Worksheets(1).Cells(11, 2) = "Unità CRI" 'Cells(Riga,Colonna)
    excDoc.Worksheets(1).Cells(11, 3) = "Cognome"
    excDoc.Worksheets(1).Cells(11, 4) = "Nome"
    excDoc.Worksheets(1).Cells(11, 5) = "Luogo Nascita"
    excDoc.Worksheets(1).Cells(11, 6) = "Data Nascita"
    excDoc.Worksheets(1).Cells(11, 7) = "Soci attivi"
    excDoc.Worksheets(1).Cells(11, 8) = "Soci ordinari"
 
 
    rst.MoveFirst ' mi sposto su primo record
    n = 11
    Do Until rst.EOF
   If MyIDSocio = rst!ID Then GoTo ScriveData
 
    n = n + 1
 
    excDoc.Worksheets(1).Cells(n, 1) = Str(n - 11) 'Contatore di riga
    excDoc.Worksheets(1).Cells(n, 2) = rst!GruppoDi 'Cells(Riga,Colonna)
    excDoc.Worksheets(1).Cells(n, 3) = rst!COGNOME
    excDoc.Worksheets(1).Cells(n, 4) = rst!nome
    excDoc.Worksheets(1).Cells(n, 5) = rst!LuogoNascita
    excDoc.Worksheets(1).Cells(n, 6) = Format(rst!DataNascita, "dd/mm/yyyy")
    excDoc.Worksheets(1).Cells(n, 7) = rst!CompCri
ScriveData:
    If Val(Right(rst!DataVer, 4)) = Val(Right([Forms]![CONSOLIDATO]![Alla data], 4)) - 2 Then 'qui filtra la data del 1° anno cioe' 2009
        excDoc.Worksheets(1).Cells(n, 8) = Format(rst!DataVer, "dd/mm/yyyy")
    End If
    If Val(Right(rst!DataVer, 4)) = Val(Right([Forms]![CONSOLIDATO]![Alla data], 4)) - 1 Then 'qui  filtra la data del 2° anno cioe' 2010
        excDoc.Worksheets(1).Cells(n, 9) = Format(rst!DataVer, "dd/mm/yyyy")
    End If
     If Val(Right(rst!DataVer, 4)) = Val(Right([Forms]![CONSOLIDATO]![Alla data], 4)) Then
        excDoc.Worksheets(1).Cells(n, 10) = Format(rst!DataVer, "dd/mm/yyyy")  'qui filtra la data del 3° anno cioe' 2011
     End If
MyIDSocio = rst!ID
    rst.MoveNext 'passa al prossimo record
 
   Loop
 
   rst.Close
   Set rst = Nothing
  If Not blOpen Then
        excDoc.Close savechanges:=True
        excApp.Application.Quit
    End If
esci:
    Set excDoc = Nothing
    Set excApp = Nothing
    Exit Sub
gestErrori:
    MsgBox Err.Number & " - " & Err.Description
    GoTo esci
End Sub