2013-03-14 13 views
6

Mam makro, które formatuje dokument w określony sposób, a następnie zapisuje go, używając ActiveDocument.Save.Błąd wykonania podczas anulowania okna dialogowego "Zapisz jako" wyświetlanego przez VBA

Czasami dokument nie jest już zapisany, aw niektórych przypadkach nie chcę go zapisać. Niestety, kliknij „Anuluj”, gdy wyświetlany jest dialog „Zapisz jako” powoduje błąd run-time (4198) -

Command failed

Czy ktoś wie jak mogę temu zapobiec? Dzięki.

+0

Więc w niektórych przypadkach chcesz zezwolić na "SaveAs"? – brettdj

+1

Tak, powinien to być użytkownik. Dzięki. –

+0

Zaktualizowałem, aby obsłużyć zmienione pytanie. – brettdj

Odpowiedz

2

Aktualizacja: Teraz

1. Sprawdzenie, czy plik został wcześniej zapisany czy nie
2. Jeśli plik nie jest zapisany, używany jest kontrolowany proces, aby wyświetlić okno dialogowe SaveAs, aby zapisać plik lub obsłużyć numer Cancel

kod

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

Dzięki @bredttdj, ale obawiam się, że to nie działa. 'Błąd kompilacji: Oczekiwana funkcja lub zmienna', z napisem' .save' wskazanym jako obraźliwy fragment kodu. –

+0

@DavidGard, podczas gdy kod pracował dla mnie bez żadnych błędów, powinienem przetestować istnienie 'Path', a nie' Saved'. Pls wypróbuj powyższy kod. – brettdj

+0

Przepraszam, źle odczytałem twój kod. '.saved' działa, ale obawiam się, że źle zinterpretowałeś moje pytanie (edycja jest teraz bardziej przejrzysta).Czasami użytkownik będzie chciał zapisać wcześniej niezapisane dokumenty za pomocą okna dialogowego Zapisz jako, a czasami nie. Więc pomijanie go, jeśli dokument nie jest jeszcze zapisany, nie jest opcją. Zdaję sobie sprawę, że mogę zapytać użytkownika, czy chce go zapisać, ale to nadal daje mu możliwość naciśnięcia "Anuluj", więc wrócę do pierwszego. Dzięki. –

3

Spróbuj brzmienie, dodając kilka instrukcji obsługi błędów:

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

Dzięki za odpowiedź. Chociaż rozumiem, że pomijasz błędy w VBA, wolałbym zrozumieć, dlaczego błąd jest zgłaszany, jeśli to możliwe, i obejść go w ten sposób. Użyję tej metody, jeśli jest to wymagane. –

+0

Wiem, że VBA nie zapewnia prostych rozwiązań dla niektórych działań użytkownika, takich jak przykład lub bardzo popularny problem z przyciskiem Anuluj dla 'Application.Inputbox' w Excel VBA. Dlatego wymagane są inne implementacje VBA ... –

+0

@ title Jaw To jest nieprawidłowe, istnieje proste rozwiązanie bez obsługi błędów. – brettdj

0

dla deweloperów VSTO, przejdź tutaj

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(); 
     } 

wynik będzie przechowywać który przycisk jest wciśnięty (0- anulować, 1-, 2- ok bliska)

Powiązane problemy