Hỏi về đóng, mở Form và cập nhật màn hình

Liên hệ QC

hoangdanh282vn

Nguyễn Cảnh Hoàng Danh
Thành viên danh dự
Tham gia
21/12/07
Bài viết
1,902
Được thích
5,303
Nghề nghiệp
Kinh doanh các mặt hàng văn phòng phẩm
Mình có 1 Form chính và 2 Form nhập liệu với tên lần lượt là : Main, Userform1, UserForm2

Trên Form chính có 3 cmd :
cmd1 : dùng để Show Userform1 và đóng Main
cmd2 : dùng để Show Userform2 và đóng Main
cmd3 : dùng để đóng Main

Trên Userform1 có 1 cmd dùng để đóng Userform1 và Show Main

Trên Userform2 có 1 cmd dùng để đóng Userform2 và Show Main

======================#=========================

Khi File được mở thì sẽ Show Form Main.
Trên Main, khi ta click vào cmd1 thì đóng Main và Show Userform1. Trên Userform1, nếu ta nhấn cmd thoát thì sẽ đóng Userform1 và Show Main. Trên Main, ta lại nhấn cmd 2 để gọi Userform2 và đóng Main. Trên Userform2, nếu ta nhấn cmd thoát thì sẽ đóng Userform2 và Show Main.

Với qui trình trên thì không có gì xảy ra. Code chạy tốt.

Giả sử trên Userform1, Userform2 có thêm vài textbox, Comboxbox.. để nạp dữ liệu từ sheet lên Userform khi Userform1, Userform2 được mở. Vẫn không có vấn đề gì xảy ra.

Nhưng khi ta viết thêm code để mở một file mới, copy dữ liệu dán vào sheet trong file chương trình, sau đó sẽ nạp dữ liệu từ Sheet lên trên Userform1 và Userform2 thì có vần đề xảy ra.

Khi Form Main được mở, nhấn cmd1 gọi UserForm1, UserForm1 được mở, khi nhấn nút đóng UserForm1 thì Main được mở và UserForm1 vẫn không chịu "mất đi". Tương tự khi nhấn cmd2, mở UserForm2 và thoát thì ta sẽ có 3 UserForm hiện trên màn hình.

3 Form này hiện cùng một lúc trên màn hình theo mình là do cập nhật màn hình thôi chứ thật ra có 2 UserForm đã được đóng lại. Có lẽ lỗi này do Code Copy, dán dữ liệu từ file này qua file kia, sau đó nạp lên Form gây ra. Và khi ta dùng chuột kéo rê Form đi chổ khác thì một hình ảnh thứ 2 của Form được tạo ra.

Các bạn có thể chỉ mình cách khắc phục lỗi này.

Một câu hỏi nữa là làm sao để cố định vị trí của Userform, không cho người sử dụng dùng chuột để kéo Form đi chổ khác.

Mình xin cảm ơn.
 

File đính kèm

Lần chỉnh sửa cuối:
Có thể do trong code thực hiện các lệnh copy, paste... đã có lệnh đặt screenupdate = false và sau đó chưa hoàn trả lại giá trị true đã gây nên vấn đề.
Nhưng thắc mắc là: nếu chỉ do sự cập nhật màn hình gây ra thì bạn đã không thể kéo userform được, vì đó chỉ là ảnh còn lưu lại.
Nếu có thể được, bạn hãy xóa bớt dữ liệu và gửi các file lên để các anh em có cơ sở để chẩn bệnh.
 
Upvote 0
Danh thử chỉnh chế độ ShowModal của form là False thử xem!
 
Upvote 0
Và khi ta dùng chuột kéo rê Form đi chổ khác thì một hình ảnh thứ 2 của Form được tạo ra.

Chắc giống như Hoàng tiên sinh nói thôi. Thử khi kết thúc các Sub đều cho Application.ScreenUpdating = True xem sao
Một câu hỏi nữa là làm sao để cố định vị trí của Userform, không cho người sử dụng dùng chuột để kéo Form đi chổ khác.

Không được, vì không có Event Userform Move. Bởi vì nó thuộc quyền quản lý của Wins rồi.
Còn không, mỗi lần xuất hiện 1 event nào đó thì đều kiểm tra xem vị trí của Userform (Top - Left) có đúng như lúc đầu không, nếu sai thì cho trở về đầu tiên.
Để đơn giản hơn thì dùng xảo thuật : Cho Form ở chế độ toàn màn hình, như vậy khỏi chuyển đi đâu hết.

Khi Form Main được mở, nhấn cmd1 gọi UserForm1, UserForm1 được mở, khi nhấn nút đóng UserForm1 thì Main được mở và UserForm1 vẫn không chịu "mất đi". Tương tự khi nhấn cmd2, mở UserForm2 và thoát thì ta sẽ có 3 UserForm hiện trên màn hình.
Đã có lỗi logic trong giải thuật xảy ra. Phải đưa File VD cho trường hợp này thì anh em đồng đạo mới kiến giải được.

Danh thử chỉnh chế độ ShowModal của form là False thử xem!
cái này không liên quan đến mấy cái thứ ở trên.

-- CV--
 
Upvote 0
Việc các Form vẫn không ẩn đi theo ý muốn tôi cũng nghĩ là do thuộc tính ScreenUpdating gây nên. Còn việc không muốn cho người dùng kéo Form ra chỗ khác thì có thể thử đoạn code sau cho Form cần xử lý.
Mã:
Dim fTop, fLeft

Private Sub UserForm_Initialize()
    fTop = Me.Top
    fLeft = Me.Left
End Sub

Private Sub UserForm_Layout()
    Application.ScreenUpdating = False
    Me.Top = fTop
    Me.Left = fLeft
    Application.ScreenUpdating = True
End Sub
 
Upvote 0
Cảm ơn các anh rất nhiều.

Về giải thuật thì không có lỗi gì cả, có thể khi trình bày em có ghi sót từ diễn tả. Trong file đính kèm em có minh họa giải thuật đóng mở Form.

Em sẽ kiểm tra lại code copy paste dữ liệu xem có sót cái Application.ScreenUpdating=True hay không. Nếu không được nữa thì em sẽ gửi kèm file nhờ các anh giúp đỡ (Vì file hơi nặng và cũng hơi phức tạp nên em chưa post lên)
 
Upvote 0
Web KT

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

Back
Top Bottom