Excel用户窗体中添加最小化按钮及窗体最小化的代码实现

2022-08-10 08:56:18 浏览数 (1)

文章背景:用户窗体是Excel中的UserForm对象。在使用UserForm时,曾经目前遇到过两个问题。

  • 新建UserForm窗体时,默认是没有最大化和最小化按钮的,只有一个关闭按钮。
  • 在某个按钮的任务执行完毕后,希望用户窗体可以自动最小化,省去手动点击最小化按钮的麻烦。 在网上搜索一番后,找到了解决上述这两个问题的相关代码。接下来对此进行介绍。我的电脑环境:win10,64位;office 2016。
  1. UserForm中添加最大化、最小化按钮。

双击UserForm1窗体,进入代码编辑界面,输入如下代码:

代码语言:javascript复制
Option Explicit

'用于窗体最大最小化按钮的设置
'参考资源:https://blog.csdn.net/u010280075/article/details/84888744
Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_THICKFRAME As Long = &H40000 '(恢复大小)
Private Const WS_MINIMIZEBOX As Long = &H20000 '(最小化)
Private Const WS_MAXIMIZEBOX As Long = &H10000 '(最大化)

Private Sub UserForm_Initialize()

   '窗体添加最大最小化按钮
    
   Dim hWndForm As Long
   Dim IStyle As Long
   hWndForm = FindWindow("ThunderDFrame", Me.Caption)
   IStyle = GetWindowLong(hWndForm, GWL_STYLE)
   IStyle = IStyle Or WS_THICKFRAME '还原
   IStyle = IStyle Or WS_MINIMIZEBOX '最小化
   IStyle = IStyle Or WS_MAXIMIZEBOX '最大化
   SetWindowLong hWndForm, GWL_STYLE, IStyle

End Sub

主要涉及两大块代码,一块在模块级变量区域;一块在UserForm的初始化(Initialize)行为内部。运行UserForm窗体,得到如下结果:

可以看到,此时UserForm1中有了最大化和最小化按钮。

  1. 最小化用户窗体的代码实现

以一个简单的命令按钮为例。在userForm添加一个命令按钮(CommandButton1),Caption取名为最小化。接下来同样需要在代码窗口内输入两大块代码。在模块级变量区域,也就是第一个sub过程之前,添加如下代码:

代码语言:javascript复制
'用于最小化窗体的代码实现
'参考资料:http://club.excelhome.net/thread-878927-1-1.html
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_SYSCOMMAND = &H112
Private Const SC_MINIMIZE = &HF020&

在CommandButton1的点击(click)行为内部,输入如下代码:

代码语言:javascript复制
Private Sub CommandButton1_Click()

    Dim hWndForm As Long
    hWndForm = FindWindow("ThunderDFrame", Me.Caption)
    
    SendMessage hWndForm, WM_SYSCOMMAND, SC_MINIMIZE, ByVal 0&         '注释:使窗体最小化
    
End Sub

通过点击CommandButton1按钮,可以看到,UserForm1实现了最小化,隐藏在了视窗界面的左下角。

视频演示:http://mpvideo.qpic.cn/0b78kqaaaaaawmagafrnarpvavgdabkaaaaa.f10002.mp4?

参考资料:

  1. VBA窗体最大化最小化按钮实现(https://ddz.red/uiOTy
  2. 在VBA代码中最小化当前窗体(https://ddz.red/Ku7ey

0 人点赞