专栏名称: 完美Excel
Excel与VBA技术学习与实践
目录
相关文章推荐
完美Excel  ·  VBA:创建可调整大小的用户窗体 ·  昨天  
Excel之家ExcelHome  ·  我写的Excel公式,不能让你随便改 ·  3 天前  
Excel之家ExcelHome  ·  频数计算很简单,搬砖搬到六十三 ·  4 天前  
Excel之家ExcelHome  ·  填充空白单元格的三种境界 ·  6 天前  
Excel之家ExcelHome  ·  筛选状态下的计算,模式化公式请收好 ·  1 周前  
51好读  ›  专栏  ›  完美Excel

VBA:移除用户窗体右上角的关闭按钮

完美Excel  · 公众号  · Excel  · 2024-09-09 05:30

正文

学习Excel技术,关注微信公众号:
excelperfect

标签:VBA用户窗体

有时候,我们可能需要禁用用户窗体上的关闭按钮[X]。例如,希望用户在关闭用户窗体之前必须要填写一些内容,或者设计带有进度条的用户窗体,或者隐藏关闭按钮可以使用户窗体看起来更友好。

最简单的方式是使用UserForm_QueryClose事件禁止对关闭按钮进行操作。例如:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = 0 Then   Cancel = True   MsgBox "已禁用关闭按钮[X].", vbCritical, "关闭按钮被禁用" End IfEnd Sub

但这种方式就用户体验而言不是太好,因为在用户点击关闭按钮后得到不能使用的消息,所以最好是隐藏关闭按钮,这样用户就不需要考虑单击关闭按钮了。

然而,在默认情况下,不能禁用用户窗体中的关闭按钮,但可以使用Windows API来实现。在VBE中,插入一个标准模块,输入下面的代码:

Private Const GWL_STYLE As Long = -16Private Const WS_SYSMENU As Long = &H80000#If VBA7 Then Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As StringAs LongPtr #If Win64 Then   Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongPtrA" (ByVal hWnd As LongPtr, ByVal nIndex As LongAs LongPtr   Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongPtrA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr #Else   Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As LongAs LongPtr   Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr #End If#Else Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As StringAs Long Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As LongAs Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As LongAs Long#End If
Public Sub RemoveCloseButton(frm As Object) #If VBA7 Then   Dim lStyle As LongPtr, lFrmHandle As LongPtr #Else Dim lStyle As Long, lFrmHandle As Long #End If lFrmHandle = FindWindow("ThunderDFrame", frm.Caption) lStyle = GetWindowLong(lFrmHandle, GWL_STYLE) lStyle = lStyle And Not WS_SYSMENU SetWindowLong lFrmHandle, GWL_STYLE, lStyleEnd Sub

然后,在要移除关闭按钮的用户窗体代码模块中,输入下面的代码:

Private Sub UserForm_Initialize() RemoveCloseButton MeEnd Sub

注意,在运行隐藏关闭按钮的代码之前,确保用户窗体上有一个可以用来关闭用户窗体的按钮。否则,你将只有回到VBE中停止代码运行才能关闭用户窗体。


欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。
欢迎到知识星球:完美Excel社群,进行技术交流和提问,获取更多电子资料,并通过社群加入专门的微信讨论群,更方便交流。