Thử vầy xem: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 ạ?
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
Sao em copy code của thầy vào module thì nó báo lỗi Expected: Sub or FunctionThử vầy xem:
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ạiMã: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
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
Nếu bạn dùng Excel 2007 thì hãy tự sửa hàm API bằng cách bỏ mấy cái PtrSafe và thay LongPtr thành Long thử xemSao em copy code của thầy vào module thì nó báo lỗi Expected: Sub or Function
Dạ cảm ơn thầy . Có cách nào để kiểm tra Form đang hiện không thầyNếu bạn dùng Excel 2007 thì hãy tự sửa hàm API bằng cách bỏ mấy cái PtrSafe và thay LongPtr thành Long thử xem
(giờ còn ai xài 2007 nữa trời?)
Ủ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?Dạ cảm ơn thầy . Có cách nào để kiểm tra Form đang hiện không thầy
Em tạo ra 2 userform tên là "BangDuLieu" và "TieuChuanVN".Ủ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?
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
IsFormLoaded("BangDuLieu") là sai. Vì "BangDuLieu" không phải là Caption của UserForm BangDuLieuEm 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:
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âmMã: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
À tại em không đọc kỹ. Cảm ơn thầy lần nữa ạ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?
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
Cái này đơn giản hơn nè. Cảm ơn bác nhaBạn cũng có thể thử đơn giản như vầy:
Chỉ là bê nguyên sơri code của bạn, sửa có 1 chút xíu à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
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 bangdulieuBạn cũng có thể thử đơn giản như vầy:
Chỉ là bê nguyên sơri code của bạn, sửa có 1 chút xíu à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
![]()
Bạn test lại thử
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
thì tôi chẳng đưa API lên làm gì cho rách việcKhi 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ầ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
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 ạ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