Filtrare due tabelle ed esportare in excel

di il
4 risposte

Filtrare due tabelle ed esportare in excel

Salve a tutti, mi presento
non sono un programmatore e non ho ne attestati, ne diplomi e ne lauree sono solo un autodidatta di informatica da circa 20 anni, lavoro per un'amministrazione pubblica - Croce Rossa Italiana Comitato Provinciale di Napoli, sono responsabile informatico e gestisco circa 50 pc in rete ed avendo il pacchetto Microsoft Access 2007 in dotazione mi sono cimentato (con l'aiuto dei newsgroup della Microsoft) a fare piccoli programmi per la gestione delle attività. Mi sono iscritto al vostro forum perchè vedo che vi interessate di diversi linguaggi di programmazione ed avrei un problema da chiedervi.
Facendomi aiutare dai newsgroup della Microsoft avevo chiesto diveso tempo fa se era possibile creare un pulsante in Access 2007 che mi filtrasse due tabelle ed esportarmi i risultati in foglio excel formattato sempre dal codice e mi consigliarono di inserire questo codice:
-----------------------------------------
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 
-------------------------------------------
Ora essendo che alcune delle nostre direttive sono cambiate ho cercato di modificare anche il codice sopra descritto ed ho visto che non mi funziona più ora non ricordo più cosa cavolo ho cambiato e vi chiedo aiuto nel farmi notare dove ho sbagliato.
Se avete da chiedermi altre notizie fate pure io sono disponibilissimo pur di risolvere urgentemente questo problema.
Grazie

4 Risposte

  • Re: Filtrare due tabelle ed esportare in excel

    Ciao

    dire non mi fuziona + e' molto limitativo

    prova a crearti una query

    passi alla modalità sql e incollaci

    SELECT SOCI.ID, SOCI.GruppoDi, SOCI.Cognome, SOCI.Nome, SOCI.LuogoNascita, SOCI.DataNascita,PAGAMENTI.Att, PAGAMENTI.DataVer, 2012 AS AnnoData
    FROM SOCI LEFT JOIN PAGAMENTI ON SOCI.ID = PAGAMENTI.IdSoc
    WHERE Year(Pagamenti.DataVer) between 2011 And 2013
    ORDER BY SOCI.Cognome, SOCI.Nome, PAGAMENTI.DataVer

    FUNZIONA?

    Di lì capisci che almento la query e' corretta
  • Re: Filtrare due tabelle ed esportare in excel

    Ciao,
    grazie della celere risposta, ho provato con la query che mi hai proposto ma non è quella la mia soluzione ora ti spiego cosa dovrebbe fare.
    La query è giusta ma essento che l'ho collegata ad un pulsante, all'interno di una maschera chiamata CONSOLIDATO chee al suo interno ci sono due caselle di testo con etichetta DALLA DATA - ALLA DATA.
    Una volta inserito il range di date, clicco sul pulsante sotto alle due caselle di testo con il codice che ti ho appena inviato oppure con la query che mi hai inviato, dovrebbe filtrare la tabella SOCI ed aprirmi un file excel precedentemente creato, oppure farlo creare exnovo dallo stesso excel tramite lo stesso codice.
    Ovviamente il file excel mi dovrebbe uscire già formattato in base alle mie esigenze, con le ultime tre colonne dove mi riporta i tre anni filtrati dal codice nel pulsante.
    Ecco questo dovrebbe fare il codice oppure una query.
    Grazie
  • Re: Filtrare due tabelle ed esportare in excel

    Ciao

    la query che ti ho fatto testare era proprio quella che dici. ovviamente ti ho tolto i riferimenti alle caselle di testo.
    allora funziona la mia query?

    riesci ad andare passo passo (debug del programma) e vedere se la query che costruisci funziona?
  • Re: Filtrare due tabelle ed esportare in excel

    Nel codice vedo che hai scritto

    Debug.Print ("SQL: " + strsql)

    quindi dopo aver premuto il pulsante

    prova ad andare in finestra immediata e copiare il codice dopo SQL: e mettilo in una query (come ti ho scritto nel mess precedente)
Devi accedere o registrarti per scrivere nel forum
4 risposte