Newsgroup: it.comp.appl.access
Titolo: Gestire documenti word 2007 con VBA Access 2007

Vorrei aprire un documento modello di Word 2017 con dei segnalibro, cercare i segnalibro, inserire testi e/o numeri e salvare il documento con un altro nome.
Sono sicuro che è possibile ma non so come fare; mi servirebbe un codice che fa questo.


Certo che si puo' fare ma e' un pochino piu' problematico che non un 
normale processo di sostituzione di stringhe. 
 
Ossia per es. questa mia routine : 
 
Public Function WORD_REPLACE( _
                             ByRef Word As Word.Application, _
                             ByRef RC_Input As ADODB.Recordset, _
                             ByRef Nome_Doc_Completo_IN As String _
                             )  _
                             As Word.Document
 
 
Dim L            As Long
Dim CN As Long, Sn As Long, Rn As Long
Dim objSelection As Object
Dim objDoc       As Object
Dim X            As String
Dim y            As String
 
 
Set objDoc = Word.Documents.Open(Nome_Doc_Completo_IN)
Set objSelection = Word.Selection
 
RC_Input.MoveFirst
Do While Not RC_Input.EOF
   X = RC_Input("nome_").Value & "":       X = "{" & Trim(X) & "}"
   y = RC_Input("contenuto").Value & "":   y = Trim(y)
 
   objSelection.Find.Text = X
   objSelection.Find.Forward = True
   objSelection.Find.MatchWholeWord = True
   objSelection.Find.Replacement.Text = y
   objSelection.Find.Execute , , , , , , , , , , wdReplaceAll
   RC_Input.MoveNext
Loop
Set WORD_REPLACE = objDoc
FINE:
 
End Function
 
Funziona benissimo e velocemente, purche' il recordset che gli 
passi non sia vuoto. Ma  un controllino aggiuntivo ce lo metti 
facilmente. 
 
 


lui chiede di cercare dei segnalibri e metterci del testo...non di fare 
il replace di stringhe
 
il codice corretto è:
 
 
	     Dim objWord As Object
              Set objWord = CreateObject("Word.Application")
 
 
                 objWord.Visible = True
 
                 ' apro il documento
                 objWord.Documents.Open  "c:\tuofile.doc"
 
                 'cerco il segnalibro chiamato pippo
                 objWord.ActiveDocument.Bookmarks("pippo").Select
 
		'ci salvo il mio valore pluto
                 objWord.Selection.Text = "pluto"
 
 
            'salvo
              objWord.ActiveDocument.SaveAs "prova"
 
              Set objWord = Nothing
 
 
ciao
BFS
 
 

  objWord.ActiveDocument.Bookmarks("pippo").Select
 
E se pluto deve andare in pippo, topolino e paperino ti tocca scrivere
un ciclo. E se  e'  variabile  la  lunghezza  di  questo ciclo ? Altra 
complicazione
 
In ogni caso ottieni una routine fortemente dipendente dai dati. Ed e'
anche piu' lenta. Non e' l' ottimo. 
 
Io  (umilmente parlando)  penso  che  a coloro  che vengono a chiedere 
bisognerebbe anche spiegare qual' e' la  via  migliore per ottenere lo
stesso  risultato  e  non  solo  fornirgli  la  soluzione che chiedono. 
 
Ma e' opinabile questo punto di vista, mi rendo conto.
 
Ciao

 Sono sicuro che è possibile ma non so come fare; mi servirebbe un codice che fa questo.
 
Vi ringrazio per l'aiuto; ho scelto la soluzione BFS in quanto era esattamente quello che volevo fare e l'ho capita.  Utilizzo da anni il corrispondente sistema per gestire fogli Excel e mi sono sempre trovato a meraviglia.
Ho realizzato la routine evento che funziona alla perfezione e che riporto di seguito come esempio se qualcuno, avendo un problema simile, volesse approfittarne:
Private Sub Comando1700_Click()
' ******************************************
' *** Stampa Etichetta Classe Energetica ***
' ***    Release 01.00 del 24/01/2015    ***
' ******************************************
 
On Error GoTo Err_Comando48_Click
 
 
   Dim lonNRec As Long
   Dim intDev As Integer
   Dim strInput As String
 
   Dim objWord As Object
 
   Set objWord = CreateObject("Word.Application")
 
   pstrCodA = EnergyClass
   pstrCodB = EC
   pstrCodC = CodArt
   If Len(pstrCodA) >= 1 And pstrCodB > 0 Then
      objWord.Visible = False
      If Apparecchio Then
         objWord.Documents.Open "F:\ClassiEner\Etichetta_Classe_A++.docx"
         strInput = "F:\ClassiEner\Etichetta_Classe_Apparecchi.docx"
      Else
         Select Case pstrCodA
             Case "A++"
                  objWord.Documents.Open "F:\ClassiEner\Etichetta_Classe_A++.docx"
                  strInput = "F:\ClassiEner\Etichetta_Classe_A++.docx"
             Case "A+"
                  objWord.Documents.Open "F:\ClassiEner\Etichetta_Classe_A+.docx"
                  strInput = "F:\ClassiEner\Etichetta_Classe_A+.docx"
             Case "A"
                  objWord.Documents.Open "F:\ClassiEner\Etichetta_Classe_A.docx"
                  strInput = "F:\ClassiEner\Etichetta_Classe_A.docx"
             Case "B"
                  objWord.Documents.Open "F:\ClassiEner\Etichetta_Classe_B.docx"
                  strInput = "F:\ClassiEner\Etichetta_Classe_B.docx"
             Case "C"
                  objWord.Documents.Open "F:\ClassiEner\Etichetta_Classe_C.docx"
                  strInput = "F:\ClassiEner\Etichetta_Classe_C.docx"
             Case "D"
                  objWord.Documents.Open "F:\ClassiEner\Etichetta_Classe_D.docx"
                  strInput = "F:\ClassiEner\Etichetta_Classe_D.docx"
             Case "E"
                  objWord.Documents.Open "F:\ClassiEner\Etichetta_Classe_E.docx"
                  strInput = "F:\ClassiEner\Etichetta_Classe_E.docx"
         End Select
      End If
      objWord.ActiveDocument.Bookmarks("CodArt").Select
      objWord.Selection.Text = pstrCodC
      objWord.ActiveDocument.Bookmarks("Ec").Select
      objWord.Selection.Text = pstrCodB
      Set objWord = Nothing
      Application.FollowHyperlink strInput
   Else
      MsgBox "Uno dei campi per la stampa dell'Etichetta è vuoto !!!"
      Exit Sub
   End If
Exit_Comando48_Click:
    Exit Sub
 
Err_Comando48_Click:
    MsgBox Error$
      Set objWord = Nothing
    Resume Exit_Comando48_Click
 
End Sub
 


e quindi MS ha inventato i segnalibri per nulla?
la tua soluzione del sostituire stringhe è molto pericolosa e te lo 
dimostro con un assurdo
 
supponiamo che tu metti [pippo]  e [pluto] nel tuo foglio word come 
normali scritte al posto di segnalibro per poi andarle a sostituire
 
se per assurdo il tuo recordset dice di sostituire
[pippo] con la scritta [pluto] per assurdo
e
[pluto] con topolino
 
al secondo passaggio il tuo codice va a sostituire anche la stringa 
[pluto] che doveva rimanere tale in quanto aveva sostituito la stringa 
[pippo]
 
ti ritrovi con il foglio word con scritto due volte topolino quando 
invece doveva essere [pluto] sul primo  e topolino sul secondo
 
 
 
ciao
BFS
 
 
 
 
 
 

 invece doveva essere  [pluto] sul primo  e topolino sul secondo
 
Giustissimo,
ma  qui  ci  sarebbe  dietro  una  scelta sbagliata  del  programmatore. 
I  campi da  sostituire non debbono mai  essere costituiti  da  istanze 
concrete di nomi o  cose, ma sempre da  denominazioni  di  famiglie  di 
nomi o cose.
 
Ossia ad es.
[nome], [cognome], [indirizzo] e  non 
[marco], [rossi], [via dei meli]
 
Con  una  buona scelta  dei  nomi  il  rischio che citi praticamente si 
azzera. 


 
punti di vista...
io se devo sviluppare codice che mi dia la certezza che quella esatta 
parola vada in quel esatto posto uso i segnalibri.
così non devo scervellarmi a inventare stringhe assurde da andare a 
sostituire per non correre il rischio del mio esempio.
se devo compilare un word di una pratica di un notaio o un manuale 
tecnico di un macchinario "salvavita" voglio dormire tranquillo che il 
mio codice abbia scritto esattamente nel punto richiesto quello che 
voglio. Le parentesi graffe che hai usato tu per limitare le possibilità 
non sono cosi poco diffuse come tu immagini quando si parla di 
manualistica tecnica.
 
 
il tuo codice non esclude questo rischio.
una "sfigata" sequenza delle tue sostituzioni "potrebbe" generare una 
stringa che è soggetta ad ulteriore sostituzione involontaria che non 
dovrebbe avvenire
Ovvio che se uso questo codice per stampare etichette per biscotti il 
rischio di un errore può anche essere irrilevante.
 
Il mio codice non ha bug. Il tuo "potenzialmente" si.
 
 
ciao
BFS
 
 
 
 

 Il mio codice non ha bug. Il tuo "potenzialmente" si.
 
Ma un codice non puo' essere valutato solo dal punto di vista dei
potenziali bugs, come sai meglio  di me. Sono rilevanti anche una 
serie  di  altri  fattori come  riutilizzabilita',  facilita'  di 
manutenzione, chiarezza ecc ecc specie se lavori con altri. 
 
E se la probabilita' che si verifichi un bug viene ridotta  quasi
a zero (come t' ho mostrato) le altre  considerazioni  dovrebbero 
prevalere.
 
Prendi  ad  esempio la generazione di numeri casuali : mi insegni
che una  macchina  non puo' produrre davvero numeri *casuali* nel
senso matematico che questo concetto dovrebbe avere. 
 
Ne segue che in teoria 
- si possono prevedere
- si possono ripetere (anche se fossero davvero casuali)
 
Eppure  si usano e  perche' ? Perche'  la probabilita' di quegli 
eventi e' bassissima in confronto ai vantaggi : eppure anch'essi 
presentano un (diciamo) "bug potenziale". 
 


scusa ma dopo questa affermazione mi son fermato
"Ma un codice non puo' essere valutato solo dal punto di vista dei
potenziali bugs, come sai meglio  di me."
 
la vediamo in modo diverso
io prima penso a tutti i possibili bug che un codice può avere e a tutti 
i possibili errori che può fare l'utilizzatore (molti sono peggio di 
scimmie) e poi penso al resto.
sarà che faccio molti programmi di contabilità e programmi per settori 
che trattano merce pericolose, dove un bug del codice può creare 
problemi che non finisco a tarallucci e vino
la chiudo qui
 
ciao
BFS
 
 

 scimmie) e poi penso al resto.
 
Sei  molto  "rigido" (nel  senso  che  ragioni  in  modo molto "netto", 
bianco o nero).  
 
certo  e'  che  se  la stesura del documento word la dai in  mano agli 
utenti allora cambia tutto.
 
In *quel* caso anche io  propenderei  ad  usare i segnalibro. Ma e' un 
falso problema perche' la vedo dura far gestire ad un utente "scimmia"
un processo come quello. Impensabile. 
 
Ne segue che la  stesura del/dei documento/i deve essere IN OGNI CASO 
lasciato ad un  individuo competente che sa quello che fa.
 
E  allora  ecco  che la tua tesi cade e diventa rilevante quello che 
t' ho scritto e che hai saltato.