› Sviluppare funzionalita su Microsoft Office con VBA › Da file excel a tabella access
-
AutoreArticoli
-
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.
Ti conviene interfacciarti ad Access mediante ADO. Puoi partire dal mio articoletto su questo forum:
Prima di tutto ti ringrazio. Effettuo una lettura approfondita e poi caso mai passo alle domande 🙂
Grazie ancora
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.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 )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.
Se fai una ricerca su Google trovi molti esempi.
Magari qualcuno di questi può aiutarti.
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.mdb e EVC_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.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. -->
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.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?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.
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 connessioneLe 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.
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.
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.ActivateSet 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.UpdateNext i
oDB.CloseEnd Sub
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 {;}
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 🙂
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.
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.
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.
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
salvando nel formato .xls perderei dati utili.
Perchè? hai dei dati oltre la 65535.ma riga o oltre la 256.ma colonna?
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] "
-
AutoreArticoli