Msgbox xuất hiện 2 lần mới chịu “biến” ?

Liên hệ QC

tuan_anhbm

Thành viên thường trực
Tham gia
16/7/09
Bài viết
253
Được thích
1,605
Chào các bạn !
Vì muốn “thay đổi không khí” 1 chút mỗi khi đóng file: thay vì xuất hiện Msgbox của excel thì sẽ x/hiện 1 Msgbox của người dùng. Với yêu cầu:
- Nếu file không có thay đổi thì không xut hin MsgBox.
- Ngược li (có thay đổi): xut hin MsgBox (Yes/No).
Tôi đã sử dụng thủ tục sau:
Mã:
[FONT=Verdana]Private Sub Workbook_BeforeClose(Cancel As Boolean)[/FONT]
[FONT=Verdana]If ThisWorkbook.Saved = False Then[/FONT]
[FONT=Verdana]   msgbx = MsgBox("Ban co muon luu nhung thay doi khong ?", vbDefaultButton1 + vbYesNo, "Save ?")[/FONT]
[FONT=Verdana]   If msgbx = vbNo Then[/FONT]
[FONT=Verdana]       ThisWorkbook.Close SaveChanges:=False[/FONT]
[FONT=Verdana]   Else:[/FONT]
[FONT=Verdana]       ThisWorkbook.Close SaveChanges:=True[/FONT]
[FONT=Verdana]   End If[/FONT]
[FONT=Verdana]End If[/FONT]
[FONT=Verdana]End Sub[/FONT]
Nhưng khi thử nghiệm nó bắt phi kích "yes" hoc "no" ti 2 ln mi chu đóng, ko hiểu sao na (file đính kèm).
Mong được chỉ giáo.
 

File đính kèm

Chào các bạn !
Vì muốn “thay đổi không khí” 1 chút mỗi khi đóng file: thay vì xuất hiện Msgbox của excel thì sẽ x/hiện 1 Msgbox của người dùng. Với yêu cầu:
- Nếu file không có thay đổi thì không xut hin MsgBox.
- Ngược li (có thay đổi): xut hin MsgBox (Yes/No).
Tôi đã sử dụng thủ tục sau:
Mã:
[FONT=Verdana]Private Sub Workbook_BeforeClose(Cancel As Boolean)[/FONT]
[FONT=Verdana]If ThisWorkbook.Saved = False Then[/FONT]
[FONT=Verdana]   msgbx = MsgBox("Ban co muon luu nhung thay doi khong ?", vbDefaultButton1 + vbYesNo, "Save ?")[/FONT]
[FONT=Verdana]   If msgbx = vbNo Then[/FONT]
[FONT=Verdana]       ThisWorkbook.Close SaveChanges:=False[/FONT]
[FONT=Verdana]   Else:[/FONT]
[FONT=Verdana]       ThisWorkbook.Close SaveChanges:=True[/FONT]
[FONT=Verdana]   End If[/FONT]
[FONT=Verdana]End If[/FONT]
[FONT=Verdana]End Sub[/FONT]
Nhưng khi thử nghiệm nó bắt phi kích "yes" hoc "no" ti 2 ln mi chu đóng, ko hiểu sao na (file đính kèm).
Mong được chỉ giáo.
Sửa lại thành vầy xem:
PHP:
Sub CloseWB()
  Dim msgbx As Long
  Application.EnableEvents = False
  If ThisWorkbook.Saved = False Then
    msgbx = MsgBox("Ban co muon luu nhung thay doi khong ?", vbDefaultButton1 + vbYesNo, "Save ?")
    ThisWorkbook.Close (msgbx = 6)
  End If
  Application.EnableEvents = True
End Sub
PHP:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  CloseWB
End Sub
 

File đính kèm

Upvote 0
Lẽ ra phải làm thêm nút Cancel nữa mới đúng "gu" phải không ạ, mà làm cái Application.Quit luôn chứ để cái cửa sổ trống rỗng mất công tắt lần nữa hen? Thầy NDU làm luôn đi.
 
Lần chỉnh sửa cuối:
Upvote 0
--> NDU: Cảm ơn thầy, file thầy sửa đúng như ý tôi muốn.
Thì ra là thiếu : Application.EnableEvents = False / Application.EnableEvents = True.
Riêng chỗ này tôi vẫn chưa hiểu để làm gì: (msgbx = 6)
Lẽ ra phải làm thêm nút Cancel nữa mới đúng "gu" phải không ạ, mà làm cái Application.Quit luôn chứ để cái cửa sổ trống rỗng mất công tắt lần nữa hen? Thầy NDU làm luôn đi.
Đúng như minhthien, nên thêm nút Cancel nữa.
File của nghiaphuc thấy chạy ngon nhưng code, hàm trong đó phức tạp quá.
 
Upvote 0
Chào các bạn !
Vì muốn “thay đổi không khí” 1 chút mỗi khi đóng file: thay vì xuất hiện Msgbox của excel thì sẽ x/hiện 1 Msgbox của người dùng. Với yêu cầu:
- Nếu file không có thay đổi thì không xut hin MsgBox.
- Ngược li (có thay đổi): xut hin MsgBox (Yes/No).
Tôi đã sử dụng thủ tục sau:
Mã:
[FONT=Verdana]Private Sub Workbook_BeforeClose(Cancel As Boolean)[/FONT]
[FONT=Verdana]If ThisWorkbook.Saved = False Then[/FONT]
[FONT=Verdana]   msgbx = MsgBox("Ban co muon luu nhung thay doi khong ?", vbDefaultButton1 + vbYesNo, "Save ?")[/FONT]
[FONT=Verdana]   If msgbx = vbNo Then[/FONT]
[FONT=Verdana]       ThisWorkbook.Close SaveChanges:=False[/FONT]
[FONT=Verdana]   Else:[/FONT]
[FONT=Verdana]       ThisWorkbook.Close SaveChanges:=True[/FONT]
[FONT=Verdana]   End If[/FONT]
[FONT=Verdana]End If[/FONT]
[FONT=Verdana]End Sub[/FONT]
Nhưng khi thử nghiệm nó bắt phi kích "yes" hoc "no" ti 2 ln mi chu đóng, ko hiểu sao na (file đính kèm).
Mong được chỉ giáo.
Nguyên nhân:
Bạn sử dụng sự kiện BeforeClose nhưng trong code này bạn lại sử dụng lệnh ThisWorkbook.Close
Khi bạn đóng file, sự kiện BeforeClose phát sinh, code được thực thi.
Khi code thực thi đến đoạn ThisWorkbook.Close sự kiên BeforeClose lại phát sinh và code lại được thực thi.

Khắc phục:
Vô hiệu hóa các sự kiện bằng cách chèn thêm cặp lệnh như sau:
PHP:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.EnableEvents = False
...
Application.EnableEvents = True
End Sub
Lẽ ra phải làm thêm nút Cancel nữa mới đúng "gu" phải không ạ, mà làm cái Application.Quit luôn chứ để cái cửa sổ trống rỗng mất công tắt lần nữa hen? Thầy NDU làm luôn đi.
Nếu còn những Workbook khác đang mở thì sao? Không thể tắt ứng dụng ngang như vậy được. Nếu muốn làm như vậy bạn phải có thêm một dòng lệnh kiểm tra xem có còn Workbook nào đang mở nữa không. Dùng lệnh này chẳng hạn:
PHP:
Application.Workbooks.Count
 
Upvote 0
Riêng chỗ này tôi vẫn chưa hiểu để làm gì: (msgbx = 6)
vbYes = 6 (Bôi đen chữ MsgBox rồi bấm F1 sẽ biết chi tiết) ---> Vậy nếu ta bấm nút Yes thì đoạn:
ThisWorkbook.Close (msgbx = 6)
sẽ tương đương với
ThisWorkbook.Close (True) ---> Tức là ĐÓNG VÀ LƯU
Ngược lại, nếu bấm No thì:
ThisWorkbook.Close (msgbx = 6)
sẽ tương đương với
ThisWorkbook.Close (False) ---> Tức là ĐÓNG VÀ KHÔNG LƯU
(Chỉ là phép so sánh thông thường thôi mà)
 
Upvote 0
Tại sao nếu có cái này thì không thể có cái kia?
Nếu ThisWorkbook.Close trước, thì Application.Quit không xảy ra và ngược lại?
Cách giải quyết như thế nào nếu sau khi sự kiện này xảy ra rồi tiếp theo là sự kiện kia.
 
Upvote 0
Tại sao nếu có cái này thì không thể có cái kia?
Nếu ThisWorkbook.Close trước, thì Application.Quit không xảy ra và ngược lại?
Cách giải quyết như thế nào nếu sau khi sự kiện này xảy ra rồi tiếp theo là sự kiện kia.
Dể hiểu thôi, vì code nằm trong Thisworkbook ---> Đóng nó rồi thì code cũng đóng theo, lấy quái gì làm tiếp nữa được!
Mấy vụ đóng, mở Workbook này rất "tinh tế" ---> Một vài trường hợp đặc biệt phải cần đến Class Module mới thực hiện được
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom