PDA

Visualizza la versione completa : Esempio Di Connessione ...


sal21
13-04-2004, 14:11
... di Access con Excel chi ne conosce qualcuno?

fspalluzzi
13-04-2004, 17:17
Originariamente postato da sal21
... di Access con Excel chi ne conosce qualcuno?

Se ti spieghi un pò meglio!! Io ho capito che stai usando Excel e vuoi connetterti ad una database di Access!! Se ho inteso bene fammi sapere ke ti dirò di più in base al reale problema che tu hai!!

Ciao

sal21
13-04-2004, 20:33
Originariamente postato da VBACCTUTOR
Se ti spieghi un pò meglio!! Io ho capito che stai usando Excel e vuoi connetterti ad una database di Access!! Se ho inteso bene fammi sapere ke ti dirò di più in base al reale problema che tu hai!!

Ciao

ho un .mdb PROVA con una tabella PROVA1 devo estrarre tutti i dati delle colonne della tabella ed inserli in un foglio di Excel a partire da A3 a prescindere dal numro di colonne prresenti nella tabella stessa. Esempio la tabella PTROVA1 è formta da 11 colonne e devo fare in modo che i dati delle la colonna 1 di questa tabella vadino in A a apartire da A3 di foglio1 di excel, i dati della colonna 2 di questa tabella vadino in B a partire da B3,ecc...

Credo di essere stato chiaro?!

cabal
13-04-2004, 22:46
Come direbbe qualcuno,questa è l'ovvia conseguenza del codice generato dal registratore di macro, però le mie conoscenze non arrivano più in là, quindi dovrai accontentarti.

Il db1.prova.mdb è stato salvato in C per semplicità, daltra parte il resto è già abbastanza complesso.

Sub provamdb()

With ActiveSheet.QueryTables.Add(Connection:=Array( _
"OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=C:\db1.prova.mdb;Mode=Share Deny Write;Extended Propertie" _
, _
"s="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=5;Jet OLEDB:Da" _
, _
"tabase Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password=""" _
, _
""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB" _
, ":Compact Without Replica Repair=False;Jet OLEDB:SFP=False"), Destination:= _
Range("A3"))
.CommandType = xlCmdTable
.CommandText = Array("PROVA1")
.Name = "db1.prova"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.SourceDataFile = "C:\db1.prova.mdb"
.Refresh BackgroundQuery:=False
End With
End Sub


ciao

fspalluzzi
13-04-2004, 22:51
Originariamente postato da sal21
ho un .mdb PROVA con una tabella PROVA1 devo estrarre tutti i dati delle colonne della tabella ed inserli in un foglio di Excel a partire da A3 a prescindere dal numro di colonne prresenti nella tabella stessa. Esempio la tabella PTROVA1 è formta da 11 colonne e devo fare in modo che i dati delle la colonna 1 di questa tabella vadino in A a apartire da A3 di foglio1 di excel, i dati della colonna 2 di questa tabella vadino in B a partire da B3,ecc...

Credo di essere stato chiaro?!

Ciao, nella vita basta essere chiari che si risolve tutto!! Dopo questa massima della vita veniamo al problema

Il classico problema di aver un database di Access e di dover estrarre tutti i dati delle colonne di una tabella ed inserirli in un foglio di Excel a partire da una cella a piacere (in questo caso a3)

Il processo è automatico in quanto puoi esportare i dati da Microsoft Access verso Microsoft Excel oppure da Microsoft Excel scegli il menu Dati e dal sottomenu che viene giu scegliere Importa dati Esterni e dal relativo sottomenu Importa dati e scegliere l'origine dati in questo caso il database .mdb Prova dopo di che dalla finestra che appare scegliere dall'elenco la tabella da esportare e subito dopo la cella del foglio di lavoro dalla quale iniziare a copiare.

Se tutto deve essere automatizzato puoi aprire un foglio di lavoro di Excel Scegliere Registra Macro dal Menu strumenti->Macro e ripetere le stesse identiche operazioni. Verrà codificato in Visual Basic il relativo codice tutto in maniera automatica.

Ciao e penso di esserti stato di aiuto!! Attento una tua risposta

Francesco S.

grullo
14-04-2004, 07:54
Se eventualmente sei interessato all'accesso a database in generale (oltre access) potrei consigliarti l'uso di ADO con il VB.
Non so quanto esperienza hai però con la programmazione dei DB e soprattutto con la sintassi SQL.

sal21
14-04-2004, 09:28
Originariamente postato da cabal
Come direbbe qualcuno,questa è l'ovvia conseguenza del codice generato dal registratore di macro, però le mie conoscenze non arrivano più in là, quindi dovrai accontentarti.

Il db1.prova.mdb è stato salvato in C per semplicità, daltra parte il resto è già abbastanza complesso.

Sub provamdb()

With ActiveSheet.QueryTables.Add(Connection:=Array( _
"OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=C:\db1.prova.mdb;Mode=Share Deny Write;Extended Propertie" _
, _
"s="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=5;Jet OLEDB:Da" _
, _
"tabase Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password=""" _
, _
""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB" _
, ":Compact Without Replica Repair=False;Jet OLEDB:SFP=False"), Destination:= _
Range("A3"))
.CommandType = xlCmdTable
.CommandText = Array("PROVA1")
.Name = "db1.prova"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.SourceDataFile = "C:\db1.prova.mdb"
.Refresh BackgroundQuery:=False
End With
End Sub


ciao OK! Ma facendo F8 (passo passo) qui:

.SourceDataFile = "C:\db1.prova.mdb"

ricevo "proprietà o metodo non supportati" errore 438. Boh!?


e poi qui cosa inserisco:

.CommandText = Array("PROVA1")

fspalluzzi
14-04-2004, 09:39
Originariamente postato da grullo
Se eventualmente sei interessato all'accesso a database in generale (oltre access) potrei consigliarti l'uso di ADO con il VB.
Non so quanto esperienza hai però con la programmazione dei DB e soprattutto con la sintassi SQL.

Ciao,

Grazie ai consigili che suggerisci, però l'utente iscritto al forum di manuali.net mi ha chiesto aiuto del modo in cui si può importare
database di Access in un foglio di lavoro di Excel. Il suo aiuto rientra in Microsoft Excel Avanzato.

Naturalmente se ci rivolgiamo ai sviluppatori il tuo consiglio può andare, mentre si ci rivolgiamo agli operatori dovremo utilizzare
gli strumenti offerti dall'applicativo (in questo caso di Microsoft Excel)

Io per dire avrei realizzato un'applicativo che mi importasse il database di Access in un foglio di lavoro di Microsoft Excel, senza
utilizzare quest'ultimo direttamente.

Buon lavoro
Francesco S.

grullo
14-04-2004, 10:03
Originariamente postato da sal21
... di Access con Excel chi ne conosce qualcuno?

Mi sembrava di capire dal primo post che Sal21 richiedesse ai vari utenti del forum VBA ed excel avanzato come connettersi ad un database (nello specifico Access). Visto che VBA è un linguaggio di programmazione e visto che anche altre volte è stata fatta un'esplicita richiesta all'uso degli ADO con Excel ho solamente fatto una domanda sull'intenzione e le capacità dell'utente di utilizzare la tecnologia.
Non vedo il problema!
:confuso:

cabal
14-04-2004, 12:15
Originariamente postato da sal21 OK! Ma facendo F8 (passo passo) qui:
.SourceDataFile = "C:\db1.prova.mdb"
ricevo "proprietà o metodo non supportati" errore 438. Boh!?

"C:\db1.prova.mdb" e' l'indirizzo ed il nome del database di prova che avevo fatto per registrare la routine, mettici il tuo.

e poi qui cosa inserisco:
.CommandText = Array("PROVA1")


Prova1 è il nome della tabella access da importare, anche in questo caso mettici il tuo.

ciao

sal21
14-04-2004, 12:22
... credo che con l'ultimo post ho creato un pò di malintesi fra alcuni utenti , e questo mi dispiace, se fosse così vogliate accettare le mie scuse.

cabal
14-04-2004, 12:26
Originariamente postato da VBACCTUTOR
Ciao,

Grazie ai consigili che suggerisci, però l'utente iscritto al forum di manuali.net mi ha chiesto aiuto del modo in cui si può importare
database di Access in un foglio di lavoro di Excel. Il suo aiuto rientra in Microsoft Excel Avanzato.

Naturalmente se ci rivolgiamo ai sviluppatori il tuo consiglio può andare, mentre si ci rivolgiamo agli operatori dovremo utilizzare
gli strumenti offerti dall'applicativo (in questo caso di Microsoft Excel)

Io per dire avrei realizzato un'applicativo che mi importasse il database di Access in un foglio di lavoro di Microsoft Excel, senza
utilizzare quest'ultimo direttamente.

Buon lavoro
Francesco S.

Sono molto interessato ad imparare metodi che vanno oltre la registrazione di semplici macro, quindi, se non ti disturba eccessivamente sarei molto interessato allo sviluppo di un applicativo che mi importasse il database di Access in un foglio di lavoro di Microsoft Excel, senza
utilizzare quest'ultimo direttamente.

Come del resto, sarei sempre molto interessato all'utilizzo all'uso degli ADO con Excel.

Tutto quello che posso imparare è sempre ben accetto.

grazie e ciao

sal21
14-04-2004, 12:30
Originariamente postato da cabal
"C:\db1.prova.mdb" e' l'indirizzo ed il nome del database di prova che avevo fatto per registrare la routine, mettici il tuo.


Prova1 è il nome della tabella access da importare, anche in questo caso mettici il tuo.

ciao

ok! ma il mio db risiede su un server:

\\srv04f9494rmtb\asp\TEMP\DBDELIVERY.MDB

la tabella si chiame TABELLA1

mi modificheresti il tuo script solo per questi dati

In ogni caso ottengo sempre:

"proprietà o metodo non supportati" errore 438. Boh!?

grullo
14-04-2004, 12:55
Originariamente postato da sal21
... credo che con l'ultimo post ho creato un pò di malintesi fra alcuni utenti , e questo mi dispiace, se fosse così vogliate accettare le mie scuse.

Non credo ch tu abbia motivo per scusarti, se incomprensioni ci sono state (non credo! :cool: ) ci chiariremo!

:D

cabal
14-04-2004, 13:03
ok! ma il mio db risiede su un server:
\\srv04f9494rmtb\asp\TEMP\DBDELIVERY.MDB

la tabella si chiame TABELLA1
mi modificheresti il tuo script solo per questi dati
In ogni caso ottengo sempre:
"proprietà o metodo non supportati" errore 438. Boh!?

ma penso che vada oltre le mie capacità, purtroppo non dispongo di un server per fare delle prove, speriamo che ci sia qualcuno in grado di darci qualche suggerimento, l'argomento interessa molto anche me.

ciao

grullo
14-04-2004, 13:25
Io provo ad insistere con gli ADO magari a qualcuno può far piacere:

Sub provamdb()

Dim cn As New ADODB.Connection, rs As New ADODB.Recordset
Dim strPathMDB As String
strPathMDB = "\\srv04f9494rmtb\asp\TEMP\DBDELIVERY.MDB"
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPathMDB & ";Persist Security Info=False"
cn.Open
Dim strSQL As String
'Stringa SQL di selezione
strSQL = "SELECT * FROM TABELLA1"
Set rs = cn.Execute(strSQL)
rs.MoveFirst
Do Until rs.EOF
'Ciclo nei campi del record
For i = 0 To rs.Fields.Count - 1
'Leggo i vari di ogni campo
MsgBox rs.Fields(i).Value 'E' possibile quindi scriverli in excel
Next i
rs.MoveNext
Loop

End Sub

E? necessario impostare i riferimenti alla Libreria Microsoft ActiveX Data Object 2.x

grullo
14-04-2004, 13:26
Più volte ho fatto riferimento a questo indirizzo (http://www.redangel.it/programmatori/nicola_pietralunga/ADO/index.asp) per un po di documentazione per neofiti

cabal
14-04-2004, 13:32
Quel link è finito dritto sparato nei preferiti..:D :D

credo che nei prossimi giorni sarò leggermente :D impegnato:D

ciao

grullo
14-04-2004, 13:34
Visto che siamo in tema ADO metto a disposizione di tutti (...quanto son BUONO!!!) un piccolo trucchetto per generare una stringa di connessione sulla base di un provider disponibile sul PC.

Io lo uso molto e lo trovo utile (..forse ai più risulterà un trucco vecchio, ma ad altri...).
Si parte creando un documento di testo vuoto. Quindi si modifca l'estensione in UDL. A questo punto l'icona del file di testo cambia.
Facendo doppio click compare la finestra Data Link Properties.
1)Dalla scheda Provider scegliere il provider che si intende utilizzare
2)Nella scheda connection inserire i parametri della connessione quindi premere il bottone TEST CONNECTION.
Se è andato tutto bene (test di connessione positivo) chiudere la finestra.
Aprire il file *.UDL con notepad....lì trovate la stringa di connessione generata.
:D

sal21
14-04-2004, 13:43
Originariamente postato da grullo
Io provo ad insistere con gli ADO magari a qualcuno può far piacere:

Sub provamdb()

Dim cn As New ADODB.Connection, rs As New ADODB.Recordset
Dim strPathMDB As String
strPathMDB = "\\srv04f9494rmtb\asp\TEMP\DBDELIVERY.MDB"
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPathMDB & ";Persist Security Info=False"
cn.Open
Dim strSQL As String
'Stringa SQL di selezione
strSQL = "SELECT * FROM TABELLA1"
Set rs = cn.Execute(strSQL)
rs.MoveFirst
Do Until rs.EOF
'Ciclo nei campi del record
For i = 0 To rs.Fields.Count - 1
'Leggo i vari di ogni campo
MsgBox rs.Fields(i).Value 'E' possibile quindi scriverli in excel
Next i
rs.MoveNext
Loop

End Sub

E? necessario impostare i riferimenti alla Libreria Microsoft ActiveX Data Object 2.x


Ovvero... come si fa?
E? necessario impostare i riferimenti alla Libreria Microsoft ActiveX Data Object 2.x....

grullo
14-04-2004, 13:55
Dall'editor del VBA di excel:
1)Strumenti > Riferimenti...
2) Nella finestra che compare cerca Microsoft ActiveX Data Object 2.7 Library o (o altre verisoni)

sal21
14-04-2004, 14:09
Originariamente postato da grullo
Dall'editor del VBA di excel:
1)Strumenti > Riferimenti...
2) Nella finestra che compare cerca Microsoft ActiveX Data Object 2.7 Library o (o altre verisoni)

ok! ho configurato gli oggetti e tutto mi sembra ok! solo che non scrive niente nelle celle?!

grullo
14-04-2004, 14:25
Il mio esempio in effetti non lo fa!!!
Dovresti però poter leggere le varie msgbox con i valori contenuti. Basta modificare il codice per scrivere nelle celle.

sal21
14-04-2004, 14:29
Originariamente postato da grullo
Il mio esempio in effetti non lo fa!!!
Dovresti però poter leggere le varie msgbox con i valori contenuti. Basta modificare il codice per scrivere nelle celle. ... cclo for next. Se mi modifichi almeno un pezzo per una cella il resto lo faccio io.

grullo
14-04-2004, 14:33
Così scrivi a partire dalla cella A1 del foglio1 (nome dei campi compresi):

Sub provamdb()

Dim cn As New ADODB.Connection, rs As New ADODB.Recordset
Dim strPathMDB As String
strPathMDB = "\\srv04f9494rmtb\asp\TEMP\DBDELIVERY.MDB"
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPathMDB & ";Persist Security Info=False"
cn.Open
Dim strSQL As String
'Stringa SQL di selezione
strSQL = "SELECT * FROM TABELLA1"
Set rs = cn.Execute(strSQL)
rs.MoveFirst
Dim numRec As Long
numRec = 1
Do Until rs.EOF
'Ciclo nei campi del record
For i = 0 To rs.Fields.Count - 1
If numRec = 1 Then
'Scrivo il nome dei campi
Foglio1.Cells(numRec, i + 1) = rs.Fields(i).Name
'Scrivo il valore del campo per il primo record
Foglio1.Cells(numRec + 1, i + 1) = rs.Fields(i).Value
Else
'Scrivo il valore del campo per il record i-esimo
Foglio1.Cells(numRec + 1, i + 1) = rs.Fields(i).Value
End If
Next i
rs.MoveNext
numRec = numRec + 1

Loop

End Sub

:D

sal21
14-04-2004, 14:51
Originariamente postato da grullo
Così scrivi a partire dalla cella A1 del foglio1 (nome dei campi compresi):

Sub provamdb()

Dim cn As New ADODB.Connection, rs As New ADODB.Recordset
Dim strPathMDB As String
strPathMDB = "\\srv04f9494rmtb\asp\TEMP\DBDELIVERY.MDB"
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPathMDB & ";Persist Security Info=False"
cn.Open
Dim strSQL As String
'Stringa SQL di selezione
strSQL = "SELECT * FROM TABELLA1"
Set rs = cn.Execute(strSQL)
rs.MoveFirst
Dim numRec As Long
numRec = 1
Do Until rs.EOF
'Ciclo nei campi del record
For i = 0 To rs.Fields.Count - 1
If numRec = 1 Then
'Scrivo il nome dei campi
Foglio1.Cells(numRec, i + 1) = rs.Fields(i).Name
'Scrivo il valore del campo per il primo record
Foglio1.Cells(numRec + 1, i + 1) = rs.Fields(i).Value
Else
'Scrivo il valore del campo per il record i-esimo
Foglio1.Cells(numRec + 1, i + 1) = rs.Fields(i).Value
End If
Next i
rs.MoveNext
numRec = numRec + 1

Loop

End Sub

:D IT WORK FINE!


Curiuosità: come mai inserendo un filtro vedo solo 1000 rekord su 10234?

grullo
14-04-2004, 14:58
Curiuosità: come mai inserendo un filtro vedo solo 1000 rekord su 10234?

In che senso impostando un filtro???
Da stringa SQL???

sal21
14-04-2004, 16:27
Originariamente postato da grullo
Curiuosità: come mai inserendo un filtro vedo solo 1000 rekord su 10234?

In che senso impostando un filtro???


Da stringa SQL???



.. il semplice filtro: DATI>FILTRO AUTOMATICO

sal21
16-04-2004, 15:38
.Ma se volessi importare due tabelle in due differenti fogli della stessa cartella?

Per esempio un file prova.mdb contiene 2 tabelle, tabella1 e tabella2, quindi inserire i dati di tabella1 nel foglio1 e i dati di tabella2 nel foglio2 utilizzando sempre la stessa connessione al db?

grullo
16-04-2004, 15:55
Se guardi bene i post ne ho aperto proprio uno in proposito al posto tuo!!!
:D

grullo
16-04-2004, 15:58
VAI AL POST IN QUESTIONE!!!! (http://www.manuali.net/forum/showthread.php?s=&threadid=23360)

:D

sal21
16-04-2004, 16:02
Originariamente postato da grullo
VAI AL POST IN QUESTIONE!!!! (http://www.manuali.net/forum/showthread.php?s=&threadid=23360)

:D

.. scusami ma sono in palla!!!! Vado subito a vedere. Grazie.

sal21
22-04-2004, 11:41
Originariamente postato da grullo
Se guardi bene i post ne ho aperto proprio uno in proposito al posto tuo!!!
:D

... superati tutti i problemi di collegamento ad Access. Nuovo problema. Una volta importate le tabelle dall' .mdb di Access, posso scrivere in questo .mdb ? Ovvero se modifico un record in una cella dei vari fogli delle contenente i dati importati dalle relative tabelle posso aggiornare le stesse tabelle importate e fare l'update dell'dataabse Access?.. Non so se sono stato chiaro?

grullo
23-04-2004, 13:02
per fare questo occoorre sapere:
1)La tabella da aggiornare
2)I campi presenti e il tipo per ricostruire la query di UPDATE
3)Identificare in modo univoco la riga da aggiornare

Analisi:
1)Non dovrebbero esserci problemi in quanto il nome della tabella corrisponde al nome del Foglio (vedi Macro di importazione)...ma se venisse cambiato il nome del foglio occorre individuare l'errore che ne potrebbe scaturire
2)I nomi dei campi potrebbero essere stati immessi anche manualemente (o con gli esempi proposti in precedenza in modo automatico)....manca però conoscere il tipo del campo che allo stato attuale non era stato previsto!!! Questo per ricostruire in modo corretto la Query di UPDATE
3)L'identificazione univoca della riga dovrebbe avvenire attraverso l'identificazione di una chiave primaria che ovviamente allora non potrebbe essere modificata. Immagina infatti che una tabella abbia un campo ID (chiave primaria) se modificassi tale valore da excel non potrei più risalire alla riga corrispondente in Access.

Ritengo che eseguire un UPDATE su Excel per Access siano un'operazione piuttosto complessa e poco sicura....capisci il problema di sapere sempre la chiave primaria di una tabella??? Che fai lasci tutto in mano alle conoscenze dell'operatore??? Sai quante volte ti CRASHia la macro???
:confuso:

sal21
23-04-2004, 13:37
Originariamente postato da grullo
per fare questo occoorre sapere:
1)La tabella da aggiornare
2)I campi presenti e il tipo per ricostruire la query di UPDATE
3)Identificare in modo univoco la riga da aggiornare

Analisi:
1)Non dovrebbero esserci problemi in quanto il nome della tabella corrisponde al nome del Foglio (vedi Macro di importazione)...ma se venisse cambiato il nome del foglio occorre individuare l'errore che ne potrebbe scaturire
2)I nomi dei campi potrebbero essere stati immessi anche manualemente (o con gli esempi proposti in precedenza in modo automatico)....manca però conoscere il tipo del campo che allo stato attuale non era stato previsto!!! Questo per ricostruire in modo corretto la Query di UPDATE
3)L'identificazione univoca della riga dovrebbe avvenire attraverso l'identificazione di una chiave primaria che ovviamente allora non potrebbe essere modificata. Immagina infatti che una tabella abbia un campo ID (chiave primaria) se modificassi tale valore da excel non potrei più risalire alla riga corrispondente in Access.

Ritengo che eseguire un UPDATE su Excel per Access siano un'operazione piuttosto complessa e poco sicura....capisci il problema di sapere sempre la chiave primaria di una tabella??? Che fai lasci tutto in mano alle conoscenze dell'operatore??? Sai quante volte ti CRASHia la macro???
:confuso:
chiaro come al solito! Alla prossima. ciao.