Caricare dati da Excel a Tabella Access eliminando i duplica

di il
10 risposte

Caricare dati da Excel a Tabella Access eliminando i duplica

Buongiorno a Tutti,
sto facendo un piccolo database in Access per tenere sotto controllo i movimenti del mio Conto Corrente.
In Access ho creato una tabella con gli stessi campi del foglio Excel (generato dalla mia banca), ho però inserito nella prima colonna il campo contatore.
Ora vorrei mettere un pulsante sulla mia maschera, il quale accede ad un directory specifica e carica i dati dal foglio Excel.
Quando aggiunge i record deve però verificare se il record sia già presente nella tabella Access se SI non deve aggiungerlo se NO aggiunge il record.

Grazie a Tutti per qualsiasi info.
Marco

10 Risposte

  • Re: Caricare dati da Excel a Tabella Access eliminando i duplica

    Buona sera a Tutti,
    dopo vari tentativi mi sono quasi avvicinato alla soluzione, nel senso riesco a caricare i dato dal foglio excel tranne i campi [FinEntrate] e [FinUscite].
    Quando clicco il pulsante mi dce Errore di tipo run time 3421.
    Premesso che se apro il file.xls e dove non ci sono valori (campo null) digitando uno 0 o semplicemente facendo invio mi carica il campo mettendo 0.00€.
    Io però vorrei che carichi null.
    Potete aiutarmi sono disperato.

    Qui di seguito il mio codice:

    Private Sub Comando33_Click()

    Dim DBCOrrente As DAO.Database
    Dim Tabella As DAO.Recordset
    Dim AppExcel As New excel.Application
    Dim I As Long
    Dim NumRighe As Integer

    'Apro il File Excels
    Workbooks.Open FileName:=Application.CurrentProject.Path & "\file.xls"

    'Apro la tebella Acess TblFineco
    Set DBCOrrente = CurrentDb
    Set Tabella = DBCOrrente.OpenRecordset("TblFineco")

    'Conto quante righe sono presenti nel file xls daq importare
    Worksheets("Risultato ricerca movimenti").Range("A2").Select
    Worksheets("Risultato ricerca movimenti").Range(Selection, Selection.End(xlDown)).Select
    NumRighe = Selection.Rows.Count + 1

    'Copio le righe del foglio excel "Risultato ricerca movimenti" nella tabella access, considerando solo le righe occupate

    For I = 2 To NumRighe

    Tabella.AddNew
    Tabella.Fields("FinDataOper") = CDate(Worksheets("Risultato ricerca movimenti").Range("A" & I))
    Tabella.Fields("FinDataValuta") = CDate(Worksheets("Risultato ricerca movimenti").Range("B" & I))
    ' qui si pianta
    Tabella.Fields("FinEntrate") = Worksheets("Risultato ricerca movimenti").Range("C" & I)
    'qui si pianta
    Tabella.Fields("FinUscite") = Worksheets("Risultato ricerca movimenti").Range("D" & I)
    Tabella.Fields("FinDescrizione") = CStr(Worksheets("Risultato ricerca movimenti").Range("E" & I))
    Tabella.Fields("FinCausale") = CStr(Worksheets("Risultato ricerca movimenti").Range("F" & I))

    Tabella.Update
    Next I

    'Chiudo Tabella
    Tabella.Close
    DBCOrrente.Close

    'Chude File Excels
    Workbooks("file.xls").Close
    AppExcel.Quit
    Set ExcelSheet = Nothing
    Set AppExcel = Nothing

    End Sub
  • Re: Caricare dati da Excel a Tabella Access eliminando i duplica

    Ciao,vedi se nelle proprietà della tab.al campo interessato consenti stringhe a lunghezza zero sia su si.
  • Re: Caricare dati da Excel a Tabella Access eliminando i duplica

    Ciao Sal,
    la tua soluzione va benissimo con un campo testo, l'ho verificato.
    Io però ho un campo currency e l'ho risolto con un If.
    Ora però c'è l'ultimo ostacolo da risolvere.... il codice qui sotto accoda alla tabella "TblFineco" tutti i record presenti nella tabella "\file.xls" mentre io vorrei verificare se il record è presente allora aggiungi altrimenti ignora.
    Ossia aggiungere solo i record non presenti nella tabella "TblFineco".
    Sto impazzendo!!!

    Grazie per qualsiasi informazione.
    Marco

    Private Sub Comando33_Click()

    Dim DBCOrrente As DAO.Database
    Dim Tabella As DAO.Recordset
    Dim AppExcel As New excel.Application
    Dim I As Long
    Dim NumRighe As Integer

    'Apro il File Excels
    Workbooks.Open FileName:=Application.CurrentProject.Path & "\file.xls"

    'Apro la tebella Acess TblFineco
    Set DBCOrrente = CurrentDb
    Set Tabella = DBCOrrente.OpenRecordset("TblFineco")

    'Conto quante righe sono presenti nel file xls daq importare
    Worksheets("Risultato ricerca movimenti").Range("A2").Select
    Worksheets("Risultato ricerca movimenti").Range(Selection, Selection.End(xlDown)).Select
    NumRighe = Selection.Rows.Count + 1

    'Copio le righe del foglio excel "Risultato ricerca movimenti" nella tabella access, considerando solo le righe occupate

    For I = 2 To NumRighe

    Tabella.AddNew
    Tabella.Fields("FinDataOper") = CDate(Worksheets("Risultato ricerca movimenti").Range("A" & I))
    Tabella.Fields("FinDataValuta") = CDate(Worksheets("Risultato ricerca movimenti").Range("B" & I))

    If Worksheets("Risultato ricerca movimenti").Range("C" & I) = "" Then

    Tabella.Fields("FinUscite") = CCur(Worksheets("Risultato ricerca movimenti").Range("D" & I))
    Else
    Tabella.Fields("FinEntrate") = CCur(Worksheets("Risultato ricerca movimenti").Range("C" & I))

    End If

    Tabella.Fields("FinDescrizione") = CStr(Worksheets("Risultato ricerca movimenti").Range("E" & I))
    Tabella.Fields("FinCausale") = CStr(Worksheets("Risultato ricerca movimenti").Range("F" & I))

    Tabella.Update
    Next I

    'Chiudo Tabella
    Tabella.Close
    DBCOrrente.Close

    'Chude File Excels
    Workbooks("file.xls").Close
    AppExcel.Quit
    Set ExcelSheet = Nothing
    Set AppExcel = Nothing

    End Sub
  • Re: Caricare dati da Excel a Tabella Access eliminando i duplica

    Aiuto sono completamente fermo!!! Non c'è nessuno che possa darmi almeno un dritta??? Sul Web ho vsto che qualcuno usa un DlookUp o Dcount..... uno suggeriva di concatenare i campi( ma come si fa'???) e verificare se uguale a quello della tabella.
    Scusate ma ho proprio bisogno del vostro aiuto!!!
    Grazie a tutti
    Marco
  • Re: Caricare dati da Excel a Tabella Access eliminando i duplica

    Ciao,potrsti provare a creare una query di eliminazione che elimini tutti i dati presenti in tab. e poi importare tutto ogni volta.siccome tu hai i dati in exel non c'è il pericolo di perdita dei dati se qualcosa dovesse andar male.io comunque ho usato spesso questo sistema.tramite un pulsante ho inserito:
    1) attivare una query di eliminazione.
    2) importare i dati in tab..
    3) inserimento di un msgbox che mi confermi l'esecuzione corretta della routine.
  • Re: Caricare dati da Excel a Tabella Access eliminando i duplica

    Grazie Sal,
    putroppo i dati in excel non vengono salvati, ma scaricati solo all'occorenza.
    Avrei pensato di creare una stringa che contiene il record che debbo andare ad aggiungere alla tabella access solo se non esistente. Ho usato la funzione Dlookup ma non funziona.
    Sapete dirmi dov'è che sbaglio?
    Come posso confrontare la stringa NewRec con la mia tabella access"tblfineco"???

    Qui di seguito il codice carica sempre i dati doppi.
    For I = 2 To NumRighe
    'inserire qui il controllo se il record esiste
    NewRec = (Worksheets("Risultato ricerca movimenti").Range("A" & I)) & _
    (Worksheets("Risultato ricerca movimenti").Range("B" & I)) & _
    (Worksheets("Risultato ricerca movimenti").Range("C" & I)) & _
    (Worksheets("Risultato ricerca movimenti").Range("D" & I)) & _
    (Worksheets("Risultato ricerca movimenti").Range("E" & I)) & _
    (Worksheets("Risultato ricerca movimenti").Range("F" & I))

    If DLookup("[FinDataOper]&[FinDataValuta]&[FinEntrate]&[FinUscite]&[FinDescrizione]&[FinCausale]", "TblFineco") <> NewRec Then
    Tabella.AddNew
    Tabella.Fields("FinDataOper") = CDate(Worksheets("Risultato ricerca movimenti").Range("A" & I))
    Tabella.Fields("FinDataValuta") = CDate(Worksheets("Risultato ricerca movimenti").Range("B" & I))

    If Worksheets("Risultato ricerca movimenti").Range("C" & I) = "" Then

    Tabella.Fields("FinUscite") = CCur(Worksheets("Risultato ricerca movimenti").Range("D" & I))
    Else
    Tabella.Fields("FinEntrate") = CCur(Worksheets("Risultato ricerca movimenti").Range("C" & I))

    End If

    Tabella.Fields("FinDescrizione") = CStr(Worksheets("Risultato ricerca movimenti").Range("E" & I))
    Tabella.Fields("FinCausale") = CStr(Worksheets("Risultato ricerca movimenti").Range("F" & I))

    Tabella.Update

    End If


    Next I
  • Re: Caricare dati da Excel a Tabella Access eliminando i duplica

    Ciao.
    Avete già discusso di tanto, ma a me, anche per piccoli gestionali, piace iniziare con una analisi di quello che abbiamo in ballo esattamente e di cosa vogliamo, se c'è bisogno trovare un piccolo algoritmo risolutivo e funzionante e poi iniziare a sviluppare.
    Dopo quanto ho letto, magari mi scuso se dico cose banali, ma vorrei alcuni chiarimenti:
    - quindi la tua banca ti fornisce, i tuoi movimenti in un file di Excel, come...? a richiesta dicendoli esempio, tra 2 date...? o come ? a cadenza periodica...?
    - comunque te li fornisca, a quanto dici, qualsiasi fornitura può contenere movimenti presenti in forniture precedenti, vero...?
    - se tu potessi avere forniture fino ad una certa data e la sicurezza che nelle forniture seguenti, non ci sia niente che rientrano in date molto precedenti (movimenti contabilizzati molto in ritardo rispetto al normale, es.), potresti memorizzare in una tabella un campo [UltDataFornit] e nelle importazioni seguenti, potresti andarlo a leggere, prelevare solo i movimenti > di quella data e alla fine del processo, aggiornare il campo [UltDataFornit].
    Non so se è una cattiva idea...
    --------------------------------------------------------------------------------------------------------
    Altrimenti devi mettere a punto quello che è stato detto finora:
    -Visto che non c'è un campo univoco comune nei 2 archivi, che possa fare da chiave di relazione, dovresti usare una concatenazione di + campi comuni, es. [DataMovim]+[descrizMovim]+[...] e altro, per ricercare la corrispondenza, ma credo che sia proprio questo che cerchi di fare, vero...?
    Mentre scrivo, mi viene in mente che potresti Importare il file di Excel in una Tabella di Appoggio, lanciare una Query di ricerca Differenze ---> tale Query la usi per 'popolarne' una di Accodamento sulla tua Tabella Principale...
    Prova, altrimenti faccio degli esperimenti e ti dico...
    Saluti.
    Luciano.
  • Re: Caricare dati da Excel a Tabella Access eliminando i duplica

    Ciao,dopo aver trovato una soluzione,ho visto che l'idea che mi è venuta ti è stata suggerita anche da luky1964.
    in pratica creo una tab.principale dove immagazzinare i dati che mi servono.poi creo una tab.transizione nella quale importo i dati da exel.in seguito creo una query ricerca dati non corrispondenti che verifica se tra la tab.principale e quella di transizione ci sono dei record diversi.successivamente creo una query semplice sui dati della query "campi non corrispondenti".dopo la creazione apro quest'ultima in vis.struttura e la converto in query di accodamento(ti chiederà se accodare ad una tabella esistente.selezioni la tab.principale).quando lancerai la query di accodamento i dati verranno accodati alla tab.principale.il tutto lo puoi attivare tramite pulsante.spero di essere stato chiaro,altrimenti fammi sapere.
  • Re: Caricare dati da Excel a Tabella Access eliminando i duplica

    Ciao Luky1964, Sal,
    scusate ma mi sono beccato l'influenza questo freddo è interminabile!!!
    Vorrei iniziare rispondendo alle domande di Luky1964....
    Si, dal sito posso scaricare per un certo intervallo di tempo le operazioni del conto, il problema è propio questo... nel momento in cui scarico io non ho la certezza che all'interno del file ci siano tutte le operazioni, alcune potrebbero infatti non essere ancora contabilizzate.
    Per questo motivo visto che nei due archivi non c'è un campo univoco, pensavo di usare la concatenazione.
    La mia idea (peccato che non riesco ad attuarla) è scarico i dati tendenzialmente prendendo un intervallo sempre molto ampio onde evitare di perdere movimenti, a questo punto verifico se la stringa è già presente nella tabella access se no la accodo se si salto e vado ad analizzare il record excel sucessivo.
    Con questo codice riesco a creare la stringa che dovrei importare da excel:

    For I = 2 To NumRighe
    'Creo la sringa contenete tutti i campi del file .xls
    NewRec = (Worksheets("Risultato ricerca movimenti").Range("A" & I)) & _
    (Worksheets("Risultato ricerca movimenti").Range("B" & I)) & _
    (Worksheets("Risultato ricerca movimenti").Range("C" & I)) & _
    (Worksheets("Risultato ricerca movimenti").Range("D" & I)) & _
    (Worksheets("Risultato ricerca movimenti").Range("E" & I)) & _
    (Worksheets("Risultato ricerca movimenti").Range("F" & I))

    Ora nella variabile "NewRec" ho la stringa che dovrei andare a confrontare con i campi presenti nella tabella
    Quindi con un IF.... se il record è <> da quello contenuto nella tabella access allora aggiungi (da Tabella.AddNew in poi il codice funzione) altrimenti passa alla stringa sucessiva verifica se già presente e cosi via...

    'il problema è qui nella logica di confronto con la tabella access
    If DLookup("[FinDataOper]&[FinDataValuta]&[FinEntrate]&[FinUscite]&[FinDescrizione]&[FinCausale]", "TblFineco") <> NewRec Then
    Tabella.AddNew

    Cosa ne pensate? Non si tratta solo di capire come fare il confronto?
    Grazie
    Marcoa
  • Re: Caricare dati da Excel a Tabella Access eliminando i duplica

    Ciao,non essendo un programmatore tendo a risolvere i problemi con query nei limiti del possibile.
    non descrivi se hai provato la soluzione che ti ho proposto.sul codice,avendo il db potrei provare il funzionamento ,così per me è difficile.
Devi accedere o registrarti per scrivere nel forum
10 risposte