Discussione:
automazione da access
(troppo vecchio per rispondere)
volatile56
2006-09-28 05:17:26 UTC
Permalink
D'accordo è un oggetto, ma come lo istanzi?
Ciao.
intanto mi scuso per il ritardo, ma questo Gruppo mi dà qualche
problema di interattività :))

tornando al quesito : l'oggetto diventa una istanza di Word

Set oApp = CreateObject("Word.Application")
oApp.Visible = True

e poi apro un nuovo documento usando un modello

sFile = "ilMioModello.dot"
oApp.Documents.Add Template:= _
"C:\id Ivan\" & sFile _
, NewTemplate:=False, DocumentType:=0

e da lì in poi vado a cercare e riempire segnalibri disseminati nel
modello...

Ho controllato i riferimenti ma non ho trovato dei MANCA.

Il modello è stato creato anche lui in WordXP ....

spero che la situazione sia abbastanza chiara

grazie per l'attenzione
Sergio MAZZA
2006-09-29 10:44:19 UTC
Permalink
"volatile56" <***@tin.it> ha scritto nel messaggio news:***@e3g2000cwe.googlegroups.com...

intanto mi scuso per il ritardo, ma questo Gruppo mi dà qualche
problema di interattività :))

tornando al quesito : l'oggetto diventa una istanza di Word

Set oApp = CreateObject("Word.Application")
oApp.Visible = True

e poi apro un nuovo documento usando un modello

sFile = "ilMioModello.dot"
oApp.Documents.Add Template:= _
"C:\id Ivan\" & sFile _
, NewTemplate:=False, DocumentType:=0

e da lì in poi vado a cercare e riempire segnalibri disseminati nel
modello...

Ho controllato i riferimenti ma non ho trovato dei MANCA.

Il modello è stato creato anche lui in WordXP ....

spero che la situazione sia abbastanza chiara

grazie per l'attenzione

[risposta]
Quello che manca sono le istruzioni che utilizzi per cercare i segnalibri e
sostituirli con il testo.
Poi perché utilizzare un modello (.dot) che, secondo me, non è lo
"strumento" giusto perché word, quando apre un .dot crea un documento .doc e
tu (con OLE) devi far riferimento al .doc non al .dot. Non sarebbe più
semplice aprire il .doc con i segnalibri, modificare il testo e salvarlo con
un nome differente?

Ciao.
--
Sergio MAZZA
Giovanni Zezza
2006-09-29 11:05:44 UTC
Permalink
Post by Sergio MAZZA
Quello che manca sono le istruzioni che utilizzi per cercare i segnalibri e
sostituirli con il testo.
Se non riesce ad ottenere un riferimento ad un nuovo documento, che senso
ha andare avanti? il problema evidentemente è prima (anche se non si
capisce dove e perché).
Post by Sergio MAZZA
Poi perché utilizzare un modello (.dot) che, secondo me, non è lo
"strumento" giusto perché word, quando apre un .dot crea un documento .doc e
tu (con OLE) devi far riferimento al .doc non al .dot. Non sarebbe più
semplice aprire il .doc con i segnalibri, modificare il testo e salvarlo con
un nome differente?
Perché, non è esattamente quello che succede quando crei un nuovo documento
sulla base di un modello, con il vantaggio che non puoi, neanche per
sbaglio, sovrascrivere il modello?

Ciao.
Sergio MAZZA
2006-09-29 11:26:21 UTC
Permalink
Post by Giovanni Zezza
Se non riesce ad ottenere un riferimento ad un nuovo documento, che senso
ha andare avanti? il problema evidentemente è prima (anche se non si
capisce dove e perché).
Era proprio per questo che lo chiedevo; lui ha un riferimento solo
all'applicazione (oApp), non al documento che ha aperto/generato(con il
modello).
Post by Giovanni Zezza
Perché, non è esattamente quello che succede quando crei un nuovo
documento sulla base di un modello, con il vantaggio che non puoi, neanche
per
sbaglio, sovrascrivere il modello?
Se fai tutto (apertura documento+scrittura dati) con l'automazione non hai
bisogno dei modelli; alla fine della scrittura dei dati puoi salvare il
documento con oggettoApplication.documentoAttivo.SaveAs "nomeDocumento",
renderlo visibile e lasciarlo in pasto all'utente se deve integrarlo.
Post by Giovanni Zezza
Ciao.
Ciao.
--
Sergio MAZZA
Sergio MAZZA
2006-09-29 11:48:04 UTC
Permalink
Post by Sergio MAZZA
Era proprio per questo che lo chiedevo; lui ha un riferimento solo
all'applicazione (oApp), non al documento che ha aperto/generato(con il
modello).
Mi correggo; qui ho detto 'na strunzata.

Ciao.
--
Sergio MAZZA
Sergio MAZZA
2006-09-29 12:37:56 UTC
Permalink
Anzi mi ricorreggo (che giornataccia!); il codice che avevo visto era quello
tuo (Giovanni) che istanziava il documento:
Set documento = oApp.Documents.Add(Template:= _ ...

Ma non si sa se Ivan l'ha adottato o no...

Ciao.
--
Sergio MAZZA
Giovanni Zezza
2006-09-29 14:10:28 UTC
Permalink
Post by Sergio MAZZA
Anzi mi ricorreggo (che giornataccia!); il codice che avevo visto era quello
Set documento = oApp.Documents.Add(Template:= _ ...
Ma non si sa se Ivan l'ha adottato o no...
Vabbe'... direi che ci fidiamo. Il dubbio è venuto anche a me, gliel'ho
detto, lui ha risposto... non è che posso metterlo sotto inquisizione per
farmi dire esplicitamente "sì, ho fatto così". Fino a prova contraria, mi
sembra ragionevole (oltre che educato) suppore che usi un procedimento
formalmente corretto per ottenere un riferimento al documento.

Ciao.
Sergio MAZZA
2006-09-30 12:42:53 UTC
Permalink
Post by Giovanni Zezza
Vabbe'... direi che ci fidiamo. Il dubbio è venuto anche a me, gliel'ho
detto, lui ha risposto... non è che posso metterlo sotto inquisizione per
farmi dire esplicitamente "sì, ho fatto così". Fino a prova contraria, mi
sembra ragionevole (oltre che educato) suppore che usi un procedimento
formalmente corretto per ottenere un riferimento al documento.
Ciao.
Non vedo cosa c'entri l'educazione; ho solo sollevato un dubbio visto che non posso aver riscontro del codice che scrive Ivan se lui
non lo riporta per intero...

Ciao.
--
Sergio MAZZA
Giovanni Zezza
2006-10-01 12:01:39 UTC
Permalink
Post by Sergio MAZZA
Non vedo cosa c'entri l'educazione
Leggi "conforme alla MIA educazione e sensibilità", in luogo di
"educato".

Ciao.
Sergio MAZZA
2006-10-01 17:59:49 UTC
Permalink
Post by Giovanni Zezza
Leggi "conforme alla MIA educazione e sensibilità", in luogo di
"educato".
Ciao.
Ok...

Ciao.
--
Sergio MAZZA
Giovanni Zezza
2006-09-29 14:06:34 UTC
Permalink
Post by Sergio MAZZA
Se fai tutto (apertura documento+scrittura dati) con l'automazione non hai
bisogno dei modelli; alla fine della scrittura dei dati puoi salvare il
documento con oggettoApplication.documentoAttivo.SaveAs "nomeDocumento",
renderlo visibile e lasciarlo in pasto all'utente se deve integrarlo.
D'accordo, ma in che cosa sarebbe "più semplice"? a me sembra identicamente
la stessa cosa, quindi alla fine una questione di preferenze personale.

Personalmente trovo che non sia una cattiva idea chiamare modello quello
che si usa come modello e documento quello che si modifica; mi sembra così
meno probabile che qualcuno modifichi o cancelli il modello, non sapendo o
non ricordando a che cosa serviva. Di più, così si ha disposizione il
modello anche per l'uso interattivo.

In ogni caso, mi è difficile pensare che questo possa avere qualcosa a che
fare con il problema segnalato.

Ciao.
Ivan
2006-09-30 06:55:25 UTC
Permalink
Post by Giovanni Zezza
Post by Sergio MAZZA
Se fai tutto (apertura documento+scrittura dati) con l'automazione non hai
bisogno dei modelli; alla fine della scrittura dei dati puoi salvare il
documento con oggettoApplication.documentoAttivo.SaveAs "nomeDocumento",
renderlo visibile e lasciarlo in pasto all'utente se deve integrarlo.
D'accordo, ma in che cosa sarebbe "più semplice"? a me sembra
identicamente
la stessa cosa, quindi alla fine una questione di preferenze personale.
Personalmente trovo che non sia una cattiva idea chiamare modello quello
che si usa come modello e documento quello che si modifica; mi sembra così
meno probabile che qualcuno modifichi o cancelli il modello, non sapendo o
non ricordando a che cosa serviva. Di più, così si ha disposizione il
modello anche per l'uso interattivo.
In ogni caso, mi è difficile pensare che questo possa avere qualcosa a che
fare con il problema segnalato.
Ciao.
scusate per il ritardo nella partecipazione, ma questi sono giorni fuoco.
Per fare chiarezza vi allego il codice qasi completo del mio procedimento,
purtroppo le cose sono complicate dal fatto che le operazioni ripetitive le
ho racchiuse in procedure, comunque se avete la pazienza...

Però voglio chiarire il punto 'fondamentale' : queste procedure funzionano
perfettamente in Office XP, tanto per dirimere i dubbi sul codice.
Inoltre credo che l'approccio Modello-->Documento, oltre a essere
formalmente esatto, vada visto nello scopo stesso di tutto questo :
permettere all'utente una revisione successiva di quanto creato, quindi
preferisco rilasciargli il Documento ed avere la certezza che non mi
'sconvolga' il Modello.
Altrimenti sarebbe stato identico stampare un bel report di Access, o meglio
un PDF così come sta facendo tuttora (però non può apportare nessuna
modifica).


-----------------
Private Sub bStampaWord_Click()
On Error GoTo Err_bStampaWord_Click
Dim MiaTabella
Dim RsStd As DAO.Recordset
Dim sSQL As String


Set oApp = CreateObject("Word.Application")
'..... renderò invisibile a test effettuati
oApp.Visible = True
'--------------- si comincia a pilotare

prendiDot "IlMioModello.dot" 'carica il modello in oApp
'============================================
'----------------- vedremo di limare un pò
sSQL = "select * from T_OFFERTA where id_off =" & IDOfferta
Set RsStd = CurrentDb.OpenRecordset(sSQL, dbOpenDynaset)

If Not RsStd.EOF Then
Select Case Lingua
Case "ITA"
strModTesta = RsStd("Testata_Ita")
strModCondVend = RsStd("Cond_Vend_Ita")
strModCompStd = RsStd("Compon_Ita")
strModCondComm = RsStd("Cond_Comm_Ita")
Case "ING"
strModTesta = RsStd("Testata_Ing")
strModCondVend = RsStd("Cond_Vend_Ing")
strModCompStd = RsStd("ComponetIng")
strModCondComm = RsStd("Cond_Comm_Ing")
Case Else
Stop
End Select
Else
Stop
End If
'-----------------
inserisci 'riempio i bookmarks fissi (intestazione ...)
'------------------
'creo la tabella per ogni articolo
'mi porto in fondo
oApp.ActiveDocument.Bookmarks("ElencoArticoli").Select

'creo il recordset e per ogni voce looppo con tabella e costo
'----i campi in chiaro si riferiscono alla maschera che ho aperta in
quel momento
'---- con la commessa già selezionata e visibile
sSQL = "SELECT T_ComposOfferta.IDOfferta, T_ComposOfferta.Ordine,
T_Anagrafica.Codmac, T_Anagrafica.Nomemac, T_ComposOfferta.DescrizioneBreve,
T_ComposOfferta.DescrizioneEstesa, T_Anagrafica.Descmac,
T_Anagrafica.Notemac, T_ComposOfferta.Prezzo, T_ComposOfferta.Optional,
Round(([prezzo]/(100- " & [Sconto] & _
"))/(100-" & [Provvigione] & ")*10000,0) AS Prezzo0,
T_ComposOfferta.Pos, T_Offerta.Testata_Ita, IIf([prezzo0] Mod
10=0,[prezzo0],Int([prezzo0]/10+1)*10) AS Prezzo1 " & _
"FROM (T_ComposOfferta INNER JOIN T_Anagrafica ON
T_ComposOfferta.Articolo = T_Anagrafica.Id) INNER JOIN T_Offerta ON
T_ComposOfferta.IDOfferta = T_Offerta.ID_Off " & _
"WHERE (((T_ComposOfferta.IDOfferta) Like '" & [IDOfferta] & "')
AND ((T_Anagrafica.Codmac) Not Like 'zucm*')) " & _
"ORDER BY T_ComposOfferta.Ordine;"

Set RsStd = CurrentDb.OpenRecordset(sSQL, dbOpenDynaset)
RsStd.MoveFirst

'... per ogni record del recordset
Do

'creo le prime due celle
Set MiaTabella =
oApp.ActiveDocument.Tables.Add(Range:=oApp.Selection.Range, NumRows:=1,
NumColumns:= _
2, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
wdAutoFitFixed)
For Each cella In MiaTabella.Columns
totale = totale + cella.Width
Next cella
totale = totale / 28.35
larghezzaPrimaCella = 2.5

'aggiusto larghezza celle

With MiaTabella
.Cell(1, 1).Range.Bold = True
.Cell(1, 1).Range.Font.Size = 8

LevaBordi (MiaTabella.Cell(1, 1))
.Cell(1, 1).SetWidth _
ColumnWidth:=CentimetersToPoints(larghezzaPrimaCella),
_
RulerStyle:=wdAdjustNone
.Cell(1, 1) = RsStd!Codmac
'--- - - - -
.Cell(1, 2).Range.Bold = False
.Cell(1, 2).Range.Font.Size = 10
LevaBordi (MiaTabella.Cell(1, 2))
.Cell(1, 2).SetWidth _
ColumnWidth:=CentimetersToPoints(Int(totale -
larghezzaPrimaCella)), _
RulerStyle:=wdAdjustNone
.Cell(1, 2) = RsStd!DescrizioneEstesa

'--- queste servono a qualcosa?
If .Style <> "Griglia tabella" Then
.Style = "Griglia tabella"
End If

.ApplyStyleHeadingRows = True
.ApplyStyleLastRow = True
.ApplyStyleFirstColumn = True
.ApplyStyleLastColumn = True
End With

'--- esco dalla tabella e vado in fondo
oApp.Selection.EndKey Unit:=wdStory

'---- inserisco i tabulatori
oApp.Selection.ParagraphFormat.TabStops.Add
Position:=CentimetersToPoints(9.84) _
, Alignment:=wdAlignTabLeft, Leader:=wdTabLeaderSpaces
oApp.Selection.ParagraphFormat.TabStops.Add
Position:=CentimetersToPoints(17.5 _
), Alignment:=wdAlignTabDecimal, Leader:=wdTabLeaderSpaces
oApp.Selection.TypeText _
Text:=vbTab & "Prezzo Cad ......." & _
vbTab & Format(RsStd!Prezzo1, "##,##0.00")
oApp.Selection.HomeKey Unit:=wdLine, Extend:=wdExtend
oApp.Selection.Font.Bold = True

'------ riga vuota
oApp.Selection.EndKey Unit:=wdStory

'----- traccio una riga di separazione
With oApp.Selection
.Borders(wdBorderTop).LineStyle = wdLineStyleNone
.Borders(wdBorderLeft).LineStyle = wdLineStyleNone
.Borders(wdBorderRight).LineStyle = wdLineStyleNone
.Borders(wdBorderBottom).LineStyle = wdLineStyleNone
End With
oApp.Selection.Borders(wdBorderBottom).LineStyle = wdLineStyleSingle
'--- vado a capo
oApp.Selection.EndKey Unit:=wdStory

Set MiaTabella = Nothing
RsStd.MoveNext

Loop While Not RsStd.EOF
Set oApp = Nothing
'============================================
Exit_bStampaWord_Click:
Exit Sub

Err_bStampaWord_Click:
MsgBox Err.Description

Stop
Resume Next
Resume Exit_bStampaWord_Click

End Sub

--------------------------
Sub inserisci()

'------------- testata
AggiornaBmk _
"testaOffertaNr", NROfferta '"@@@@"
AggiornaBmk _
"testaLayoutNr", Layout2 '"@@@@"
AggiornaBmk _
"testaData", Date '"@@@@"

'------------- spettabile
AggiornaBmk _
"spettCliente", Cliente '"@@@@"
AggiornaBmk _
"spettIndirizzo", Indirizzo1 '"@@@@"
AggiornaBmk _
"spettCAP", Cap '"@@@@"
AggiornaBmk _
"spettCitta", Citta '"@@@@"
AggiornaBmk _
"spettStato", Stato '"@@@@"
'------------- datiDiprogetto
AggiornaBmk _
"datiDiProgetto", strModTesta


End Sub
-------------------
Sub AggiornaBmk(nomeBook As String, stesto As String)
'Dim bkm As Bookmark, rngBmk As Range
Dim bkm As Variant, rngBmk As Variant

Dim nameBmk As String

Set bkm = oApp.ActiveDocument.Bookmarks(nomeBook)
Set rngBmk = bkm.Range
nameBmk = bkm.Name

rngBmk.Text = stesto

'oApp.ActiveDocument.Bookmarks.Add nameBmk, rngBmk

End Sub
---------------------
Sub prendiDot(sFile As String)
'
' prendiDot Macro
' Macro registrata il 11/8/2006 da ivan
'
'Stop
oApp.Documents.Add Template:= _
"C:\id Ivan\" & sFile _
, NewTemplate:=False, DocumentType:=0
'oApp.Documents.Add Template:= _
"C:\Documents and Settings\HP_Administrator\Dati
applicazioni\Microsoft\Modelli\" & sFile _
, NewTemplate:=False, DocumentType:=0
End Sub
=================

capisco che il tutto sia un pò lunghino, ma il problema è all'inizio (su
Of2003) quando provo di inserire la prima cosa in oApp, errore e nella GUI
di Word non è ancora caricato nulla.

IvanDaBologna
Giovanni Zezza
2006-09-30 07:55:08 UTC
Permalink
Post by Ivan
'creo la tabella per ogni articolo
'mi porto in fondo
oApp.ActiveDocument.Bookmarks("ElencoArticoli").Select
Eccolo lì. Fammi il favore, prova:

Set documento = oApp.Documents.Add(Template:= _
"C:\id Ivan\" & sFile _
, NewTemplate:=False, DocumentType:=0)

documento.Bookmarks("ElencoArticoli").Select

Eventualmente, trasforma prendiDot in funzione, in modo che
restituisca il documento.

Magari non cambia niente, ma io mi sentirei più tranquillo: un
documento può esistere e non essere il documento attivo, e non mi
risulta documentato che Documents.Add renda attivo il nuovo documento
creato. Questa potrebbe appunto essere la differenza tra la versione
XP e quella 2003.

Inoltre, così è più semplice, in fase di debug, capire che cosa
succede: se documento ha un valore vuol dire che è stato
effettivamente creato, altrimenti no (di nuovo, mi sembra che non
venga detto niente nella documentazione sul fallimento di
Documents.Add, potrebbe quindi fallire silenziosamente, senza generare
errori).

Ciao.
Ivan
2006-09-30 08:52:59 UTC
Permalink
Post by Giovanni Zezza
Post by Ivan
'creo la tabella per ogni articolo
'mi porto in fondo
oApp.ActiveDocument.Bookmarks("ElencoArticoli").Select
Set documento = oApp.Documents.Add(Template:= _
"C:\id Ivan\" & sFile _
, NewTemplate:=False, DocumentType:=0)
documento.Bookmarks("ElencoArticoli").Select
Eventualmente, trasforma prendiDot in funzione, in modo che
restituisca il documento.
Magari non cambia niente, ma io mi sentirei più tranquillo: un
documento può esistere e non essere il documento attivo, e non mi
risulta documentato che Documents.Add renda attivo il nuovo documento
creato. Questa potrebbe appunto essere la differenza tra la versione
XP e quella 2003.
Inoltre, così è più semplice, in fase di debug, capire che cosa
succede: se documento ha un valore vuol dire che è stato
effettivamente creato, altrimenti no (di nuovo, mi sembra che non
venga detto niente nella documentazione sul fallimento di
Documents.Add, potrebbe quindi fallire silenziosamente, senza generare
errori).
Ciao.
ok riesco a trsformare PrendiDOT in funzione, ma come le faccio restituire
Vero o Falso ? a cosa lego ? (mi manca ... questo passaggio! carenze mie!)

Public Function PrendiDot(sFile As String) as Boolean
'

oApp.Documents.Add Template:= _
"C:\id Ivan\" & sFile _
, NewTemplate:=False, DocumentType:=0

PrendiDot = ???????? (aiuto?)<<<<

End Function

non vedo a cosa potrei legarlo (il metodo Add restituisce qualcosa?)

IvanDaBologna
Giovanni Zezza
2006-10-01 07:59:39 UTC
Permalink
Post by Ivan
ok riesco a trsformare PrendiDOT in funzione, ma come le faccio restituire
Vero o Falso ? a cosa lego ? (mi manca ... questo passaggio! carenze mie!)
...
non vedo a cosa potrei legarlo (il metodo Add restituisce qualcosa?)
Perché "Vero o Falso"? e come "il metodo Add restituisce qualcosa?",
te l'ho scritto tre volte che restituisce un oggetto Document.

Io dicevo di fare restituire a PrendiDot l'oggetto Document restituito
da Documents.Add.

PrendiDot = oApp.Documents.Add(Template:= _
"C:\id Ivan\" & sFile _
, NewTemplate:=False, DocumentType:=0)

M'è venuto in mente perché nel codice fai:

prendiDot "IlMioModello.dot

e quindi:

oApp.ActiveDocument.Bookmarks("ElencoArticoli").Select

e diventa semplice trasformarli in:

Set documento = prendiDot("IlMioModello.dot")
....
documento.Bookmarks("ElencoArticoli").Select

Poi, in fase di debug, controllerai (dal browser degli oggetti o che
so io) che cosa effettivamente contiene documento e se l'operazione è
andata a buon fine. Se non va a buon fine (e se dici che la finestra
di Word è vuota, il sospetto è che non ci vada), resta da capire
perché.

...e magari non se ne esce lo stesso, ma come ho detto non ho altre
idee da suggerirti.

Ciao.
Ivan
2006-10-01 16:16:31 UTC
Permalink
Post by Giovanni Zezza
Post by Ivan
ok riesco a trsformare PrendiDOT in funzione, ma come le faccio restituire
Vero o Falso ? a cosa lego ? (mi manca ... questo passaggio! carenze mie!)
...
non vedo a cosa potrei legarlo (il metodo Add restituisce qualcosa?)
Perché "Vero o Falso"? e come "il metodo Add restituisce qualcosa?",
te l'ho scritto tre volte che restituisce un oggetto Document.
Io dicevo di fare restituire a PrendiDot l'oggetto Document restituito
da Documents.Add.
PrendiDot = oApp.Documents.Add(Template:= _
"C:\id Ivan\" & sFile _
, NewTemplate:=False, DocumentType:=0)
prendiDot "IlMioModello.dot
oApp.ActiveDocument.Bookmarks("ElencoArticoli").Select
Set documento = prendiDot("IlMioModello.dot")
....
documento.Bookmarks("ElencoArticoli").Select
Poi, in fase di debug, controllerai (dal browser degli oggetti o che
so io) che cosa effettivamente contiene documento e se l'operazione è
andata a buon fine. Se non va a buon fine (e se dici che la finestra
di Word è vuota, il sospetto è che non ci vada), resta da capire
perché.
...e magari non se ne esce lo stesso, ma come ho detto non ho altre
idee da suggerirti.
Ciao.
urca! io non avevo pensato che una funzione potesse restituirmi l'oggetto!
(veramente questo uso proprio non l'ho mai considerato!! )

per ora non posso testare, ma domani sicuramente vi dò un riscontro.
Vi ringrazio per l'attenzione e mi spiace di aver scatenato qualche
polemica.. ;))


IvanDaBologna
Sergio MAZZA
2006-10-01 18:03:51 UTC
Permalink
Post by Ivan
per ora non posso testare, ma domani sicuramente vi dò un riscontro.
Vi ringrazio per l'attenzione e mi spiace di aver scatenato qualche polemica.. ;))
IvanDaBologna
(giusto per precisare) Non faccio mai polemica; quando si scrive è difficile far capire il proprio stato d'animo...

Ciao.
--
Sergio MAZZA
Ivan
2006-10-02 11:22:32 UTC
Permalink
[cut]
Post by Giovanni Zezza
PrendiDot = oApp.Documents.Add(Template:= _
"C:\id Ivan\" & sFile _
, NewTemplate:=False, DocumentType:=0)
prendiDot "IlMioModello.dot
oApp.ActiveDocument.Bookmarks("ElencoArticoli").Select
Set documento = prendiDot("IlMioModello.dot")
....
documento.Bookmarks("ElencoArticoli").Select
Poi, in fase di debug, controllerai (dal browser degli oggetti o che
so io) che cosa effettivamente contiene documento e se l'operazione è
andata a buon fine. Se non va a buon fine (e se dici che la finestra
di Word è vuota, il sospetto è che non ci vada), resta da capire
perché.
...e magari non se ne esce lo stesso, ma come ho detto non ho altre
idee da suggerirti.
Ciao.
la soap continua... oggi ho provato a riadattare il codice in XP per
presentarmi con un canovaccio sicuramente funzionante, ma ho qualche
problema.
Invece che prendiDOT (per lasciare la sub ad altri scopi) ho istanziato un
oggetto oApp2 che se non vado errato è di tipo Documento ... ?
Stavolta tutto va a buon fine fino al punto in cui chiamo ..:

'--- esco dalla tabella
oApp2.Selection.EndKey Unit:=wdStory

questa non gli và giù, mi rende un 'errore :

'Proprietà o metodo non supportati dall'oggetto'

e qui mi sono perso. La proprietà Selection sembra andargli di traverso ...
ma come uso l'oggetto se non come un Documento? il Documento (guida alla
mano) ha la proprietà Selection ... un piccolo lume e torno alla spiaggia da
solo, promesso!

Prima di questo altri metodi vanno a buon fine :
*)la creazione della tabella

Set MiaTabella = oApp2.Tables.Add(Range:=oApp.Selection.Range,
NumRows:=1, NumColumns:= _
2, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
wdAutoFitFixed)

*) l'assegnazione di valori ai Bookmark

Dim bkm As Variant, rngBmk As Variant
Dim nameBmk As String

'Set bkm = oApp.ActiveDocument.Bookmarks(nomeBook)
Set bkm = oApp2.Bookmarks(nomeBook)
Set rngBmk = bkm.Range
nameBmk = bkm.Name

rngBmk.Text = stesto

... insomma tutto sembrava andare a gonfie vele. Probabilmente l'oggetto che
sto pilotando ora non è l'applicazione Word ma un suo Documento ... ma come
faccio a definire quali metodi(o proprietà) sono leciti e quali no ?

forse alla proprietà Selection devo anteporre AciveDocument ?

(scusate ma l'architettura di word mi sembra eccessivamente complicata e
variegata ... !!)

IvanDaBologna
Giovanni Zezza
2006-10-02 13:55:07 UTC
Permalink
Post by Ivan
Invece che prendiDOT (per lasciare la sub ad altri scopi) ho istanziato un
oggetto oApp2 che se non vado errato è di tipo Documento ... ?
Lo chiedi a me? l'identificatore è tuo, la procedura che lo istanzia
pure... saprai tu che cos'è!

Se lo istanzi come hai fatto precedentemente con oApp, comunque, no, non è
un Document, è un Application. Se lo istanzi con un metodo che resituisce
un oggetto Document, ovviamente allora è un Document, ma... perché l'hai
chiamato "App"? insomma, non ho capito da dove salti fuori questo oApp2,
sicché non so dire che cosa sia.
Post by Ivan
e qui mi sono perso. La proprietà Selection sembra andargli di traverso ...
ma come uso l'oggetto se non come un Documento? il Documento (guida alla
mano) ha la proprietà Selection
No, Document NON ha la proprietà Selection. La proprietà Selection si
applica a: Application, Global, Pane, Window.

Io userei un Range (da Document.Range), ma dopo non puoi usare il metodo
EndKey (per Range esiste una serie di metodi Move* per ottenere lo stesso
effetto). Se invece vuoi continuare ad usare Selection, puoi ottenerlo
dalla finestra attiva (Document.ActiveWindow.Selection) o dall'insieme
Windows (Document.Windows(1).Selection).
Post by Ivan
... insomma tutto sembrava andare a gonfie vele. Probabilmente l'oggetto che
sto pilotando ora non è l'applicazione Word ma un suo Documento ... ma come
faccio a definire quali metodi(o proprietà) sono leciti e quali no ?
Guardando con più attenzione il modello ad oggetti di Word.
Post by Ivan
(scusate ma l'architettura di word mi sembra eccessivamente complicata e
variegata ... !!)
Può darsi che sia più complicata del necessario, e meno logica di quanto si
potrebbe fare, ma non è poi intrattabile, ci vuole giusto un po' di
pazienza.

Ciao.
Ivan
2006-10-02 19:09:30 UTC
Permalink
[CUT]
Post by Giovanni Zezza
Lo chiedi a me? l'identificatore è tuo, la procedura che lo istanzia
pure... saprai tu che cos'è!
Se lo istanzi come hai fatto precedentemente con oApp, comunque, no, non è
un Document, è un Application. Se lo istanzi con un metodo che resituisce
un oggetto Document, ovviamente allora è un Document, ma... perché l'hai
chiamato "App"? insomma, non ho capito da dove salti fuori questo oApp2,
sicché non so dire che cosa sia.
[CUT]
Post by Giovanni Zezza
No, Document NON ha la proprietà Selection. La proprietà Selection si
applica a: Application, Global, Pane, Window.
Io userei un Range (da Document.Range), ma dopo non puoi usare il metodo
EndKey (per Range esiste una serie di metodi Move* per ottenere lo stesso
effetto). Se invece vuoi continuare ad usare Selection, puoi ottenerlo
dalla finestra attiva (Document.ActiveWindow.Selection) o dall'insieme
Windows (Document.Windows(1).Selection).
[CUT]
Post by Giovanni Zezza
Guardando con più attenzione il modello ad oggetti di Word.
[CUT]
Post by Giovanni Zezza
Può darsi che sia più complicata del necessario, e meno logica di quanto si
potrebbe fare, ma non è poi intrattabile, ci vuole giusto un po' di
pazienza.
Ciao.
bhè giusto per chiudere l'argomento (o il 3D) :


Set oApp = CreateObject("Word.Application")
oApp.Visible = True
'--------------- si comincia a pilotare

'prendiDot "testaOffertaZucchini.dot"
Set oApp2 = oApp.Documents.Add(Template:= _
"C:\id Ivan\" & "testaOffertaZucchini.dot" _
, NewTemplate:=False, DocumentType:=0)

così a prima vista è difficile capire cosa ho istanziato, adesso che ci
guardo è un documento!


comunque grazie per le grandissime dritte.

IvanDaBologna
Ivan
2006-10-02 19:15:06 UTC
Permalink
[cut]
Post by Giovanni Zezza
Lo chiedi a me? l'identificatore è tuo, la procedura che lo istanzia
pure... saprai tu che cos'è!
Se lo istanzi come hai fatto precedentemente con oApp, comunque, no, non è
un Document, è un Application. Se lo istanzi con un metodo che resituisce
un oggetto Document, ovviamente allora è un Document, ma... perché l'hai
chiamato "App"? insomma, non ho capito da dove salti fuori questo oApp2,
sicché non so dire che cosa sia.
[cut]
Post by Giovanni Zezza
No, Document NON ha la proprietà Selection. La proprietà Selection si
applica a: Application, Global, Pane, Window.
Io userei un Range (da Document.Range), ma dopo non puoi usare il metodo
EndKey (per Range esiste una serie di metodi Move* per ottenere lo stesso
effetto). Se invece vuoi continuare ad usare Selection, puoi ottenerlo
dalla finestra attiva (Document.ActiveWindow.Selection) o dall'insieme
Windows (Document.Windows(1).Selection).
[cut]
Post by Giovanni Zezza
Guardando con più attenzione il modello ad oggetti di Word.
Post by Ivan
(scusate ma l'architettura di word mi sembra eccessivamente complicata e
variegata ... !!)
Può darsi che sia più complicata del necessario, e meno logica di quanto si
potrebbe fare, ma non è poi intrattabile, ci vuole giusto un po' di
pazienza.
Ciao.
ho seguito la strada meno invasiva :

Set oApp = CreateObject("Word.Application")
oApp.Visible = True
'--------------- si comincia a pilotare

'prendiDot "testaOffertaZucchini.dot"
Set oApp2 = oApp.Documents.Add(Template:= _
"C:\id Ivan\" & "testaOffertaZucchini.dot" _
, NewTemplate:=False, DocumentType:=0)

però a questo punto non avevo capito che ho creato un Documento e che questo
fa a pugni con il codice che riesco ad ottenere dal registratore di macro.

Comunque grazie per avermi portato moooolto avanti nella soluzione del
problema.
Dedicherò i prossimi tempi allo studio del modello oggetti di Word.


IvanDaBologna
Ivan
2006-10-03 06:28:07 UTC
Permalink
[cut]
Post by Giovanni Zezza
Io userei un Range (da Document.Range), ma dopo non puoi usare il metodo
EndKey (per Range esiste una serie di metodi Move* per ottenere lo stesso
effetto). Se invece vuoi continuare ad usare Selection, puoi ottenerlo
dalla finestra attiva (Document.ActiveWindow.Selection) o dall'insieme
Windows (Document.Windows(1).Selection).
[cut]

Document.ActiveWindow.Selection !!!!!!

ottimo, la strada con meno modifiche (basta copincollare ActiveWindow. e
tutto torna a posto.
Grazie davvero per i consigli.


IvanDaBologna

Sergio MAZZA
2006-09-30 12:40:56 UTC
Permalink
Post by Giovanni Zezza
D'accordo, ma in che cosa sarebbe "più semplice"? a me sembra identicamente
la stessa cosa, quindi alla fine una questione di preferenze personale.
Probabilmente, sì; hai ragione.
Post by Giovanni Zezza
In ogni caso, mi è difficile pensare che questo possa avere qualcosa a che
fare con il problema segnalato.
Non ho mai pensato fosse quello il motivo scatenante il problema...
Post by Giovanni Zezza
Ciao.
Ciao.
--
Sergio MAZZA
Loading...