Newsgroup: it.comp.appl.access
Titolo: Word Automation

Sto cercando di gestire con l'automazione di Office una serie di
documentazione in Word.
Cercavo di capire se e come è possibile intercettare l'Evento Change
dell'oggetto Word.Application.
Mi spiego meglio, ho dichiarato a livello di Modulo di Form una
variabile del tipo:
Private WithEvents objWordApp As Word.Application
Ora il mio problema è intercettare se l'utente ha effettuato una
modifica dell'Oggetto Document aperto.....!
Questo per impedirlo sostanzialmente.
Tenete conto che il Documento è aperto in Sola Lettura
    Set docWord = objWordApp.Documents.Open(filepath, ReadOnly:=True)
Il tutto funzionerebbe, se non chè il documento è ugualmente
modificabile, e ovviamente non permette il Salvataggio se non
cambiando Nome e/o Destinazione.
Volevo in pratica sopprimere questa cosa.
Per questo avevo pensato all'intercettazioe dell'Evento Change
del DOCUMENT.
Private Sub objWordApp_DocumentChange()
    On Error Resume Next
    'Non so che cosa FARE.......
    '
mobjWordApp.ActiveDocument.Name
End Sub
Qualcuno ha idee...... da suggerirmi........???????
@Alex.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 @Alex.
Modificabile sě ma non salvabile con lo stesso nome; almeno a me, con questo
esempio, succede cosě.
'---------
Dim oApp As Word.Application
Set oApp = CreateObject("Word.Application")
oApp.Documents.Open "c:\prova.doc", , True
oApp.Visible = True
'---------
Non so se sia possibile gestire eventi di word da access; quando passi il
"fuoco" a word il gestore degli eventi passa a lui. Puoi impostare al
documento una password di scrittura ma č facilmente craccabile. Tutto
dipende da chi utilizza l'applicazione, se č un tipo "smanettone" o no;
magari con la password risolvi...
Ciao.
--
Sergio MAZZA

 Sergio MAZZA
Ciao Sergio...!
Allora, in effetti concordo con te, e forse mi sono spiegato male.
Ciò che ottengo è proprio il comportamento che hai descritto.
Sottolineo che gli eventi generati dall'Oggetto Word sono gestibili
anche con il Focus Spostato su Word, o meglio Access è in grado
di Rilevarli.
L'esempio che ho inserito nel mio post è funzionante, rilevo
correttamente
l'Evento CHANGE del Documento e la chiusura di Word.
Di fatto ho trovato qualche esempio in Internet molto casalingo
per gestire gli evento di Office.Automation ma devo dire funzionanti.
Il mio tentativo era di cercare di non rendere possibile la modifica
intercettando l'evento.
Ora l'evento lo intercetto, e anche se il Focus rimane su Word
esegue la Routine che nel mio caso è solo un Debud.Print....!
Non sò se ho reso l'idea o complicato ulteriormente il tutto...!!!
Questa soluzione mi serve per evitare di usare WordViewer, in quanto
non sò come installarlo visto che è un pacchetto d'installazione
separato......!!!!
Ciao.


 @Alex.
Come mai non sai come installarlo?
Ciao.
--
Sergio MAZZA

 
Perchè da buon "NON PROGRAMMATORE" di professione, ma di Sede di lavoro
solitamente non Instasllo nulla se non Il File MDE.....!!!
Quindi se hai anche per questo uno spunto ben venga, forse mi
semplificherei la cosa, anche se tecnicamente voglio andarcene
in fondo anche con l'altra soluzione...!!
Ciao Grazie.


 Qualcuno ha idee...... da suggerirmi........???????
    (Facci sapere se ed eventualmente come hai risolto. Grazie.)
--
Ciao :o)
Maurizio
--------
?SPQR(C)
 X
--------

 --
Ciao Maurizio, a prima vista mi pare un'ottima idea l'evento
DocumentBeforeSave, intercettarlo e imporre Cancel=true.
Lo provo e poi vi so dire qualche cosa di più........!!!
Ovviamente la Proprietà Saved se il tutto dovesse funzionare
non mi servirebbe, non si sa mai.....................!
Ciao @Alex.


 > 
Allora, ho provato la tua idea, ma purtroppo non funziona, o meglio
non come pensavo.
Nel senso che il Foglio è modificabile, e il Prompt di Salva documento
come..??? lo restituisce ugualmente, ed era proprio quello che volevo
evitare.
Purtroppo ho provato anche ad intercettare Change, ma non riesco a
dirottare l'esecuzione dell'evento, nel senso che lo rilevo
correttamente
ma il foglio viene puntualmete modificato.....!!!!
In tutto questo è molto probabile che io abbia fatto qualche errore
o abbia malinterpretato i tuoui suggerimenti.....!
Grazie di nuovo.


 >
P.S. specifico che il mio problema non è installarlo sulla mia macchina, ma
inserirlo
in un Pacchetto d'installazione ed eseguirlo, in quanto l'applicativo deve
girare
in una Rete Client-Server in cui WordViewer è solo una parte.......!!!
Ciao.
@Aex.


Avrei anche trovato una soluzione "Decente", vale a dire aprire il File.DOC
in Anteprima di Stampa.........!
Ma il problema nasce quando cerco di disabilitare la Barra dei Menů, pare
non
si possa o sono proprio alla Frutta....!!!
Di fatto avrei creato una Barra personalizzata con solo i comandi che
ritenevo
opportuni, ma la Barra dei Menů di Default non si toglie.........!!!!!!
Haaaaa....!
Ciao.
@Alex.

 o abbia malinterpretato i tuoui suggerimenti.....!
    Cancelliamo tutto e ricominciamo.
    Qual e' il problema? Che obiettivo ti proponi?
    Rileggendo il thread ho capito che vuoi essere certo che il tuo
applicativo lavori con un documento word tale e quale quello che tu hai
previsto, senza modifiche. E' cosi'?



Non solo.
Specifico meglio.
1)Uso dei modelli xxx.DOT per generare delle schede di Manutenzione.
2)Le schede di cui sopra vanno coompilate o modificate solo da chi ha i
privilegi per farlo.
3)Non è sufficiente la protezione del DOC che generoi scrittura, perchè
anche senza permessi
il foglio si modifica, e mi genera il POPUP di dialogo SALVA CON NOME, anche
se non mi
permette di salvare sul DOC aperto in quanto in READONLY.
Di fatto è brutto..........!
4)Pensavo quindi di intercettare l'evento Change, ma non funziona, almeno mi
pare.
5)Ho pensato di sfruttare l'apertura in Anteprima di Stampa, e devo dire che
andrebbe benone
se non chè il "Menu Bar" di Default non pare disabilitabile, quindi mi
permette di rientrare
nella modalità DOCUMENTO.
Infatti avevo creato una Barra personalizzata che permettesse solo STAMPA e
CHIUSURA....!
Sostanzialmente vorrei far fare a WORD quello solo le azioni di WordViewer,
che come ripeto non sò
come installare su tutte le Macchine in questione in modo Automatico con
l'installazione del Mio applicativo.
Sono stato abbastanza complicato.........!????
Ciao.
@Alex.

 Sono stato abbastanza complicato.........!????
    Direi di no.
    Verifica se il codice seguente fa al caso tuo. Apparentemente la
variabile m_objWdApp non serve a niente. Ma, se la togli, l'evento
Document_Close non viene eseguito. Word a volte ti lascia senza
words!...
' ============================================================
' Maurizio Borrelli
' ------------------------------------------------------------
  Option Base 0
  Option Compare Text
  Option Explicit
' ------------------------------------------------------------
  Const mc_strMyName As String = "ThisDocument"
' ============================================================
' ============================================================
' PRIVATE VARIABLES / VARIABILI PRIVATE
' ------------------------------------------------------------
  Private WithEvents m_objWdApp As Word.Application
' ============================================================
' ============================================================
  Private Sub Init()
' ------------------------------------------------------------
  Set m_objWdApp = Me.Application
  End Sub
' ============================================================
' ============================================================
  Private Sub Document_Close()
' ------------------------------------------------------------
  Me.Saved = True
  Set m_objWdApp = Nothing
  End Sub
' ============================================================
' ============================================================
  Private Sub Document_New()
' ------------------------------------------------------------
  Init
  End Sub
' ============================================================
' ============================================================
  Private Sub Document_Open()
' ------------------------------------------------------------
  Init
  End Sub
' ============================================================



[CUT]
............................
Il codice che mi hai postato è esattamente quello che ho generato io con
qualche difficoltà, ma che
sostanzialmente non mi da aiuti.....!
Ora faccio altri tentativi, poi ci risentiamo......!
Se hai altri suggerimenti confortanti......... nel frattempo.....!
Ciao grazie per la consulenza.
@Alex.

 ha scritto nel messaggio
news:b5i9vd$29obpf$1...@ID-52090.news.dfncis.de...
[CUT]
Posto una soluzione alla cosa che sono riuscito a mettere in piedi.
1)Apro il Documento Word in visualizzazione AnteprimadiStampa.
2)Nell'evento Open del DOC ciclo tutti gli oggetti CommandBar e abilito solo
il mio
3)Nell'Evento Close devo ripristinare tutti gli oggetti poichč ho notato che
la modifica
ha effetto sull'Applicativo WORD.
Apparentemente il DoC aperto non č modificabile, e poichč nel Menů
personalizzato non c'č modo
di eseguire azioni pericolose mi pare possa andare.
Se qualcuno ha migliorie da apportare o idee di
discussione.................................!!!!!
Ciao a tutti.
@Alex.
Sub da ACCESS per aprire WORD :
Private Sub PreviewWord(strfile As String)
   On Error GoTo Err_PreviewWord
   Dim appWord As Word.Application
   Dim docWord As Object
   If IsNull(strfile) Then
      MsgBox "Inserire percorso e nome File .........", vbCritical, "Word
Messagge"
   Else
      Set appWord = CreateObject("Word.Application")
      Set docWord = appWord.Documents.Open(strfile, ReadOnly:=True)
      appWord.Visible = True
      docWord.PrintPreview
      appWord.ActiveWindow.ActivePane.View.Zoom.PageFit = wdPageFitBestFit
      appWord.CommandBars("StyleDot").Controls("Salva").Enabled = False
   End If
Exit_PreviewWord:
   Exit Sub
Err_PreviewWord:
   MsgBox err.Description
   Resume Exit_PreviewWord
End Sub
VBA da inserire nel Documento.Doc
Private Sub Document_Close()
Dim cmdbar As CommandBar
Dim strName As String
For Each cmdbar In CommandBars
    If cmdbar.Name = "MyPersonalBar" Then
        cmdbar.Enabled = False
    Else
        cmdbar.Enabled = True
    End If
Next
End Sub
Private Sub Document_Open()
Dim cmdbar As CommandBar
Dim strName As String
For Each cmdbar In CommandBars
    If cmdbar.Name = "MyPersonalBar" Then
        cmdbar.Protection = msoBarNoMove _
                            + msoBarNoChangeDock _
                            + msoBarNoCustomize 'msoBarNoProtection
        cmdbar.Enabled = True
        cmdbar.Visible = True
    Else
        cmdbar.Enabled = False
    End If
Next
End Sub

 con qualche difficoltà, ma che sostanzialmente non mi da aiuti.....!
    In effetti involontariamente ho introdotto un errore mentre lo
sfoltivo delle parti di codice non necessarie al nostro discorso.
Scusami. Vedi se quello che segue fa al caso tuo:
' ============================================================
' Maurizio Borrelli
' ------------------------------------------------------------
  Option Base 0
  Option Compare Text
  Option Explicit
' ------------------------------------------------------------
  Const mc_strMyName As String = "ThisDocument"
' ============================================================
' ============================================================
' PRIVATE VARIABLES / VARIABILI PRIVATE
' ------------------------------------------------------------
  Private WithEvents m_objWdApp As Word.Application
' ============================================================
' ============================================================
  Private Sub Init()
' ------------------------------------------------------------
  Debug.Print "Init"
  Set m_objWdApp = Me.Application
  End Sub
' ============================================================
' ============================================================
  Private Sub Document_Close()
' ------------------------------------------------------------
  Debug.Print "Document_Close"
  Set m_objWdApp = Nothing
  End Sub
' ============================================================
' ============================================================
  Private Sub Document_New()
' ------------------------------------------------------------
  Debug.Print "Document_New"
  Init
  End Sub
' ============================================================
' ============================================================
  Private Sub Document_Open()
' ------------------------------------------------------------
  Debug.Print "Document_Open"
  Init
  End Sub
' ============================================================
' ============================================================
  Private Sub m_objWdApp_DocumentBeforeClose( _
    ByVal Doc As Document _
  , ByRef Cancel As Boolean)
' ------------------------------------------------------------
  Debug.Print "m_objWdApp_DocumentBeforeClose"
  With Doc
    Debug.Print _
      .AttachedTemplate.Name; ":"; 
Me.AttachedTemplate.Name
    If (.AttachedTemplate.Name = 
Me.AttachedTemplate.Name
) Then
      If (.Saved = False) Then
        .Saved = True
      End If
    End If
  End With
  End Sub
' ============================================================
' ============================================================
  Private Sub m_objWdApp_DocumentBeforeSave( _
    ByVal Doc As Document _
  , ByRef SaveAsUI As Boolean _
  , ByRef Cancel As Boolean)
' ------------------------------------------------------------
  Debug.Print "m_objWdApp_DocumentBeforeSave"
  With Doc
    Debug.Print _
      .AttachedTemplate.Name; ":"; 
Me.AttachedTemplate.Name
    If (.AttachedTemplate.Name = 
Me.AttachedTemplate.Name
) Then
      SaveAsUI = False
      Cancel = True
      MsgBox _
          "Funzione 'Salva' disabilitata." _
        & vbCrLf _
        & "Non è consentito modificare il documento." _
        , vbExclamation + vbOKOnly _
        , .Name
    End If
  End With



Ho provato ad estrarre tutti i file del pacchetto di installazione di
WordViewer e ad eseguire (su un pc "vergine") il programma senza
installarlo; funziona (sembra) e visualizza i doc senza nessun problema.
Se il tuo problema era "solo" come installarlo posso ipotizzare una
soluzione:
- copiare il viewer in una cartella definita da te;
- con uno script associ l'estensione .doc al viewer o richiami il doc con
shell "wordviewer nomeDoc.dic";
Se ti serve di sapere quando l'utente chiude il viewer puoi utilizzare il
metodo Run dell'oggetto WshShell;
Es.
'-----------
Dim WshShell, oExec As Integer
Set WshShell = CreateObject("WScript.Shell")
oExec = WshShell.Run("C:\documenti\wordview.exe", , -1)
MsgBox oExec & ", Chiusa"
Set WshShell = Nothing
'-----------
Ciao.
--
Sergio MAZZA

 
Ottimo, in effetti era proprio il problema che avevo, così
come mi confermi lo installo con InstallShield, poi
dirotto la chiamata proprio come mi hai suggerito....!
In realtà non mi conviene associare l'estensione DOC al Viewer
ma usare Shell per aprire il documento con il DOC imponendogli
con cosa aprirlo, non l'ho mai fatto, ma penso che ricavando la
classe del Viewer si possa......!
Nel frattempo inca.....zzato ho trovato un'altra soluzione
che però risulta più macchinosa, e che alla luce del tuo suggerimento
devo valutare se mi conviene ancora....!
In ogni caso prova a dare un'occhiata al mio Post ultimo di risposta a
Maurizio, i pare una soluzione "Gradevole".....! 


 @Alex.
Eh! Eh! "Gradevole" è la parola giusta...
Ciao.
--
Sergio MAZZA

 discussione.................................!!!!!
[...]
    Come dicevo, non ho ancora potuto far girare il tuo codice.
Sostanzialmente direi che e' in linea con cio' che intendevo quando
scrivevo a proposito della "questione barre da approfondire" quindi
nulla da eccepire. :-)


 
Già, accontenta parzialmente l'occhio....!


 
Hai, Hai, Hai..... beccato al volo.
Si in effetti non c'č la protezione sul AllowByPassKey, e 
in Word non sň se č possibile inserirla....!
Sostanzialmente come accennavo a Sergio Mazza č una soluzione
"Gradevole"...., e per le mie esigenze sufficientemente funzionale.
Ora cerco di risolvere il problema dello SHIFT, per la Barra
dei Menů mi pare funzioni bene, con gli accorgimenti di cui
parlavamo.
Ciao.



Ciao.
--
Sergio MAZZA

 wrote in message
news:b5p8no$c0h$
1...@canarie.caspur.it

Si era una domanda, nel senso che non ero sicuro.
Quello che mi hai confermato in effetti mi semplifica le prove
e mi convinco sempre piů della convenienza....!
Grazie


 wrote in message
news:b5p8no$c0h$
1...@canarie.caspur.it
P.S.
Ho provato a copiare il Viewer senza installarlo
ma non c'è verso che vada, dichiara l'assenza di 2 Dll
che ho provato a inserire e registrare, ma non c'è verso...!
Tu hai effettuato altre manovre per la prova di cui sopra...??


...

Prova questo, se puň esserti d'aiuto:
Public Sub NascondiBarraMenu()
'Nasconde la barra del menu principale
'Necessario il riferimento a "Microsoft Office 9.0 Object Library
Dim cbarmenu  As CommandBar
    Set cbarmenu = CommandBars("menu bar")
    cbarmenu.Enabled = False
 
End Sub
Ciao, Denis


Ho estratto i file con winzip in una cartella, nient'altro...
Ho cercato di individuare quale dll non erano necessarie rinominandole; mi
sono fermato alle prime 2 poi visto che non occupavano tanto spazio e non
erano installate ho lasciato perdere.
Ciao.
--
Sergio MAZZA


Si, hai ragione, avevo fatto una c....ta io...!
Ora va, devo meglio individuare quali siano realmente le cose da installare
ma tutto OK.
Come dice l'ING. CANE mille e mille grazie....!
@Alex.

 Denis
Ciao grazie anche a te, in effetti lo avevo trovato, solo non sapevo si
dovesse
disabilitare all'apertura e riabilitare alla chiusura per non modificare
tutti i successivi DOC
aperti......!
Ciao.
@Alex.


Diecimila e diecimila prego...
Ciao.
--
Sergio MAZZA

 ha scritto nel messaggio
news:b5q1vh$jnu$1...@canarie.caspur.it...

Fosse semplice liberarsi del mio assillo....!
Allora ho provato:
Private Sub Comando11_Click()
   Dim WshShell, oExec As Integer
   Set WshShell = CreateObject("Word.Application")
   oExec = WshShell.Run("C:\MiaDir\MioDocumento.doc", , -1)
   MsgBox oExec & ", Chiusa"
   Set WshShell = Nothing
End Sub
Mi da errore di Runtime n°450=Numero Argomenti o assegnazione di proprietà
non valide...
alla riga:
oExec = WshShell.Run("C:\MiaDir\MioDocumento.doc", , -1)
Ho poi guardato l'Help a riguardo del metodo RUN di Application, ma non ho
ben capito
come e a cosa serve, in più non funzionandomi ........!!
Ciao.
@Alex.


non lo trovi perchè è l'help di Windows Scripting Host che trovi nel sito
MS, nella versione 5.6 Italiano...
Ciao.
--
Sergio MAZZA

 sito MS, nella versione 5.6 Italiano...
    Dove pero', tra l'altro e' anche scritto:
        Se un tipo di file è stato associato correttamente ad un
        particolare programma, l'esecuzione di un file di quel tipo
        richiama l'esecuzione del programma. Se Word è installato
        nel computer, ad esempio, richiamando Run su un file *.doc
        si avvia Word che a sua volta carica il documento.
quindi probabilmente il problema di @Alex non e' nell'istruzione:
        oExec = WshShell.Run("C:\MiaDir\MioDocumento.doc", , -1)
perche' in questo caso in un pc senza word ma con wordviewer dovrebbe
aprirsi quest'ultimo.


 
[CUT]
Allora, ripartiamo.....!
Il Metodo CreateObject funziona passandogli il nome della
Classe, cosa che io non riesco a recuperare per WordViewer
in quanto non installato.....!
Ma forse mi sbaglio.....????
Di conseguenza il metodo Run non viene eseguito, ma il problema
sta a monte, nel senso che non viene eseguito nemmeno
il CreateObject, in quanto non in grado di riconoscere l'argomento.
Non sò se installando Viewer, poi recuperando il ClassName
dell'applicativo
con le API e quindi disinstallarlo e inserire il nome della Classe
possa andare, io non credo solo per il fatto che non può associare la
classe a nulla.....!!!!
P.S. in seguito la considerazione di Maurizio, da non sottovalutare, ma
credo che non dovrebbe essere problematica in quanto imponendo
al metodo RUN l'utilizzo del Viewer dovrebbe fregarsene di WORD.
In ogni caso è da verificare.
Rimango in attesa.... nel caso di ulteriori consigli...!



Se viene installato; io ho suggerito di non installarlo e richiamarlo
accoppiato al nome del documento.
Quindi secondo me è quello il problema; anche perché, ripeto, ho provato su
un pc vergine e con l'esempio inviato ho aperto il viewer e il doc...
Ciao.
--
Sergio MAZZA

 @Alex.
Ma hai provato a fare come ti ho suggerito?
- dove hai estratto i file del viewer?
- dove sono i documenti da visualizzare?
Es.
- path viewer: c:\viewer
- path documenti: c:\documenti
Risultato:
WshShell.Run("C:\viewer\wordview.exe c:\documenti\nomeDocumento.doc", , -1)
Ciao.
--
Sergio MAZZA

 
Scusa ma sono di coccio....!
Allora se non funziona CreateObject, secondo te
come può funzionare WshShell.Run(...) che l'oggetto WhsShell
non è nulla.....????
Ti posto quello che ho fatto:
Il Viewer e il mio Doc per semplicità stanno nello stesso posto...!
Private Sub Comando11_Click()
   Dim WshShell, oExec As Integer
   Set WshShell = CreateObject("NON SO COSA SCRIVERE")
   oExec = WshShell.Run("C:\MiaDIR\wordview.exe C:\MiaDir\MioDocum.doc",
, -1)
   MsgBox oExec & "CHIUSO"
   Set WshShell = Nothing
End Sub
Porta pazienza, ma sento la primavera.



Pupazza miseria!
'--------
Set WshShell = CreateObject("WScript.Shell")
'--------
Ciao.
--
Sergio MAZZA