2013-03-14 46 views
6

Tôi có macro định dạng tài liệu theo một cách nhất định và sau đó lưu macro bằng cách sử dụng ActiveDocument.Save.Lỗi thời gian chạy khi hủy hộp thoại 'Lưu dưới dạng' được hiển thị qua VBA

Tuy nhiên, đôi khi tài liệu chưa được lưu và trong một số trường hợp, tôi không muốn lưu. Rất tiếc, nhấp vào 'Hủy' khi hộp thoại 'Lưu dưới dạng' được hiển thị gây ra lỗi thời gian chạy (4198) -

Command failed

Có ai biết cách ngăn chặn điều này xảy ra không? Cảm ơn.

+0

Vì vậy, trong một số trường hợp, bạn muốn cho phép 'SaveAs'? – brettdj

+1

Có, nó phải tùy thuộc vào người dùng. Cảm ơn. –

+0

Tôi đã cập nhật để xử lý câu hỏi đã sửa đổi của bạn. – brettdj

Trả lời

2

Cập nhật: Bây giờ

1. Các xét nghiệm nếu các tập tin đã được lưu trước đó hay không
2. Nếu tệp không được lưu, một quy trình được kiểm soát được sử dụng để hiển thị hộp thoại SaveAs để lưu tệp hoặc xử lý Cancel

đang

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

Cảm ơn @bredttdj, nhưng tôi e rằng điều này không hiệu quả. 'Lỗi biên dịch: Hàm hoặc biến được mong đợi', với' .save' được chỉ định là đoạn mã vi phạm. –

+0

@DavidGard trong khi mã làm việc cho tôi mà không có bất kỳ lỗi nào, tôi nên đã kiểm tra sự tồn tại của 'Đường dẫn' không phải là' Đã lưu '. Xin hãy thử mã trên. – brettdj

+0

Xin lỗi, tôi đã đọc sai mã của bạn. '.saved' không hoạt động, tuy nhiên tôi sợ bạn đã hiểu sai câu hỏi của tôi (chỉnh sửa ngay bây giờ để làm cho nó rõ ràng hơn).Một số lần người dùng sẽ muốn lưu các tài liệu chưa lưu trước đó bằng cách sử dụng hộp thoại Lưu với tên, và đôi khi điều đó sẽ không. Vì vậy, tiếc là bỏ qua nó nếu tài liệu chưa được lưu không phải là một lựa chọn. Tôi nhận ra rằng tôi có thể hỏi người dùng nếu họ muốn tiết kiệm, nhưng điều đó vẫn cho họ tùy chọn nhấn 'Hủy', vì vậy tôi sẽ trở lại hình vuông một. Cảm ơn. –

3

hãy thử như sau bằng cách thêm một số hướng dẫn xử lý lỗi:

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

Cảm ơn bạn đã trả lời. Trong khi tôi hiểu rằng bạn có một lỗi bỏ qua trong VBA, tôi muốn hiểu tại sao lỗi này lại bị ném nếu có thể, và làm việc xung quanh nó theo cách đó. Tôi sẽ sử dụng phương pháp này nếu cần thiết để làm như vậy mặc dù. –

+0

Điều tôi biết là VBA không cung cấp các giải pháp đơn giản cho một số hành động của người dùng như ví dụ của bạn hoặc vấn đề rất phổ biến với nút Hủy bỏ cho 'Application.Inputbox' trong Excel VBA. Vì vậy một số triển khai VBA khác được yêu cầu ... –

+0

@kaz Hàm Đó là không chính xác, có một giải pháp đơn giản mà không cần xử lý lỗi. – brettdj

0

cho các nhà phát triển VSTO, vui lòng vào đây

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

Kết quả sẽ lưu giữ nút đó được nhấn (0- hủy, 1- ok, 2- gần)

Các vấn đề liên quan