Lỗi Show Form khi UserForm_QueryClose

Liên hệ QC

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,720
Giới tính
Nam
File có 2 Form, mỗi Form có đoạn code:

Userform1:

PHP:
Dim closeForm As Boolean


Private Sub CommandButton1_Click()
  closeForm = False
  Unload Me
End Sub



Private Sub UserForm_Initialize()
  closeForm = True
End Sub



Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  If closeForm = True Then UserForm2.Show
End Sub

Userform2:

PHP:
Dim closeForm As Boolean



Private Sub CommandButton1_Click()
  closeForm = False
  Unload Me
End Sub



Private Sub UserForm_Initialize()
  closeForm = True
End Sub



Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  If closeForm = True Then UserForm1.Show
End Sub


Khi bấm nút thoát (X) của Form1, nó mở Form2, nhưng khi bấm nút thoát (X) của Form2 thì báo lỗi.

Xin cho hỏi tại sao và cách khắc phục!

Chân thành cảm ơn!
 

File đính kèm

Đọc thông báo lỗi => xử lý:
Set ShowModal = False cho cả 2 form.
(Có những thông báo lỗi khó hiểu như Run time error 123456 nhưng cũng có những thông báo lỗi rõ ràng đến mức đó)
 
Lần chỉnh sửa cuối:
Upvote 0
Đọc thông báo lỗi => xử lý:
Set ShowModal = False cho cả 2 form.
(Có những thông báo lỗi khó hiểu như Run time error 123456 nhưng cũng có những thông báo lỗi rõ ràng đến mức đó)

Em biết lỗi đó chứ Thầy, nhưng thật ra không đúng, bởi khi đã thoát Form, hoặc cứ thêm vào Unload Me đi, nó vẫn bị => nó không phải là lỗi show modal.
 
Upvote 0
Nhưng tôi đã sửa ShowModal = False, và không còn lỗi đó nữa!
 
Upvote 0
Nhưng tôi đã sửa ShowModal = False, và không còn lỗi đó nữa!

Em đồng ý với Thầy là như vậy và tối qua em cũng đã làm như vậy, tuy nhiên, có những Form ta không cho nó ở chế độ ShowModal=False. Cái em đang quan tâm là hình như với sự kiện đó, form đang ở trạng thái Hide chứ không phải Unload?!?!?
 
Upvote 0
Em đồng ý với Thầy là như vậy và tối qua em cũng đã làm như vậy, tuy nhiên, có những Form ta không cho nó ở chế độ ShowModal=False. Cái em đang quan tâm là hình như với sự kiện đó, form đang ở trạng thái Hide chứ không phải Unload?!?!?
Sửa thành vầy cho UserForm1
PHP:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  If closeForm = True Then VBA.UserForms.Add("UserForm2").Show
End Sub
Và UserForm2:
PHP:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  If closeForm = True Then VBA.UserForms.Add("UserForm1").Show
End Sub
 
Upvote 0
hình như với sự kiện đó, form đang ở trạng thái Hide chứ không phải Unload
Không đúng:
nên nhớ là sự kiện Form_QueryClose thực thi trước khi đóng form hiện thời (form hiện thời chưa đóng)
Nghĩa là trong thông báo lỗi: Form already displayed, can't show modally, chữ form đang nói tới form hiện hành, chứ không phải form đã đóng trước đó. Và can not show nghiã là can not show form còn lại.

Tuy vậy, lỗi chỉ phát sinh vào lần chạy thứ 2 (chỗ này đúng là không hiểu)

có những Form ta không cho nó ở chế độ ShowModal=False
Vậy dùng command button: đóng form này mở form kia!

Vả lại, sự kiện Form_QueryClose có 2 tham số Cancel và CloseMode, nếu không tận dụng được thì rất phí:

Trích help:

This event is typically used to make sure there are no unfinished tasks in the user forms included in an application before that application closes. For example, if a user hasn't saved new data in any UserForm, the application can prompt the user to save the data.
When an application closes, you can use the QueryClose event procedure to set the Cancel property to True, stopping the closing process.
PHP:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)     
'Prevent user from closing with the Close box in the title bar. '
    If CloseMode <> 1 Then Cancel = True     
Msgbox "The Close box won't work! Click me!" 
End Sub


---

 
Lần chỉnh sửa cuối:
Upvote 0
Note: Biến closeForm hình như chả cần thiết gì?
Giả sử set showmodal =False và xoá các dòng lệnh tương ứng với biến này, code vẫn chạy đúng ý đồ.
 
Upvote 0
Note: Biến closeForm hình như chả cần thiết gì?
Giả sử set showmodal =False và xoá các dòng lệnh tương ứng với biến này, code vẫn chạy đúng ý đồ.

Trời ơi, Thầy mà không dùng biến closeForm thì sẽ thấy hậu quả! Thầy thử nút lệnh là Unload me xem! Không có vụ unload không đâu! mà Form khác sẽ show ra đấy chứ! Cứ lòng vòng hoài luôn!

@ Thầy Ndu:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If
closeForm = True Then VBA.UserForms.Add("UserForm2").Show
End Sub


Code này có vẻ là hiện lên hiện xuống không thấy báo lỗi, nhưng nếu Thầy vừa bấm nút (X) xong và rê cái Form vừa show ra chỗ khác xem, có một Form tồn tại, và làm vài lần xem, 1 đóng Form luôn!
 
Upvote 0
Trời ơi, Thầy mà không dùng biến closeForm thì sẽ thấy hậu quả! Thầy thử nút lệnh là Unload me xem! Không có vụ unload không đâu! mà Form khác sẽ show ra đấy chứ! Cứ lòng vòng hoài luôn!
Điều này chứng tỏ rằng dùng QueryClose chưa hết chức năng (chưa dùng đến tham số CloseMode)
File đính kèm showModal = false (dĩ nhiên là không đúng ý thích của minhthien), và không cần biến closeForm.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Điều này chứng tỏ rằng dùng QueryClose chưa hết chức năng (chưa dùng đến tham số CloseMode)
File đính kèm showModal = false (dĩ nhiên là không đúng ý thích của minhthien), và không cần biến closeForm.
Nếu không thể khắc phục được lỗi này thì chỉ chọn giải pháp ShowModal=False thôi, cũng không hiểu như thế nào vì khi bẫy lỗi, mình đã cho Unload Me trước và dùng hàm check xem Form có đang load hay không, nó cũng vẫn lỗi. Còn khóa nút (X) thì không hay lắm mà để nút đó thì không theo ý đồ của mình. Cho đến thời điểm này, cách của Thầy là giải pháp vậy!
 
Upvote 0
Khoá nút X thì sao chứ?

Thông thường 1 project sẽ có 1 Main Form. Trên main form có các Button để làm 1 số các công việc. Nhấn button nào thì mở form của công việc đó:
PHP:
FormCongviec01.Show
Unload Me

Thêm 1 button exit để thoát Form quay về Application hoặc thoát hẳn Application tuỳ ý thích.

Các form của từng công việc sẽ có button "quay về Main":
PHP:
FormMain.Show
Unload Me

Vậy thì các form cứ việc Modal = true, cứ việc khoá nút X: Để khoá nút X thì đây là lúc sử dụng tham số Cancel của QueryClose:

PHP:
Sub Form_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then Cancel = True
End Sub

Đó là thiết kế cơ bản của 1 project.
 
Upvote 0
và dùng hàm check xem Form có đang load hay không, nó cũng vẫn lỗi
check gì mà check, đã nói rồi, form đang load trong câu thông báo lỗi là form chứa code (QueryClose) đang chạy, chứ không phải form đã unload lúc nãy. Form lúc nãy unload mất tiêu rồi.

bài 7 đã viết:
nên nhớ là sự kiện Form_QueryClose thực thi trước khi đóng form hiện thời (form hiện thời chưa đóng)
....
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom