2015-09-21 41 views
1

我正在使用Word和Excel中的VBA。我有Word運行一個用戶窗體,它將自動打開一個Excel文件。用戶應該在Excel文件中填寫一些數據,然後返回到Word用戶窗體。當用戶完成填充Word用戶窗體中的所有字段時,它將在Word上運行一些將Excel中的數據複製到Word的VBA代碼。完成後,Excel文件將自動關閉。因此,我需要防止用戶手動關閉Excel應用程序。從Word VBA防止Excel提示

爲了做到這一點,我在Excel VBA中使用這些代碼Sub Workbook_BeforeClose。如果用戶關閉Excel應用程序窗口,它將顯示一個消息框,詢問用戶是否仍在使用Word用戶窗體。代碼如下:

Private Sub Workbook_BeforeClose(Cancel As Boolean) 

answer = MsgBox("Are you still working with Word userform?", vbYesNo) 
If answer = vbYes Then 
    Cancel = True 
    MsgBox "This workbook should not be closed. It will be automatically closed when you finish working with Ms. Word Template Userform." 
Else 
    Application.ThisWorkbook.Saved = True 
End If 
End Sub 

在Word中VBA,我有一些代碼以關閉Excel文件:

Sub closeExcelApp() 

If Not excelApp Is Nothing Then 
    excelApp.DisplayAlerts = False 
    excelWb.Close savechanges:=False 
    Set excelWb = Nothing 
    excelApp.Quit 
End If 
Set excelApp = Nothing 

End Sub 

做的話VBA代碼從Excel的數據複製到Word時,該小組將被稱爲。但是,調用此子將導致調用Workbook_BeforeClose。同時,我不希望Workbook_BeforeClose在我稱之爲Word的VBA中的closeExcelApp子時調用。

有什麼建議嗎?

+0

最好的方法是創建一個'公共布爾值',當你輸入'closeExcelApp'並且在'Workbook_BeforeClose'開頭添加類似'If Boolean Then Exit Sub'時,你設置爲True。這應該夠了吧! ;) – R3uK

回答

2

你可以只禁用事件:

Sub closeExcelApp() 

If Not excelApp Is Nothing Then 
    excelApp.DisplayAlerts = False 
    excelApp.EnableEvents = False 
    excelWb.Close savechanges:=False 
    Set excelWb = Nothing 
    excelApp.Quit 
End If 
Set excelApp = Nothing 

End Sub 
+0

啊哈,當我看到你回答時,我感到很蠢,我完全忘記了那一刻!我提出的解決方案更有效率! – R3uK

1

正如在評論解釋,補充該行的模塊的頂部:Public ClosingFromWord As Boolean並將此布爾值當您啓動代碼執行。

當你在應用程序之間的工作,最簡單的方法將是寫布爾值在從Word Excel中的一個單元和讀/ LAOD在Workbook_BeforeClose這個值,以避免通過該程序的整個代碼去。

並修改代碼看起來像這樣:

Sub closeExcelApp() 
ClosingFromWord = True 
excelApp.Workbooks(1).Sheets(1).Cells(1,1) = ClosingFromWord 

If Not excelApp Is Nothing Then 
    excelApp.DisplayAlerts = False 
    excelWb.Close savechanges:=False 
    Set excelWb = Nothing 
    excelApp.Quit 
End If 
Set excelApp = Nothing 

ClosingFromWord = False 
excelApp.Workbooks(1).Sheets(1).Cells(1,1) = ClosingFromWord 
End Sub 

所以,當你執行closeExcelApp,布爾將被設置爲Workbook_BeforeClose不會在他的全部,因爲它會被執行與If ClosingFromWord Then Exit Sub退出:

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
ClosingFromWord = Workbooks(1).Sheets(1).Cells(1,1) 
If ClosingFromWord Then Exit Sub 

answer = MsgBox("Are you still working with Word userform?", vbYesNo) 
If answer = vbYes Then 
    Cancel = True 
    MsgBox "This workbook should not be closed. It will be automatically closed when you finish working with Ms. Word Template Userform." 
Else 
    Application.ThisWorkbook.Saved = True 
End If 
End Sub 
+0

我應該在哪裏把'公共ClosingFromWord作爲布爾'? 'closeExcelApp'在Word中,同時'Workbook_BeforeClose'在Excel中。我試圖在Word VBA模塊中放置布爾變量,但它似乎不起作用。我想我需要將變量從Word傳遞到Excel,不是嗎? – loremipsum

+0

我的不好,我忘了那件事。看看編輯,你可以指定一些比'Workbooks(1).Sheets(1).Cells(1,1)'更實際的東西,但是因爲我對你的文件一無所知,那是最簡單的方法解釋它! – R3uK

+0

啊,我從來沒有想過使用單元格在Word和Excel變量之間傳遞值。這對其他情況很有用。謝謝! – loremipsum