Newsgroup: it.comp.lang.visual-basic
Titolo: Macro di Word e DDE

Mi rivolgo alla vostra competenza e disponibilità per avere un suggerimento
per risolvere il seguente mio problema: ho scritto una macro in Word 2000
per comunicare con un programma di calcolo, che deve funzionare come
'server', utilizzando il sistema di comunicazione DDE. La cosa funziona ma,
dopo un minuto, esce il seguente messaggio:"L'operazione richiede più tempo
del previsto. Continuare ad aspettare ?". Da questo momento le operazioni di
calcolo (che durano diversi minuti)sono rallentate notevolmente (di un
fattore tra 2 e 3) e, con la cadenza di uno al minuto, torna il messaggio.
Ho risolto, forse non troppo elegantemente, il problema di non dovere
rispondere "si" al messaggio utilizzando il comando <'SendKeys "s">, ma non
il rallentamento delle operazioni di calcolo. E' possibile eliminare anche
questo secondo inconveniente?
In alternativa, sarebbe consigliato scrivere un piccolo programma in VB 6.0
? Non disponendo di un manuale di questo programma, ho cercato in Internet
indicazioni su come scriverlo, ma la cosa non mi è chiara.
Ringrazio anticipatamente chiunque voglia cortesemente darmi qualche
indicazione.
Mauro
--------------------------------
Inviato via 
http://usenet.libero.it

 del previsto. Continuare ad aspettare ?". ...
Ciao.
Penso che sia un problema di TimeOut. Quando usavo DDE con FoxPro c'era
un'istruzione per impostare il valore del Timeout, cioè del tempo che
l'applicazione client aspetta prima di generare l'errore. Anche in VB4 c'era
un'istruzione equivalente.
Ho fatto una rapida ricerca in Word2000 ma non ho trovato properio niente
per specificare il TimeOut.
Forse ti conviene farlo utilizzando come client un'applicazione VB, è
abbastanza semplice.
Basta che crei un form con un textbox ed un commandbutton
Nell'evento click del CommandButton scrivi questo:
Private Sub Command1_Click()
   Cmd = "[Run(" & Chr(34) & "Cartel1!Macro1" & Chr(34) & ")]"
   Text1.LinkTopic = "Excel|System"
   Text1.LinkMode = 2
   Text1.LinkTimeout = -1
   Text1.LinkExecute Cmd
End Sub
Ovviamente devi sostituire il valore di Cmd con il tuo comando.
Ciao.
Skysurfer


Ciao Skysurfer,
Prima di tutto ti ringrazio per la tua pronta risposta.
Ho letto e cercato di applicare il tuo suggerimento, ma - scusa la mia
scarsa confidenza con questo linguaggio - non ho capito cosa devo mettere
nel valore di Cmd. Ho provato a mettere in nome della mia macro (che si
trova in Normal.dot ) con il path, e vari altri tentativi, ma ricevo sempre
il messaggio "Nessuna applicazione di destinazione ha risposto ad una
chiamata DDE".
Potresti precisarmelo ? Te ne sarei molto grato.
Ciao


 Mauro
Ciao.
Il problema che mi hai segnalato si verifica perchè non hai un'istanza di
Word già in esecuzione.
Il modo più semplice per risolvere il problema è mettere nel programma in VB
un'istruzione che avvia Word, così sei sicuro che quando tenti di stabilire
un collegamento DDE, Word sia in esecuzione.
Per eseguire una macro di Word invece il codice da passare è [ToolsMacro
.Name="nome_della_macro", .Run] (sempre se ho capito bene e devi lanciare
una macro di Word e non di Excel).
Quindi il codice da mettere diventerebbe questo:
Private Sub Command1_Click()
    dim cmd as String
    'Avvio Word
    Shell "C:\Programmi\Microsoft Office\Office\Winword.exe"
    DoEvents
    'Imposto il comando da eseguire
    cmd = "[ToolsMacro .Name=" & Chr(34) & "Macro1" & Chr(34) & ", .Run]"
    'Imposto i parametri per il DDE
    Text1.LinkTopic = "Winword|System"
    Text1.LinkMode = 2
    Text1.LinkTimeout = -1
    'Eseguo il comando
    Text1.LinkExecute Cmd
End Sub
Ciao.
Skysurfer


Grazie, Skysurfer, per la tua competenza e disponibilità. Le tue indicazioni
sono state precise ed hanno permesso il perfetto funzionamento del tutto; il
messagio da parte di Winword non appare più, e la velocità di calcolo del
programma server non decade più.
Solo per tua conoscenza - a me, ciò che adesso ti comunicherò, non causa
grossissimi problemi - ti faccio presente quanto segue:
nel suo funzionamento,la macro di Word chiede di effettuare certi calcoli al
programma server per un certo numero di cicli (entro un loop For...Next). Ho
constatato che dopo circa 30 minuti di calcoli, stranamente (per me) compare
un tempo di attesa, tra due cicli consecutivi, di circa 3 minuti, come se
entrasse in funzione un secondo Timeout. Inoltre,dopo un certo tempo di
funzionamento (che non ho ancora potuto accertare) automaticamente cerca di
creare un nuova macro col nome 'WordTmpDDEMod1'.
Come ti ho detto, tutto questo a me non crea gravi problemi, per cui ti
ringrazio vivamente dei tuoi suggerimenti. Comunque, se ne avrò, ti farò
avere informazioni ulteriori.


 Mauro
Effettivamente il problema del ritardo dopo un certo numero di operazioni è
strano...
Quello che non ho ben capito è questo:
Tu da una macro di Word comunichi via DDE con un'altra applicazione?
E questa applicazione ti restituisce dei dati che devi poi utilizzare in
Word?
Perchè se non fosse così non ho capito a cosa ti serve Word, nel senso che
potresti comunicare direttamente con l'altra applicazione utilizzando un
client VB. Praticamente il codice VBA che adesso hai scritto nella macro di
Word potresti scriverlo direttamente in Visual Basic.
Ciao.
Skysurfer


Caro Skysurfer,
vedo che ti faccio perdere altro tempo. Hai perfettamente ragione;uso la
macro di word per comunicare con un'altra applicazione, ma i risultati - che
deposito in un file di testo - li utilizzo in altre applicazioni
(soprattutto in grafici), perciň non avrei bisogno della macro. Perň,
inizialmente, ho scritto la macro perchč non ho mai programmato in VB
(mentre ho programmato parecchio in Basic Professional, ed un pň in
Fortran), e temevo di perdere troppo tempo a utilizzare il VB. Adesso, piano
piano, mi ci proverň, visto che i problemi di comunicazione me li hai
risolti tu. Ti ringrazio ancora.


 macro di word per comunicare con un'altra applicazione [...]
Adesso ho capito... allora può darsi che il calo di prestazioni sia anche
dovuto a questa doppia comunicazione DDE.
Prova a trasferire il codice VBA in VB (è quasi equivalente) e poi fammi
sapere se migliora.
Ciao
Skysurfer


Ciao,
Purtroppo ho constatato che, quando cerco di utilizzarla per elaborazioni
più lunghe, la macro si blocca ed invia il messaggio di errore "Run-timer
error 286 - Timeout while waiting for DDe response". Inoltre costruisce una
macro 'TmpDDE' con la righa di codice "WordBasic.ToolsMacro Name:="Macro1",
Run:=1".Inoltre, se tolgo il comando che mi evitava di vedere il messaggio
ogni minuto (di cui ti ho già scritto), qusto torna a farsi vivo.
Perciò ho cominciato a scrivere un programmino in VB. Sono riuscito a farlo
comunicare con l'applicazione server (con il comando LinkTopic), ma non
riesco a farmi accettare il comando LinkRequest per ricevere i risultati
della elaborazione dal server.
Se non ti arreca troppo disturbo, puoi dirmi quali e quanti sono gli
argomenti di questa istruzione ? Non ho il manuale di riferimento e quindi
vado a caso. Anzi, hai per caso da suggerirmi un sito, o anche un libro da
acquistare, dove trovare questre cose, con particolare riguardo alla
comunicazione con altre applicazioni ?
Te ne sarei grato.


 della elaborazione dal server.
Ad essere sincero il comando LinkRequest non l'ho mai utilizzato, ma da
quello che ho capito dovrebbe aggiornare la casella di testo a cui è
associato con i dati che provengono dall'applicazione server. L'unica cosa
da fare prima è impostare anche la proprietà LinkItem. Questo è l'esempio
che ho trovato sulla guida.
Private Sub Form_Click ()
   If Text1.LinkMode = vbNone Then   ' Verifica la modalità di
            ' collegamento.
      Text1.LinkTopic = "Excel|Sheet1"   ' Imposta l'argomento di
            ' collegamento.
      Text1.LinkItem = "R1C1"   ' Imposta l'elemento di
            ' collegamento.
      Text1.LinkMode = vbLinkManual   ' Imposta la modalità di
            ' collegamento.
      Text1.LinkRequest   ' Aggiorna la casella di testo.
   Else
      If Text1.LinkItem  = "R1C1" Then
         Text1.LinkItem = "R2C1"
         Text1.LinkRequest   ' Aggiorna la casella di testo.
      Else
         Text1.LinkItem = "R1C1"
         Text1.LinkRequest   ' Aggiorna la casella di testo.
      End If
   End If
End Sub
Ma a te precisamente, che tipo di informazioni ti torna l'applicazione
server?
Per quanto riguarda i libri, non saprei cosa consigliarti. Non credo che ci
siano libri che parlano nello specifico di questo argomento, anche perchè è
una tecnologia ormai superata. Per quanto riguarda le ricerche potresti
provare prima di tutto 
http://msdn.microsoft.com/
 e poi qualche ricerca
negli articoli dei newsGroup con google 
http://groups.google.com/
 spesso
risolve l'irrisolvibile.
Ciao
Skysurfer