Sviluppare funzionalita su Microsoft Office con VBA Da file excel a tabella access

LoginRegistrati
Stai vedendo 25 articoli - dal 1 a 25 (di 32 totali)
  • Autore
    Articoli
  • #14420 Risposta

    PLB83
    Partecipante

      Buongiorno, 
      avrei necessità, se possibile, del vostro supporto. Per esigenze lavorative, mi è stata commissionata una macro excel con VBA. Premetto che ho esperienze di programmazione, ma non ho mai utilizzato VBA. Ciò che dovrei realizzare è questo:

      Ho a disposizione un "file excel A", in cui all'interno del "foglio B", ho la "colonna C" formata per es. da 1000 righe. 
      Inoltre, ho una cartella al cui interno sono contenuti 100 file .mdb

      Il mio obiettivo è quello di copiare 100 righe alla volta della "colonna C" excel ed incollarle all'interno dei singoli file .mdb presenti nella cartella -> "tabella D" -> "colonna E".

      Grazie mille in anticipo per il supporto. 

      #14429 Risposta

      vecchio frac
      Senior Moderator
        171 pts

        Ti conviene interfacciarti ad Access mediante ADO. Puoi partire dal mio articoletto su questo forum: 

        Excel e ADO: scrittura/lettura dati da tabelle Excel

        #14432 Risposta

        PLB83
        Partecipante

          Prima di tutto ti ringrazio. Effettuo una lettura approfondita e poi caso mai passo alle domande 🙂

           

          Grazie ancora

          #14442 Risposta

          PLB83
          Partecipante

            Ho letto l'articolo e lo trovo davvero molto interessante. Nella realtà però ho difficoltà nel mettere mano al codice. Per farvi capire meglio ciò che devo realizzare allego due file. Il primo è parte della colonna che devo copiare dal file excel ed il secondo è lo screen della colonna nel file mdb dove dovrei incollare i valori. 

             

            Allegati:
            You must be logged in to view attached files.
            #14449 Risposta
            albatros54
            albatros54
            Moderatore
              54 pts

               

              PLB83 ha scritto:

              Per farvi capire meglio ciò che devo realizzare allego due file.

              non hai allegato i file ma bensi delle jpg.

               

              Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
              Sempre il mare, uomo libero, amerai!
              ( Charles Baudelaire )
              #14463 Risposta

              DeletedUser
                11 pts

                @plb83

                Come minimo devi postare:

                1) uno dei file MDB (ammesso che siano tutti uguali)

                2) il file Excel che contienei dati da esportare

                Dopo, e solo dopo, possiamo discuterne in modo proficuo.

                #14485 Risposta

                Anonimo
                  1 pt

                  Se fai una ricerca su Google trovi molti esempi.

                  Magari qualcuno di questi può aiutarti.  

                  http://lmgtfy.com/?q=From+excel+file+to+access+table

                  #14486 Risposta

                  PLB83
                  Partecipante

                    Eccomi, ho modificato i file semplificandoli in modo da potervi far capire cosa devo realizzare con la macro.

                    I file a disposizione sono i seguenti:

                    Una cartella in cui sono presenti i file EVC_01.mdbEVC_02.mdb.

                    Un file excel EVC.xlsx. (In questo file excel sono presenti due colonne di mio interesse: la A e la B)

                    Devo copiare all'interno del file EVC_01.mdb -> Tabella TSW_Step -> Colonna ST_COMMENT il contenuto delle righe della colonna B dove in A ho sempre _01

                    Devo copiare all'interno del file EVC_02.mdb -> Tabella TSW_Step -> Colonna ST_COMMENT le righe della colonna B dove in A ho sempre _02

                     

                    Spero di essere stato chiaro, in modo tale da potervi mettere nelle condizioni di fornirmi il supporto necessario.

                    Grazie mille davvero. 

                    Allegati:
                    You must be logged in to view attached files.
                    #14499 Risposta

                    Anonimo
                      1 pt

                      Il file Excel è ok, ma gli altri due non sono database Access MDB, MSAccess non li ricnosce.

                      Entrambi contengono il testo seguente che, come vedi, è una pagina HTML:

                      <HTML>
                      <HEAD>
                      <TITLE>403 Forbidden</TITLE>
                      <BASE href="/error_docs/"><!--[if lte IE 6]></BASE><![endif]-->
                      </HEAD>
                      <BODY>
                      <H1>Forbidden</H1>
                      You do not have permission to access this document.
                      

                      <HR> <ADDRESS> Web Server at 185-114-109-1.com </ADDRESS> </BODY> </HTML> <!-- - Unfortunately, Microsoft has added a clever new - "feature" to Internet Explorer. If the text of - an error's message is "too small", specifically - less than 512 bytes, Internet Explorer returns - its own error message. You can turn that off, - but it's pretty tricky to find switch called - "smart error messages". That means, of course, - that short error messages are censored by default. - IIS always returns error messages that are long - enough to make Internet Explorer happy. The - workaround is pretty simple: pad the error - message with a big comment like this to push it - over the five hundred and twelve bytes minimum. - Of course, that's exactly what you're reading - right now. -->

                      #14500 Risposta

                      PLB83
                      Partecipante

                        Stranissima questa cosa 😐 a me li apre tranquillamente

                        #14501 Risposta

                        Anonimo
                          1 pt

                          Prova a mettere entrambi gli MDB in uno zip e posta quello. Vediamo se funziona.

                          #14502 Risposta

                          PLB83
                          Partecipante

                            Ecco. Speriamo ma in ogni caso posso utilizzare anche un mdb generico. L'importante è capire come accedere alla colonna di una determinata tabella.

                             

                            Grazie.

                            Allegati:
                            You must be logged in to view attached files.
                            #14505 Risposta

                            Anonimo
                              1 pt

                              Ecco adesso i due MDB sono ok.

                              #14506 Risposta

                              Anonimo
                                1 pt

                                PLB83 ha scritto:

                                Devo copiare all'interno del file EVC_01.mdb -> Tabella TSW_Step -> Colonna ST_COMMENT il contenuto delle righe della colonna B dove in A ho sempre _01

                                Devo copiare all'interno del file EVC_02.mdb -> Tabella TSW_Step -> Colonna ST_COMMENT le righe della colonna B dove in A ho sempre _02

                                Guardando i file vedo che :

                                1. Nel file Excel vi sono 3277 righe (con valori 3040200_01 e 3040200_02)

                                2. in entrambi i file MDB le tabelle TSW_Step hanno 5 righe

                                Ora mi sto chiedendo:

                                Come inserire 3277 righe da Excel in 5 righe di Access? Sicuramente mi manca qualche info...
                                Cosa dici? Qual'è il criterio da usare?

                                 

                                #14507 Risposta

                                PLB83
                                Partecipante

                                  Ciao Leonardo, la tua osservazione è giustissima. 

                                  Poiché i file che ho allegato sono utilizzati in ambito lavorativo, ho dovuto eliminare tutte le info sensibili dal loro interno ed è questo il motivo per cui c'è discrepanza fra il numero delle righe.

                                  Nella realtà il numero delle righe con valori 3040200_01, 3040200_02, 3040200_03, etc,.... corrisponde al numero delle righe che risultano vuote nei file EVC_01, EVC_02, EVC_03, etc...

                                  Ti ringrazio davvero per il supporto. Sto cercando di sbatterci da solo la testa seguendo qualche guida, ma non avendo mai programmato con VBA non è per nulla immediato.

                                   

                                  #14508 Risposta

                                  Anonimo
                                    1 pt

                                    Capisco la situazione. Purtroppo come vedi se non si hanno le informazioni reali non è semplice districarsi.
                                    Facciamo così, adesso te lo scrivo in pseudo-codice, poi tu cerchi di mettere in pratica scrivendo il codice VBA.

                                    Come linea di principio, essendo che dovrai aggiornare MOLTI database da UN solo file Excel, conviene che tu faccia tutto da Excel.

                                    Le fasi sono 3:

                                    1. Apro la connessione al singolo database
                                    2. eseguo l'UPDATE della colonna ST_COMMENT nella tabella TSW_Step
                                    3. chiudo la connessione

                                    Le fasi 1 e 3 le trovi nell'ottimo articolo di vecchio frac (di cui è disponibile anche il file di esempio):
                                    https://www.excelvba.it/forumexcel/excel-e-ado-scrittura-lettura-dati-da-tabelle-excel/

                                    Siccome usi database in formato MDB (Jet) userai il driver JET OleDb

                                    cn.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" & percorso_database

                                    con percorso_database si intende il path completo + nomefile
                                    Esempio a caso: "D:\test\import\EVC_01.MDB"

                                    Se tu avessi modo di salvare il file Excel nel vecchio formato XLS sarebbe ottimo, perché a quel punto aggiornare la tabella sarebbe un gioco da ragazzi perché potresti aprire una connessione sempre con il JET direttamente sul tuo file Excel.
                                    Se mantieni il formato XLSX purtroppo non puoi farlo perché tale formato non funziona con il JET ma solo con il Microsoft.ACE.OLEDB.12.0, ma solo se hai i driver installati.
                                    Essendo un file normale, è molto più semplice salvarlo in formato EXCEL 97-2007 (xls).

                                    Intanto inizia con buttar giù queste parti di codice, tieni come riferimento l'articolo di vecchio frac, c'è già il codice pronto.

                                    Per partire, devi creati un nuovo file Excel in formato XLSM (cioè che permette di creare macro).
                                    Poi premi ALT+F11 ed entrerai nell'ambiente di progettazione VBA e scrivi la tua prima routine:

                                    Sub EsportaDati(Byval pPercorsoMDB As String)
                                    
                                    End Sub
                                    
                                    

                                    All'interno di questa routine inizierai a scrivere il codice della fase 1 quella che si connette al database.

                                    Una volta che hai fatto, pubblica il file Excel con la macro EsportaDati.

                                    #14509 Risposta

                                    Anonimo
                                      1 pt

                                      Scusa, ho dimenticato di dirti che quanto entri nell'ambiente di progettazione VBA, devi inserire un nuovo MODULO dal menu Inserisci, in cui potrai scrivere la routine. Sorry.

                                      #14510 Risposta

                                      PLB83
                                      Partecipante

                                        Ciao Leonardo,

                                        ti posto il codice che ho scritto fino ad ora, ma facendo debug sulla riga "oRS.Update" mi da errore di run-time 3314 poiché probabilmente ho sbagliato a scrivere i cicli. Ci sto lavorando...

                                         

                                        Private Sub CommandButton1_Click()

                                        Dim oSelect As Range
                                        Dim i As Long
                                        Dim j As Integer
                                        'Dim sPath As String
                                        Foglio1.Activate

                                        Set oSelect = Application.InputBox("Range", , Range("A1").CurrentRegion.Address, , , , , 8)

                                        Dim oDAO As DAO.DBEngine
                                        Dim oDB As DAO.Database
                                        Dim oRS As DAO.Recordset

                                        'sPath = Application.GetOpenFilename()

                                        Set oDAO = New DAO.DBEngine
                                        Set oDB = oDAO.OpenDatabase("C:\Users\xxx\Desktop\EVC_01.mdb")
                                        Set oRS = oDB.OpenRecordset("TSW_TCStep")

                                        For i = 2 To oSelect.Rows.Count   'salta la riga delle intestazioni
                                        oRS.AddNew
                                        For j = 1 To oSelect.Columns.Count
                                        oRS.Fields(j) = oSelect.Cells(i)
                                        Next j
                                        oRS.Update

                                        Next i
                                        oDB.Close

                                        End Sub

                                         

                                        #14511 Risposta

                                        Anonimo
                                          1 pt

                                          Scusa, ma tutto quel codice è sbagliato. Non c'entra nulla con quello che ti ho spiegato io.

                                          DAO è morto e sepolto.

                                          Devi usare quello dell'articolo di vecchio frac

                                          P.S. Poi il codice va inserito con l'apposito pulsante {;}

                                          #14516 Risposta

                                          vecchio frac
                                          Senior Moderator
                                            171 pts

                                            Leonardo ha scritto:

                                            DAO è morto e sepolto.

                                            Purtroppo molte Guide lo riportano ancora come esempio. Da qualche parte ho letto anche qualcosa che si riferiva a performances migliori in favore di DAO 🙂

                                            #14539 Risposta

                                            DeletedUser
                                              11 pts

                                              PLB83 ha scritto:

                                              Nella realtà il numero delle righe con valori 3040200_01, 3040200_02, 3040200_03, etc,.... corrisponde al numero delle righe che risultano vuote nei file EVC_01, EVC_02, EVC_03, etc...

                                              Ho guardato i file.

                                              L'affermazione di cui sopra è utile, ma non è sufficiente.
                                              Nel file Excel manca un campo (o più campi) che permetta di identificare univocamente la corrispondente riga nella tabella del database.
                                              Nella tabella TSW_Step vi è una chiave primaria impostata su 2 campi: TestSequenceID e TCSOrder che permette di identificare univocamente la riga, questa informazione manca totalmente nel file Excel.

                                              Se il file Excel è proprio quello REALE, non si può fare nulla.

                                              Aggiungo che per poter fare un'analisi di fattibilità è necessario lavorare sui VERI file REALI, non su simil-copie con dati non corrispondenti al vero.

                                               

                                              #14540 Risposta

                                              vecchio frac
                                              Senior Moderator
                                                171 pts

                                                gibra ha scritto:

                                                Aggiungo che per poter fare un'analisi di fattibilità è necessario lavorare sui VERI file REALI, non su simil-copie con dati non corrispondenti al vero.

                                                Ci tengo a precisarTi che spesso chiediamo ai nostri utenti dei file di esempio senza dati reali e senza dati riservati, ma che riflettano ovviamente lo scenario di lavoro, da utilizzare come canovacci per illustrare le tecniche da utilizzare. Lo scopo è lasciare gli utenti liberi di sperimentare e imparare senza fare attività di consulenza (e senza fornire il pesce già pescato). A suo tempo Tu e gli altri di VBT&T avete fatto così con me, io ho imparato così  e ve ne sarò sempre grato.

                                                #14542 Risposta

                                                DeletedUser
                                                  11 pts

                                                  vecchio frac ha scritto:

                                                  Ci tengo a precisarTi che spesso chiediamo ai nostri utenti dei file di esempio senza dati reali e senza dati riservati

                                                  Sono concorde, ovviamente (è da sempre che è così),  senza dati sensibili  
                                                  ma in questo caso nel file Excel mancano informazioni fondamentali.

                                                  Sai benissimo anche tu che non è possibile aggiornare una riga di una tabella se non si ha modo di identificarla univocamente, o tramite la PK oppure tramite una serie di campi che la rendano tale.

                                                   

                                                   

                                                  #14548 Risposta

                                                  PLB83
                                                  Partecipante

                                                    Ciao,

                                                    purtroppo, salvando nel formato .xls perderei dati utili. Copio la prima parte del codice scritto...è nulla, però, ci sto provando. 

                                                    Sub Esporta_FrasiStandard()

                                                    Dim cn As Object 'dichiara l'oggetto che sarà la connessione alla fonte dati
                                                    Dim rs As Object 'dichiara l'oggetto che sarà il recordset
                                                    Dim s As String

                                                    'crea gli oggetti ADO connection e recordset
                                                    Set cn = CreateObject("ADODB.Connection")
                                                    Set rs = CreateObject("ADODB.Recordset")

                                                    cn.Open "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source=" & "C:\Users\XX\Desktop\DEV_Macro\3_3040200_04_v320.mdb"

                                                    rs.Open "SELECT STD SENTENCE " & _
                                                    "FROM [Foglio1$Y2:$Y64] "

                                                    End Sub

                                                     

                                                    Ps. Mi da errore su rs.Open. Il nome della colonna però è STD SENTENCE 

                                                    #14549 Risposta

                                                    vecchio frac
                                                    Senior Moderator
                                                      171 pts

                                                      PLB83 ha scritto:

                                                      salvando nel formato .xls perderei dati utili.

                                                      Perchè? hai dei dati oltre la 65535.ma riga o oltre la 256.ma colonna?

                                                      PLB83 ha scritto:

                                                      rs.Open "SELECT STD SENTENCE " & _ "FROM [Foglio1$Y2:$Y64] "

                                                      Quando nei nomi dei campi ci sono degli spazi o dei caratteri che possono confondere l'interprete (ad esempio un trattino), devi includere il nome del campo "strano"  tra parentesi quadre:

                                                      rs.Open "SELECT [STD SENTENCE] FROM [Foglio1$Y2:$Y64] "
                                                    LoginRegistrati
                                                    Stai vedendo 25 articoli - dal 1 a 25 (di 32 totali)
                                                    Rispondi a: Da file excel a tabella access
                                                    Gli allegati sono permessi solo ad utenti REGISTRATI
                                                    Le tue informazioni:



                                                    vecchio frac - 2750 risposte

                                                    albatros54
                                                    albatros54 - 1053 risposte

                                                    patel
                                                    patel - 1045 risposte

                                                    Marius44
                                                    Marius44 - 943 risposte

                                                    Luca73
                                                    Luca73 - 757 risposte