Newsgroup: it.comp.lang.visual-basic
Titolo: I: interagire un prg vb con word

 Il mio problema è questo:
 Devo utilizzare word per stampare un documento pre-creato ed inserire dei
 dati presi dal mio programma in tale documento.
 C'è nessuno che sa spiegarmi come posso fare ????
 Ringrazio anticipatamente
 Daniele
                                  | ' ' ' |
                                (@ @)
 +--------oOOO---------(_)----------------------------+
 |               Messaggio inviato da                      |
 |                        -baidan-                                    |
 |                     Baini Daniele                              |
 |                 
bai...@technet.it
                          |
 +--------------------------------------oOOO-----------+
                             |   |    |
                             |__|__|
                            (__)(__)

  Allora, un bel respiro profondo e... VIA! (:-))
   Se quello che devi fare e' inserire, togliere, modificare, ecc., parti di
un documento che possono variare di volta in volta, o la cui presenza (o
valore) e' determinata dal valore di determinati parametri, allora posso
esserti d'aiuto descrivendoti il procedimento che utilizzo io in questi
casi.
   Invece, se quello che ti serve e' scrivere un documento che sia sempre
uguale nella forma ed in cui gli unici elementi destinati a cambiare siano
nomi, indirizzi, numeri, ecc. contenuti in un db (che puo' essere di testo,
Access, un foglio di Excel, ...) come, ad ex. una lettera o un modulo
precompilato, allora ti conviene utilizzare i Campi Unione descritti nella
guida in linea di Word.
OSS: Per poter utilizzare Proprietà e Metodi degli Oggetti messi a
disposizione da Word97 in VB, e' necessario referenziare la libreria Word8
agendo mediante l'apposita finestra (Progetto/Riferimenti) richiamabile
dall'IDE di VB.
   Nel primo caso, sostanzialmente, il da farsi e':
1. contrassegnare il punto del documento nel quale effettuare le modifiche;
2. effettuare le modifiche. (!)
   Per fare cio', di solito, utilizzo due procedimenti diversi (ma che
possono essere usati assieme), uno che fa uso dell'oggetto Selection, un
altro che fa uso degli oggetti Range e Bookmarks.
   Partiamo subito con un esempio:
   Supponiamo di avere creato, nella directory dei modelli (.dot) di Word97,
un modello chiamato 'ModelloBase.dot' fatto in questo modo:
   *------------------------------------------------------------------*
   |                            TITOLO                                !
   |                                                                  !
   |  Egregio %%NomeCognome%%,                                        |
   |                                                                  |
   |  %%Frase1%%, ...., i seguenti prodotti:                          |
   |                                                                  |
   | 1. ]bkmElencoProdotti[                                           |
   |                                                                  |
   |  %%Frase2%%                                                      |
   |  %%Frase3%%                                                      |
   !                                                                  |
   *------------------------------------------------------------------*
   I punti in cui inserire (o in cui modificare) parti di testo saranno
quelli contrassegnati dai segnalibri (il cui nome ho indicato tra le
parentesi][) e dalle parole chiave (di mia invenzione) racchiuse tra i
simboli %% e %%.
   Ed ora un po' di codice! ;-)
   Dopo aver inserito un riferimento alla libreria Word8 Object Library,
creiamo un programmino VB di questo
genere:
Option Explicit
' Dichiaro delle variabili globali che, anche se orribili
' a vedersi :-), serviranno (spero) a render piu' chiaro
' l'ex.
Dim sFrase1 As String, sFrase2 As String, sFrase3 As String
Dim sNomeCognome As String, sElencoProd As String
Dim sNomeDoc As String
 :
 :
Private Sub cmdProva_Click()
 sNomeCognome = "Mario Rossi"
 sFrase1 = "Questa è la frase 1"
 sFrase2 = "Questa è la frase 2"
 sFrase3 = "Questa è la frase 3"
 sElencoProd = "Prodotto1," & vbCrLf & "Prodotto2," & vbCrLf & "Prodotto3."
 sNomeDoc = "SoloUnaProva"
 Call Scrivi
End Sub
Private Sub Scrivi()
' by Simone Falchetti Falc...@Yahoo.com
' Un ringraziamento a G.Cannalire e alla ML VB-T&T
(
http://www.beginend.com/vbasic
)
' senza i quali starei ancora cercando di controllare Word97 via ESP (invece
che
' via OLE :-) )
' Dichiaro gli oggetti che andro' ad utilizzare.
    Dim wrdApp As Word.Application
    Dim wrdDoc As Word.Document
    Dim wrdRng As Word.Range
    Dim wrdSel As Word.Selection
    Dim wrdBkm As Word.Bookmark
    Set wrdApp = New Word.Application
' Rendo visibile l'instanza
    wrdApp.Visible = True
' e la massimizzo (l'effetto visivo del documento di Word97 che si
autocompila
' fa molto colpo sugli osservatori digiuni di informatica, cio' vi fara'
' guadagnare, tra essi, una fama imperitura; :-) solo fama, niente soldi!
<:-( )
    wrdApp.WindowState = wdWindowStateMaximize
' Apro il modello
    wrdApp.Documents.Add Template:="ModelloBase.dot" ' oppure
Name:="Nomefile.doc"
    Set wrdDoc = wrdApp.Documents(1)
    Set wrdSel = wrdApp.Selection
    Set wrdRng = wrdApp.ActiveDocument.Content
' Incomincio a sostituire...
        wrdRng.Find.Execute FindText:="%%Frase1%%", _
                            ReplaceWith:=sFrase1, Replace:=wdReplaceAll
                    :
        wrdDoc.Bookmarks("ElencoProdotti").Select
        wrdSel.InsertAfter Text:=sElencoProd
                    :
        wrdRng.Find.Execute FindText:="%%Frase2%%", _
                            ReplaceWith:=sFrase2, Replace:=wdReplaceAll
        wrdRng.Find.Execute FindText:="%%Frase3%%", _
                            ReplaceWith:=sFrase3, Replace:=wdReplaceAll
                    :
                    :
' Salvo il documento...
    wrdDoc.SaveAs sNomeDoc
    ' NB: il DoEvents seguente e' NECESSARIO!
    DoEvents
' e lo chiudo
    wrdDoc.Close
    wrdApp.Quit
' disalloco tutte le variabili istanziate
    Set wrdBkm = Nothing
    Set wrdRng = Nothing
    Set wrdSel = Nothing
    Set wrdDoc = Nothing
    Set wrdApp = Nothing
End Sub
   Alcune osservazioni:
- Utilizzare l'oggetto Selection nel modo sopra esposto, e' equivalente ad
utilizzare lo strumento 'Trova e Sostituisci' di Word97. --> Questo comporta
anche il fatto che la stringa sostituente (sFrase<n> nell'ex) non puo'
essere piu' lunga di 255 caratteri (pena la comparsa di un messaggio di
errore). Ricorrendo, invece, al metodo Execute dell'ogetto wrdRng.Field non
si incorre in questa limitazione (anche se, ma questa e' solo un'opinione
personale, la gestione di un insieme di segnalibri in un documento che
occorre modificare frequentemente, e' piuttosto pesante).
- Se si esegue l'installazione 'Personalizzata' di Office97 (o di Word97) e'
possibile installare anche la guida di VBA per Word97. Da questa,
indispensabile per imparare a pilotare Word via VBA, si capisce quento
potente e complessa sia la struttura ad oggetti di Word, credo sia
impossibile apprenderla appieno in breve tempo, tuttavia se, come nel mio
caso, l'uso che si deve fare dell'automazione VBA non e' troppo complesso,
lo strumento delle Macro si rivela un aiutante formidabile. Una volta
impratichitisi con l'uso dei principali oggetti di Word, capita piu' o meno
la sua filosofia di funzionamento, registrare una macro di Word ed andarla
ad esaminare tramite l'editor VBA interno di Word ci rendera' capaci, in
davvero poco tempo, di costruire un programma in VB in grado di far fare al
nostro amato 'sparpaglialettere' anche' il caffe' (di certo non buono... ma
che volete pretendere da un computer! (:-)) )
PS: se in questa mia risposta notate qualcosa di non corretto o vi sembra
che manchi qualcosa, fatemelo notare, se un giorno ne uscisse mai fuori
qualcosa di utile potremmo inserirla nel sito comune.
By(t)e