Lại phát hiện một hiện tượng lạ khi UserForm Show (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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
Tôi tạo một hàm:

Mã:
Option Explicit
Public gicungduoc
Public modal As Boolean


Function nhangiatri(ByVal gicungchoi)
    If modal Then
[COLOR=#ff0000][B]        UserForm1.Show[/B][/COLOR]
    Else
[B][COLOR=#ff0000]        UserForm1.Show modal[/COLOR][/B]
    End If
[COLOR=#0000cd]    gicungchoi.Value = gicungduoc[/COLOR]
End Function

Và 2 thủ tục, chỉ khác nhau ở biến modal:

Mã:
Sub test1()
    modal = [COLOR=#ff0000][B]True[/B][/COLOR]
    nhangiatri Range("B1")
End Sub


Sub test2()
    modal = [COLOR=#ff0000][B]False[/B][/COLOR]
    nhangiatri Range("B2")
End Sub

Trong Form tôi chỉ cho biến public nhận giá trị từ TextBox:

Mã:
Private Sub TextBox1_Change()
    gicungduoc = TextBox1
End Sub

Sau đó tôi gán macro Test1, Test2 cho 2 Button 1 và 2.

Khi bấm Button 1: Gõ gì đó lên Form, thoát Form, B1 nhận giá trị gì đó.

Khi bấm Button 2: Form hiện lên, nếu B2 có giá trị gì đó thì tự động biến mất (hoặc gán giá trị của lần trước), khi thoát form, không gán giá trị gì cả. Lần bấm nút 2 thì lại gán giá trị của lần trước khi form vừa show.

Các Anh Chị giải thích vấn đề 2 như thế nào đi ạ. Lâu lâu phát hiện mấy cái này cũng thật đau đầu đó.
 

File đính kèm

Mọi chuyện ổn cả, chỉ do chưa hiểu về Show mà thôi. Khi Show TRUE ̣thì mọi dòng code sau Show được thực hiện sau khi đóng Form. Vậy khi modal = TRUE thì dòng gicungchoi.Value = gicungduoc được thực hiện khi đã đóng Form, lúc này gicungduoc đã có giá trị của Texbox. Khi modal = False thì control không dừng ở dòng Show mà chạy đến hết code. Tức dòng gicungchoi.Value = gicungduoc được thực hiện ngay sau khi thực hiện dòng Show, khi Form vẫn đang hiển thị. Rõ ràng lúc này gicungduoc = "" (lần đầu Show) hoặc giá trị của lần trước (khi Show các lần sau). Khi đóng Form thì chả có gì được nhập xuống B2 nữa vì dòng gicungchoi.Value = gicungduoc đã được thực hiện xong từ ngay sau khi Show rồi.
modal = True là control dừng cho tới khi đóng Form, modal = False là control chuyển ngay sang các dòng tiếp theo. Trong help có ghi rõ

When a UserForm is modal, the user must respond before using any other part of the application. No subsequent code is executed until the UserForm is hidden or unloaded. Although other forms in the application are disabled when a UserForm is displayed, other applications are not.


Ngoài ra chạy code từng bước sẽ thấy th1 dừng ở dòng Show, th2 không dừng.
---------------
 
Upvote 0
Mọi chuyện ổn cả, chỉ do chưa hiểu về Show mà thôi. Khi Show TRUE ̣thì mọi dòng code sau Show được thực hiện sau khi đóng Form. Vậy khi modal = TRUE thì dòng gicungchoi.Value = gicungduoc được thực hiện khi đã đóng Form, lúc này gicungduoc đã có giá trị của Texbox. Khi modal = False thì control không dừng ở dòng Show mà chạy đến hết code. Tức dòng gicungchoi.Value = gicungduoc được thực hiện ngay sau khi thực hiện dòng Show, khi Form vẫn đang hiển thị. Rõ ràng lúc này gicungduoc = "" (lần đầu Show) hoặc giá trị của lần trước (khi Show các lần sau). Khi đóng Form thì chả có gì được nhập xuống B2 nữa vì dòng gicungchoi.Value = gicungduoc đã được thực hiện xong từ ngay sau khi Show rồi.
modal = True là control dừng cho tới khi đóng Form, modal = False là control chuyển ngay sang các dòng tiếp theo. Trong help có ghi rõ

When a UserForm is modal, the user must respond before using any other part of the application. No subsequent code is executed until the UserForm is hidden or unloaded. Although other forms in the application are disabled when a UserForm is displayed, other applications are not.


Ngoài ra chạy code từng bước sẽ thấy th1 dừng ở dòng Show, th2 không dừng.
---------------

Tôi thừa biết và biết cách làm cho nó chạy đúng ý đồ của mình luôn!

Sẳn bài này tôi đố các bạn làm sao thực hiện ở Button 2 mà kết quả như ở Button 1? Tôi thì có 2 cách đó!
 
Upvote 0
Tôi thừa biết và biết cách làm cho nó chạy đúng ý đồ của mình luôn!


Thì cũng nghĩ là anh biết. Nhưng anh đề nghị mọi người giải thích cơ mà.

Các Anh Chị giải thích vấn đề 2 như thế nào đi ạ


Giải thích xong thì anh nói vậy. Chán.
 
Upvote 0
Tôi thừa biết và biết cách làm cho nó chạy đúng ý đồ của mình luôn!


Thì cũng nghĩ là anh biết. Nhưng anh đề nghị mọi người giải thích cơ mà.

Các Anh Chị giải thích vấn đề 2 như thế nào đi ạ


Giải thích xong thì anh nói vậy. Chán.

Vậy làm thử vụ kia luôn đi! ;;;;;;;;;;;}}}}}--=0
 
Upvote 0
người ta bị anh dụ 1 lần chắc sợ rồi . lêu lêu **~****~****~**
Ý của mình là có giải pháp không, nhưng lại viết như thế đúng là phần lỗi về mình! Mà thôi, giải pháp nhiều kiểu nhưng mọi người khi viết code nên lường trước trường hợp đó xảy ra là được.
 
Upvote 0
Web KT

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

Back
Top Bottom