2013-03-14 15 views
6

Ho una macro che formatta un documento in un certo modo, quindi lo salva, utilizzando ActiveDocument.Save.Errore di run-time durante l'annullamento di una finestra di dialogo "Salva come" visualizzata tramite VBA

Tuttavia, a volte il documento non è già stato salvato e in alcuni casi non desidero salvarlo. Purtroppo, cliccando su 'Annulla' quando viene visualizzato il dialogo 'Salva con nome' sta causando un errore di run-time (4198) -

Command failed

Qualcuno sa come posso evitare che ciò accada? Grazie.

+0

Quindi in alcuni casi si desidera consentire 'SaveAs'? – brettdj

+1

Sì, dovrebbe essere l'utente. Grazie. –

+0

Ho aggiornato per gestire la tua domanda rivista. – brettdj

risposta

2

Aggiornato: Ora

1. Verifica se il file è stato salvato in precedenza o meno
2. Se il file non è salvato, viene utilizzato un processo controllato per mostrare la finestra di dialogo SaveAs per salvare il file o gestire lo Cancel

codice

Dim bSave As Boolean 
If ActiveDocument.Path = vbNullString Then 
bSave = Application.Dialogs(wdDialogFileSaveAs).Show 
If Not bSave Then MsgBox "User cancelled", vbCritical 
Else 
ActiveDocument.Save 
End If 
+0

Grazie a @bredttdj, ma temo che questo non funzioni. 'Compile error: Expected Function o variabile', con' .save' viene indicato come pezzo di codice dannoso. –

+0

@DavidGard mentre il codice ha funzionato per me senza errori, avrei dovuto verificare l'esistenza di 'Path' not' Saved'. Pls prova il codice sopra. – brettdj

+0

Mi scuso, ho letto male il tuo codice. '.saved' funziona, tuttavia temo di aver erroneamente interpretato la mia domanda (modificando ora per renderla più chiara).Alcune volte l'utente vorrà salvare i documenti precedentemente non salvati usando la finestra di dialogo Salva come, ea volte no. Quindi sfortunatamente saltarlo se il documento non è già salvato non è un'opzione. Mi rendo conto che posso quindi chiedere all'utente se desidera salvare, ma che comunque dà loro la possibilità di premere "Annulla", quindi tornerò al punto di partenza. Grazie. –

3

prova a seguire con l'aggiunta di alcune istruzioni di gestione degli errori:

On Error Resume Next 'to omit error when cancel is pressed 
    ActiveDocument.Save 

If Err.Number <> 0 Then 'optional, to confirmed that is not saved 
    MsgBox "Not saved"  
End If 
On Error GoTo 0   'to return standard error operation 
+1

Grazie per la risposta. Mentre capisco che tu salti gli errori in VBA, preferirei capire perché l'errore è stato lanciato, se possibile, e aggirarlo in questo modo. Userò questo metodo se richiesto per farlo però. –

+0

Quello che so è che VBA non fornisce soluzioni semplici per alcune azioni dell'utente come il tuo esempio o il problema molto popolare con il pulsante Annulla per 'Application.Inputbox' in VBA di Excel. Pertanto sono richieste altre implementazioni VBA ... –

+0

@kaz Jaw Che non è corretto, esiste una soluzione semplice senza gestione degli errori. – brettdj

0

per gli sviluppatori VSTO, vai qui

if (Globals.ThisAddIn.Application.ActiveDocument.Path == String.Empty) 
     { 
      Word.Dialog dlg; 
      Object timeout = 3000; 
      dlg = Globals.ThisAddIn.Application.Dialogs[ 
       Word.WdWordDialog.wdDialogFileSaveAs]; 
      int result = dlg.Display(ref timeout); 
     } 
     else 
     { 
      Globals.ThisAddIn.Application.ActiveDocument.Save(); 
     } 

Il risultato memorizzerà pulsante che viene premuto (0- annullare, 1- ok, 2- vicino)