Newsgroup: it.comp.lang.visual-basic
Titolo: VB e Word - Soluzione dell'enigma

VB e  Word - Soluzione dell'enigma
Grazie a tutti quelli che mi hanno aiutato.
Ho risolto il problema che avevo, ora da vb posso stampare su un documento
word senza errori!!
Grazie a tutti Giorgio
P.S.
a chi interessasse , si può scaricare il piccolo progetto-esempio  (8Kb) a :
http://members.xoom.it/calasanzio/vb/provaVBWord.zip
.
.

> Giorgio B.:

L'ho scaricato ma l'errore c'e` ancora. Deriva da un uso non corretto degli
oggetti.
Nel progetto hai referenziato:
Reference=*\G{00020905-0000-0000-C000-000000000046}#8.0#409#..\Programmi\Mic
rosoft Office\Office\MSWORD8.OLB#Microsoft Word 8.0 Object Library
come se volessi far uso dell'"Early Binding", poi nel codice scrivi:
    Set wordApp = GetObject(, "Word.Application")
    <ecc>
invece di, per esempio:
    Set wordApp = New Word.Application
usando cosi` il "Late Binding".
Questo non avrebbe conseguenze se il codice successivo fosse coerente con
tale impostazione, invece scrivi:
    With wordApp
      <...>
      .Selection.Font.Bold = wdToggle
      <...>
      .Selection.ParagraphFormat.LeftIndent _
        = CentimetersToPoints(3)
      <...>
    End With
invece di:
    With wordApp
      <...>
      .Selection.Font.Bold = &H98967E
      <...>
      .Selection.ParagraphFormat.LeftIndent _
        = .CentimetersToPoints(3)
      <...>
    End With
Cioe`: ho sostituito la costante globale di Word "wdToggle" con il suo
valore in quanto la "libreria" Word non dovrebbe essere referenziata; e lo
stesso vale per "CentimetersToPoints" che pero`, essendo membro anche di
"Application", puo` essere usato a condizione che lo si riferisca ad
"Application", appunto. Ecco perche' va preceduto dal punto.
In questo modo puoi togliere il riferimento a Word dal progetto che,
immagino, avrai usato solo allo scopo di facilitarti la scrittura del codice
mediante l'uso degli automatismi per la scrittura del codice. Cosi`,
ricompilando, ti accorgi subito di tali errori (e non incolpi il povero
"ParagraphFormat" che, almeno in questo caso, e` innocente). ;-))
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

 usando cosi` il "Late Binding".
[...]
Dimenticavo di aggiungere la cosa forse piu` importante: perche' la prima
volta il codice viene eseguito correttamente e la seconda, se si chiude
Word, va in errore mostrando il messaggio "462 - The remote server machine
does not exist or is unavailable**1000462**"?
Credo (e mi farebbe piacere leggere il parere di altri) dipenda dal fatto
che la chiusura di Word interrompa le comunicazioni con la tua applicazione
"client" cosi` la prima istruzione che fa riferimento alla "libreria" di
Word referenziata nell'applicazione segnala l'errore.
Ma mi rendo conto ora di non essermi spiegato bene. Ho iniziato il post
precedente dicendo che il programma non funziona espondendo immediatamente
la mia conclusione invece di svolgere il ragionamento cronologicamente. In
effetti il programma, cosi` come viene scaricato, funziona. Ma funziona, e
sei riuscito a farlo funzionare, per una serie di circostanze fortuite, fra
le quali ti segnalo nuovamente una molto insidiosa: il mancato uso di
"Option Explicit". Poi grazie al fatto di mischiare il riferimento alla
"libreria" di Word con l'uso di GetObject e CreateObject.
In pratica, e questo e` il motivo di fondo del mio intervento, rischi, la
prossima volta che scriverai un programma con analoghe funzionalita`, di
trovarti nuovamente in situazioni apparentemente inspiegabili.




...


 >> > 
http://members.xoom.it/calasanzio/vb/provaVBWord.zip
Ho pensato fosse meglio, piu` che tanti discorsi, una riscrittura di parte
del tuo codice. Ho solo una preoccupazione: ho usato la compilazione
condizionale per non scrivere le due versioni e per mettere bene in evidenza
quali sono le parti di codice che cambiano o rimangono in alterate nelle due
modalita`. Spero non ingeneri confusione. In caso di dubbi fatti vivo.
Option Explicit
' EARLYBINDING - Costante per la compilazione condizionale.
' ---------------------------------------------------------
'
' Se a tale costante viene assegnato il valore:
'
'   True
'
' vuol dire che si intende eseguire il programma in
' modalita` 'Early binding' (it.: associazione anticipata)
' quindi nel progetto DOVRANNO esistere i riferimenti
' (Project -> References...) a:
'
'   Microsoft Word x.x Object Library
'
' se invece le viene assegnato il valore:
'
'   False
'
' tali riferimenti potranno anche non esistere e, se
' esistenti, verranno ignorati e l'esecuzione avverra` in
' modalita` 'Late Binding' (it.: associazione tardiva).
'
' Per una definizione di associazione anticipata/tardiva
' consulta la guida alla voce 'Funzione CreateObject'.
'
#Const EARLYBINDING = True
Private Sub Command1_Click()
  Const c_strA As String = "VISITA MEDICA"
  Const c_strB As String = "EFFETTUATA"
  Const c_strC As String = "MARIETTO GENNARO"
  Const c_strD As String = "Note: Questo č un esempio di" _
                         & " nota, vedi che rientra" _
                         & " rispetto all'altro testo?... č" _
                         & " stato fatto apposta, in modo" _
                         & " che risulti piů evidenziata."
  Const c_sngIndentCentimeters As Single = 3
  Const c_lngLenUnderscore     As Long = 66
#If EARLYBINDING Then
  Dim wdApp As Word.Application
  Set wdApp = New Word.Application
#Else
  Const wdToggle As Long = &H98967E 'Word.WdConstants.wdToggle
  Dim wdApp      As Object
  Set wdApp = VBA.CreateObject("Word.Application")
#End If
  With wdApp
    .Visible = True
    .Documents.Add
    .Selection.TypeText Text:=c_strA & " " & c_strB & " "
    .Selection.Font.Bold = wdToggle
    .Selection.TypeText Text:=c_strC
    .Selection.Font.Bold = wdToggle
    .Selection.TypeParagraph
    .Selection.ParagraphFormat.LeftIndent _
      = .CentimetersToPoints(c_sngIndentCentimeters)
    .Selection.TypeText Text:=c_strD
    .Selection.TypeParagraph
    .Selection.ParagraphFormat.LeftIndent _
      = .CentimetersToPoints(0)
    .Selection.TypeParagraph
    .Selection.TypeText Text:=String$(c_lngLenUnderscore, "_")
    .Selection.TypeParagraph
    .Activate
  End With: Set wdApp = Nothing
End Sub
