Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Recuperare da macro Word un record Access

60 views
Skip to first unread message

il barbi

unread,
Sep 14, 2009, 5:44:20 AM9/14/09
to
Apro un database Access e vado su un certo record, dopo di che apro un file
Word e lanciando una macro in VBA vorrei recuperare i campi del record
Access per lavorarci sopra, come si fa?
il barbi


Mauro Gamberini

unread,
Sep 14, 2009, 5:57:17 AM9/14/09
to
> Apro un database Access e vado su un certo record, dopo di che apro un
> file Word e lanciando una macro in VBA vorrei recuperare i campi del
> record Access per lavorarci sopra, come si fa?
>

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


il barbi

unread,
Sep 14, 2009, 7:04:13 AM9/14/09
to
"Mauro Gamberini" <maurogsc...@RIMUOVEREaliceposta.it> ha scritto nel
messaggio news:ODAAwISN...@TK2MSFTNGP04.phx.gbl...

>> Apro un database Access e vado su un certo record, dopo di che apro un
>> file Word e lanciando una macro in VBA vorrei recuperare i campi del
>> record Access per lavorarci sopra, come si fa?
>>
>
> Ma recuperare direttamente da Access senza per forza
> doverlo prima aprire?
>
>cut<

>
> Dove sostituirai path e nome del db con i tuoi e
> imposterai la query corretta.
>
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?
il barbi


Mauro Gamberini

unread,
Sep 14, 2009, 9:37:12 AM9/14/09
to
> 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?
>

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.

Giovanni Zezza

unread,
Sep 14, 2009, 11:24:19 AM9/14/09
to
il barbi, nel messaggio <e8SwZsS...@TK2MSFTNGP06.phx.gbl>, scriveva:

>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.

il barbi

unread,
Sep 16, 2009, 9:09:18 AM9/16/09
to
"Giovanni Zezza" <zezz...@gmail.com> ha scritto nel messaggio
news:4oksa5peua06v7689...@4ax.com...
adesso che ci penso effettivamente ho gia' nel database la possibilita' di
aprire il file Word, battendo F2 su un certo controllo, e lo apro mediante
una routine che fa una shell:
Shell("rundll32.exe url.dll,FileProtocolHandler " & Percorso)
a questo punto pero' devo andare nel file Word e lavorarci sopra periodo per
periodo con un codice VBA che lavora su oggetti Word, che non credo potrei
conglobare nel codice VBA del database e comunque non vorrei. Mi manca solo
di passare alla macro Word almeno l'Id del record del database su cui sono
posizionato, in modo tale che all'inizio della macro Word, facendo
OpenDatabase e OpenRecordset e posizionandomi sull'Id, prelevo da quel
record i dati di cui ho bisogno. Al limite potrei, subito dopo aver aperto
il file Word con F2, registrare con VBA un piccolo file contenente l'Id del
record
il barbi


Maurizio Borrelli

unread,
Sep 17, 2009, 1:57:14 AM9/17/09
to
"il barbi" wrote in message
news:e8SwZsS...@TK2MSFTNGP06.phx.gbl...
> "Mauro Gamberini" ha scritto nel messaggio
> news:ODAAwISN...@TK2MSFTNGP04.phx.gbl...

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/

il barbi

unread,
Sep 17, 2009, 9:50:08 AM9/17/09
to
"Maurizio Borrelli" <maurizio...@freepass.it> ha scritto nel messaggio
news:02F638B0-A6B9-42DD...@microsoft.com...

>
> Non ho capito, barbi, cosa intendi dire con "non vorrei posizionarmi sul
> record voluto"
>
segue: "da codice VBA"

> 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


Maurizio Borrelli

unread,
Sep 17, 2009, 10:11:26 AM9/17/09
to

"il barbi" wrote in message
news:O0IQI35N...@TK2MSFTNGP05.phx.gbl...
> "Maurizio Borrelli" ha scritto nel messaggio
> news:02F638B0-A6B9-42DD...@microsoft.com...

[...]


> 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.

Giovanni Zezza

unread,
Sep 17, 2009, 10:57:04 AM9/17/09
to
il barbi, nel messaggio <O0IQI35N...@TK2MSFTNGP05.phx.gbl>, scriveva:

>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.

0 new messages