Ma recuperare direttamente da Access senza per forza
doverlo prima aprire?
Un modo:
Public Sub mRecuperaDati()
On Error GoTo RigaErrore
Dim cn As Object
Dim rs As Object
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.CursorLocation = 1
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " _
& "Data Source=" & ThisWorkbook.Path & _
"\dbExcelAccess.mdb"
rs.CursorLocation = 1
rs.Open "SELECT * FROM tblAnagrafica", cn, 1, 3, 1
End With
RigaChiusura:
If rs.State = 1 Then
rs.Close
End If
If cn.State = 1 Then
cn.Close
End If
Set rs = Nothing
Set cn = Nothing
Exit Sub
RigaErrore:
MsgBox Err.Number & vbNewLine & Err.Description
Resume RigaChiusura
End Sub
Dove sostituirai path e nome del db con i tuoi e
imposterai la query corretta.
A questo punto il recordset (rs) conterr� i dati
recuperati dal db e non ti rester� che ciclarlo.
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://blog.maurogsc.eu/
http://social.microsoft.com/Forums/it-IT/officeit/threads
Passo.
Per me interrogare un db per recuperare dei dati
in un caso tipo questo passa attraverso query e ADO
e il db resta ben chiuso all'utente.
Un codice tipo questo:
Public Sub mAccess()
Dim objAccess As Object
Dim sPath As String
sPath = "C:\mioDB.mdb"
Set objAccess = _
CreateObject("Access.Application")
With objAccess
.OpenCurrentDatabase sPath
.UserControl = True
End With
AppActivate "Microsoft Access"
Set objAccess = Nothing
End Sub
Apre il db e permetterebbe(immmagino) di
recuperare ugualmente i dati per utilizzarli
in Word. Ma mi fermo qui.
>no, non vorrei posizionarmi sul record voluto da codice VBA perche' e'
>troppo macchinoso, io banalmente mi posiziono sul record voluto facendo una
>ricerca che puo' coinvolgere un numero imprecisato di campi
>Sto cercando una soluzione perche' attualmente assegno brutalmente i campi
>che mi servono in testa alla macro di Word, invece sarebbe piu' comodo
>posizionarsi sul record di Access e a questo punto prelevare i campi da
>macro Word. Non e' che potrei usare il metodo CurrentDb?
Direi di no, CurrentDb � una propriet� accessibile da Access, non
dall'interfaccia di programmazione esterna ADO o DAO.
Si potrebbe tentare di ottenere un'istanza dell'oggetto Microsoft.Access
attivo, ma anche cos� accedere agli oggetti dell'interfaccia interattiva di
Access non � molto agevole, posto che sia possibile (non � particolarmente
agevole neppure dal VBA di Access, per dire la verit�, perch� bisogna
tenere conto della visualizzazione e dello stato dell'oggetto, ecc.).
Piuttosto, pu� essere conveniente da Access passare i dati a Word, in un
metodo evento della maschera o altro.
Ciao.
Ciao il barbi. (Ciao Mauro.)
Non ho capito, barbi, cosa intendi dire con "non vorrei posizionarmi sul
record voluto" visto che a quel che dici sei gia' posizionato sul record
voluto e il tuo problema sembra essere quello di recuperare, da Word, i
valori dei campi di tale record. Se le cose stanno cos� allora un modo
potrebbe essere quello di recuperare, da Word, i valori dei campi del record
attivo in Access. Per esempio cosi':
' WORD
' Modulo standard: Modulo1
Option Explicit
Public Const acTable = 0
Public Const acQuery = 1
Public Const acForm = 2
Public Sub Test()
On Error GoTo ErrorHandler
Dim a 'As Access.Application
Dim b 'As Access.Screen
Dim c 'As Access.Form
Dim d
Set a = GetObject(, "Access.Application")
Set b = a.Screen
Select Case a.CurrentObjectType
Case acTable, acQuery
Set c = b.ActiveDatasheet
Case acForm
Set c = b.ActiveForm
Case Else
' DO NOTHING
End Select
If c Is Nothing Then
Debug.Print "CurrentObjectType:" _
; a.CurrentObjectType
Else
Debug.Print TypeName(c)
For Each d In c.Recordset.Fields
With d
Debug.Print .Name, .Value
End With
Next
End If
ExitProcedure:
Set d = Nothing
Set c = Nothing
Set b = Nothing
Set a = Nothing
Exit Sub
ErrorHandler:
Debug.Print "ERR#"; CStr(Err.Number)
Resume ExitProcedure
End Sub
--
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
> visto che a quel che dici sei gia' posizionato sul record
> voluto e il tuo problema sembra essere quello di recuperare, da Word, i
> valori dei campi di tale record
>
infatti, mi sono posizionato sul record manualmente perche' cio' dipende da
una ricerca volta per volta su campi diversi e il mio problema e' proprio
recuperare da Word i campi del record corrente nella finestra della maschera
> Se le cose stanno cos� allora un modo
> potrebbe essere quello di recuperare, da Word, i valori dei campi del
> record attivo in Access. Per esempio cosi':
>
perfetto e' proprio quello che mi serviva
ma non ci sarei mai arrivato da solo
In sostanza il succo e':
Set tab = GetObject(, "Access.Application").Screen.ActiveForm.Recordset
tutti questi punti mi fanno impazzire, non capisco mai se sono oggetti,
metodi, proprieta' e chissa' cosa...:-)
il barbi
[...]
> infatti, mi sono posizionato sul record manualmente perche' cio' dipende
> da una ricerca volta per volta su campi diversi e il mio problema e'
> proprio recuperare da Word i campi del record corrente nella finestra
> della maschera
>> Se le cose stanno cos� allora un modo
>> potrebbe essere quello di recuperare, da Word, i valori dei campi del
>> record attivo in Access. Per esempio cosi':
> perfetto e' proprio quello che mi serviva
> ma non ci sarei mai arrivato da solo
> In sostanza il succo e':
> Set tab = GetObject(, "Access.Application").Screen.ActiveForm.Recordset
> tutti questi punti mi fanno impazzire, non capisco mai se sono oggetti,
> metodi, proprieta' e chissa' cosa...:-)
Ciao il barbi.
Io manterrei una variabile per ogni oggetto, come nel mio esempio. Anche
perche' ti rende piu' agevole l'eventuale debug.
Quanto al capire di che stiamo parlando, usa il Visualizzatore oggetti e la
pagina della guida "Modello degli oggetti di Access" e/o la corrispondente
di Word.
Avrai notato la mia scrittura:
Dim a 'As Access.Application
E' cosi' perche' io in una prima fase ho aggiunto ai riferimenti del
progetto Visual Basic di Word la:
Library Access
C:\Programmi\Microsoft Office\OFFICE11\MSACC.OLB
Microsoft Access 11.0 Object Library
scrivendo:
Dim a As Access.Application
usufruendo cosi' dell'Intellisense, quindi ho testato la procedura, infine
ho tolto il riferimento a Access e ho interrotto il collegamento delle
variabili agli oggetti di questo:
Dim a 'As Access.Application
mantenendone pero' memoria per un eventuale riuso.
>perfetto e' proprio quello che mi serviva
>ma non ci sarei mai arrivato da solo
>In sostanza il succo e':
> Set tab = GetObject(, "Access.Application").Screen.ActiveForm.Recordset
In Word esiste una nozione non ambigua di "documento attivo" e "punto di
inserimento corrente"; in Access non � cos� (perch� un database � uno
strumento molto pi� complesso di un word processor, in cui bene o male
starai sempre editando del testo perch� � sostanzialmente tutto quello che
si pu� fare, e per scelte progettuali di Microsoft): i controlli che ti ha
proposto Maurizio Borrelli non sono, in generale, evitabili.
Devi, in generale, assicurarti che l'oggetto attivo sia qualcosa al quale
ha senso chiedere un Recordset, o che esista un oggetto attivo (o almeno
aperto) del tipo che ti interessa (per questo dicevo che � pi� semplice
fare in modo che un evento di Access comunichi qualcosa a Word piuttosto
che il contrario).
>tutti questi punti mi fanno impazzire, non capisco mai se sono oggetti,
>metodi, proprieta' e chissa' cosa...:-)
Sono tutte e due o tutte e tre le cose, secondo come li guardi:
ActiveForm.Recordset � una propriet� dell'oggetto Form, che � un oggetto
Recordset.
Utilizzare variabili intermedie, oltre che a rendere un po' pi�
comprensibile quello che si sta facendo, accelera anche un po' l'accesso
agli oggetti, in caso di accessi ripetuti al medesimo oggetto.
Ciao.