Kiểm tra Userform có hiện không? (1 người xem)

Liên hệ QC

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

hsm.ksxd

Thành viên chính thức
Tham gia
24/8/17
Bài viết
77
Được thích
5
Giới tính
Nam
Các bác cho em hỏi trong VBA có hàm nào để kiểm tra 1 userform có hiện (Show) không ạ?
 
Các bác cho em hỏi trong VBA có hàm nào để kiểm tra 1 userform có hiện (Show) không ạ?
Thử vầy xem:
Mã:
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Function IsFormLoaded(ByVal frmCaption As String) As Boolean
  IsFormLoaded = FindWindow("ThunderDFrame", frmCaption) > 0
End Function
Kiểm tra Form tên là "UserForm1", ta dùng hàm isFormLoaded("UserForm1") ---> Kết quả trả về =TRUE nghĩa là form đang load và ngược lại
Lưu ý: Hàm chỉ kiểm tra Form có load hay không chỉ không kiểm tra tính "ẩn hiện" của form
 
Upvote 0
Thử vầy xem:
Mã:
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Function IsFormLoaded(ByVal frmCaption As String) As Boolean
  IsFormLoaded = FindWindow("ThunderDFrame", frmCaption) > 0
End Function
Kiểm tra Form tên là "UserForm1", ta dùng hàm isFormLoaded("UserForm1") ---> Kết quả trả về =TRUE nghĩa là form đang load và ngược lại
Lưu ý: Hàm chỉ kiểm tra Form có load hay không chỉ không kiểm tra tính "ẩn hiện" của form
Sao em copy code của thầy vào module thì nó báo lỗi Expected: Sub or Function
 

File đính kèm

  • Untitled.jpg
    Untitled.jpg
    129.6 KB · Đọc: 5
Upvote 0
Ủa? Chứ từ đầu đến giờ mình đang làm gì? Hàm ở trên không kiểm tra được form đang "hiện" sao?
Em tạo ra 2 userform tên là "BangDuLieu" và "TieuChuanVN".
Trong userform "TieuChuanVN" có 1 ComandBox tên là CHON và 1 Listbox tên là DMTCVN
Trong userform "BangDuLieu" có 1 Textbox tên là Txt_TCNT và 1 ComandBox tên là Cmd_TCNT.
Khi Click vào Cmd_TCNT thì sẽ show userform "TieuChuanVN". Khi click vào CHON thì sẽ kiểm tra userform "BangDuLieu" có hiện không? Nếu hiện thì sẽ ghi giá trị DMTCVN vào Txt_TCVN nếu không hiện thì ghi vào ActiveCell.
Em viết code của ComandBox CHON như sau:
Mã:
Giatri = DMTCVN.Value
    If IsFormLoaded("BangDuLieu") = True Then
        BangDuLieu.Txt_TCNT.Value = Giatri
    ElseIf IsFormLoaded("BangDuLieu") = False Then
        ActiveCell.Value = Giatri 'Dat gia tri ban chon vao o hien tai
        Sheets("Sheet2").Range("A3").Value = KieuNhap_TCVN.Value
    End If
    Unload TieuChuanVN
Nhưng dù userform "BangDuLieu" có hiện hay không thì giá trị của DMTCVN đều ghi vào ActiveCell cả. Thầy xem file em đính kèm đây ạ. Cảm ơn thầy đã quan tâm
 

File đính kèm

Upvote 0
Em tạo ra 2 userform tên là "BangDuLieu" và "TieuChuanVN".
Trong userform "TieuChuanVN" có 1 ComandBox tên là CHON và 1 Listbox tên là DMTCVN
Trong userform "BangDuLieu" có 1 Textbox tên là Txt_TCNT và 1 ComandBox tên là Cmd_TCNT.
Khi Click vào Cmd_TCNT thì sẽ show userform "TieuChuanVN". Khi click vào CHON thì sẽ kiểm tra userform "BangDuLieu" có hiện không? Nếu hiện thì sẽ ghi giá trị DMTCVN vào Txt_TCVN nếu không hiện thì ghi vào ActiveCell.
Em viết code của ComandBox CHON như sau:
Mã:
Giatri = DMTCVN.Value
    If IsFormLoaded("BangDuLieu") = True Then
        BangDuLieu.Txt_TCNT.Value = Giatri
    ElseIf IsFormLoaded("BangDuLieu") = False Then
        ActiveCell.Value = Giatri 'Dat gia tri ban chon vao o hien tai
        Sheets("Sheet2").Range("A3").Value = KieuNhap_TCVN.Value
    End If
    Unload TieuChuanVN
Nhưng dù userform "BangDuLieu" có hiện hay không thì giá trị của DMTCVN đều ghi vào ActiveCell cả. Thầy xem file em đính kèm đây ạ. Cảm ơn thầy đã quan tâm
IsFormLoaded("BangDuLieu") là sai. Vì "BangDuLieu" không phải là Caption của UserForm BangDuLieu
Bạn có biết Caption là cái gì không?
 
Upvote 0
Bạn cũng có thể thử đơn giản như vầy:
Mã:
Private Sub CHON_Click()
    Dim BColumn As Long
    Dim Giatri As Variant
   
    If KieuNhap_TCVN.Value = "Nh" & ChrW(7853) & "p theo Mã Tiêu chu" & ChrW(7849) & "n" Then
        BColumn = 2
    Else
        BColumn = 3
    End If
   
    DMTCVN.BoundColumn = BColumn 'Ngam dinh cot nhan du lieu trong ListBox
    Giatri = DMTCVN.Value
   
    If BangDuLieu.Visible Then
        BangDuLieu.Txt_TCNT.Value = Giatri
    Else
        ActiveCell.Value = Giatri 'Dat gia tri ban chon vao o hien tai
        Sheets("Sheet2").Range("A3").Value = KieuNhap_TCVN.Value
    End If
   
    Unload Me
End Sub
Chỉ là bê nguyên sơri code của bạn, sửa có 1 chút xíu à :)
Bạn test lại thử
 
Upvote 0
Bạn cũng có thể thử đơn giản như vầy:
Mã:
Private Sub CHON_Click()
    Dim BColumn As Long
    Dim Giatri As Variant
  
    If KieuNhap_TCVN.Value = "Nh" & ChrW(7853) & "p theo Mã Tiêu chu" & ChrW(7849) & "n" Then
        BColumn = 2
    Else
        BColumn = 3
    End If
  
    DMTCVN.BoundColumn = BColumn 'Ngam dinh cot nhan du lieu trong ListBox
    Giatri = DMTCVN.Value
  
    If BangDuLieu.Visible Then
        BangDuLieu.Txt_TCNT.Value = Giatri
    Else
        ActiveCell.Value = Giatri 'Dat gia tri ban chon vao o hien tai
        Sheets("Sheet2").Range("A3").Value = KieuNhap_TCVN.Value
    End If
  
    Unload Me
End Sub
Chỉ là bê nguyên sơri code của bạn, sửa có 1 chút xíu à :)
Bạn test lại thử
Cái này đơn giản hơn nè. Cảm ơn bác nha
 
Upvote 0
Vấn đề của bạn có khi chả liên quan tới ẩn hiện gì cả. Đơn giản là cần form tieuchuanvn lúc thì viết dữ liệu vào shet lúc thì viết vào form kia. Cách sử lý đơn giản thôi.


trền form tcvn thêm một dòng ở trên cùng:

public IsWriteToForm as boolean

Khi bấm nút bấm thì kiểm tra biến trên, bằng true thì viết dữ liệu vaoform bangdulieu ngược lại thì là shet.


Trên form Bangdulieu trước khi show form ctvn thì làm như sau:
tieuchuanvn.iswritetoform=true
tieuchuanvn.show


ở những nơi khác thì viết :
tieuchuanvn.iswritetoform=false
tieuchuanvn.show
 
Upvote 0
Bạn cũng có thể thử đơn giản như vầy:
Mã:
Private Sub CHON_Click()
    Dim BColumn As Long
    Dim Giatri As Variant
   
    If KieuNhap_TCVN.Value = "Nh" & ChrW(7853) & "p theo Mã Tiêu chu" & ChrW(7849) & "n" Then
        BColumn = 2
    Else
        BColumn = 3
    End If
   
    DMTCVN.BoundColumn = BColumn 'Ngam dinh cot nhan du lieu trong ListBox
    Giatri = DMTCVN.Value
   
    If BangDuLieu.Visible Then
        BangDuLieu.Txt_TCNT.Value = Giatri
    Else
        ActiveCell.Value = Giatri 'Dat gia tri ban chon vao o hien tai
        Sheets("Sheet2").Range("A3").Value = KieuNhap_TCVN.Value
    End If
   
    Unload Me
End Sub
Chỉ là bê nguyên sơri code của bạn, sửa có 1 chút xíu à :)
Bạn test lại thử
Thầy ndu giới thiệu cách api khả năng do cách này vô tình sẽ load form bangdulieu vào ram. cách chữa cháy là nếu form bangdulieu ẩn thì viết dữ liệu vào shet sau đó unload bangdulieu
 
Upvote 0
Hì hì, tui biết mục đích dùng API trên UserForm chứ. Nhưng do mục đích của người hỏi rành rành là "Kiểm tra Userform có hiện không?"

Dùng API thì mình xin mạo muội viết bậy hàm sau để xác định 1 UserForm có show hay không.
Mã:
Option Explicit

#If VBA7 Then
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function IsWindow Lib "user32" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function IsWindowVisible Lib "user32" (ByVal hwnd As LongPtr) As Long
#Else
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function IsWindowVisible Lib "user32" Alias "IsWindowVisible" (ByVal hwnd As Long) As Long
#End If

Public Function IsUserFormVisible(ByVal strFrmCaption As String) As Boolean
#If VBA7 Then
    Dim hwndFrm As LongPtr
#Else
    Dim hwndFrm As Long
#End If
   
    IsUserFormVisible = False
   
    hwndFrm = FindWindow("ThunderDFrame", strFrmCaption)
    If (hwndFrm > 0) Then
        IsUserFormVisible = IsWindow(hwndFrm) And IsWindowVisible(hwndFrm)
    End If
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Trên GPE thường có tình trạng thế này: Làm 1 dự án gì đó rồi bí ở 1 công đoạn. Lúc này người ta "tự nghĩ" ra hướng đi mà người ta cho là đúng rồi "quăng" câu hỏi lên nhờ giúp
Có đôi khi hướng đi thật sự đúng lại không giống như người ta đã nghĩ. Giống như topic này đây, nếu ngay từ đâu cho file lên, nói rõ rằng:
Khi Click vào Cmd_TCNT thì sẽ show userform "TieuChuanVN". Khi click vào CHON thì sẽ kiểm tra userform "BangDuLieu" có hiện không? Nếu hiện thì sẽ ghi giá trị DMTCVN vào Txt_TCVN nếu không hiện thì ghi vào ActiveCell.
thì tôi chẳng đưa API lên làm gì cho rách việc
 
Upvote 0
Thầy ndu giới thiệu cách api khả năng do cách này vô tình sẽ load form bangdulieu vào ram. cách chữa cháy là nếu form bangdulieu ẩn thì viết dữ liệu vào shet sau đó unload bangdulieu
Hì hì, tui biết mục đích dùng API trên UserForm chứ. Nhưng do mục đích của người hỏi rành rành là "Kiểm tra Userform có hiện không?"

Dùng API thì mình xin mạo muội viết bậy hàm sau để xác định 1 UserForm có show hay không.
Mã:
Option Explicit

#If VBA7 Then
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function IsWindow Lib "user32" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function IsWindowVisible Lib "user32" (ByVal hwnd As LongPtr) As Long
#Else
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function IsWindowVisible Lib "user32" Alias "IsWindowVisible" (ByVal hwnd As Long) As Long
#End If

Public Function IsUserFormVisible(ByVal strFrmCaption As String) As Boolean
#If VBA7 Then
    Dim hwndFrm As LongPtr
#Else
    Dim hwndFrm As Long
#End If
  
    IsUserFormVisible = False
  
    hwndFrm = FindWindow("ThunderDFrame", strFrmCaption)
    If (hwndFrm > 0) Then
        IsUserFormVisible = IsWindow(hwndFrm) And IsWindowVisible(hwndFrm)
    End If
End Function
Trên GPE thường có tình trạng thế này: Làm 1 dự án gì đó rồi bí ở 1 công đoạn. Lúc này người ta "tự nghĩ" ra hướng đi mà người ta cho là đúng rồi "quăng" câu hỏi lên nhờ giúp
Có đôi khi hướng đi thật sự đúng lại không giống như người ta đã nghĩ. Giống như topic này đây, nếu ngay từ đâu cho file lên, nói rõ rằng:

thì tôi chẳng đưa API lên làm gì cho rách việc
Cảm ơn các bác đã quan tâm. Để em rút kinh nghiệm lần sau sẽ nêu câu hỏi rõ ràng hơn. diễn đàn đã giúp em hiểu về excel rất nhiều. có gì mong các bác bỏ qua cho em ạ
 
Upvote 0

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

Back
Top Bottom