
excel
使用excel的Userform,可以创建一个自定义的用户界面,以便用户输入数据或进行操作。有时候,我们可能希望在用户使用Userform时隐藏excel应用程序,但仍然在任务栏中显示一个图标,以便用户可以方便地切换回excel。在本文中,我们将介绍如何实现这个功能,并提供一个案例代码供参考。
首先,让我们来看一下如何创建一个简单的Userform。打开excel,并按下Alt + F11打开Visual Basic for Applications(VBA)编辑器。在左侧的“项目-项目资源管理器”窗格中,双击“这台电脑”以展开项目树。然后,双击“Microsoft excel对象”以展开excel对象。双击“这个工作簿”以打开代码窗口。在代码窗口中,输入以下代码:Private Sub Workbook_Open() UserForm1.ShowEnd Sub这段代码将在工作簿打开时自动显示Userform1。现在,我们需要创建一个Userform,并将其命名为“Userform1”。在VBA编辑器中,选择“插入-用户窗体”以创建一个新的Userform。然后,将Userform的属性“ShowModal”设置为False,以便我们可以隐藏excel应用程序。接下来,让我们来看一下如何在任务栏中显示一个图标。在VBA编辑器中,选择“插入-模块”以创建一个新的模块。在模块中,输入以下代码:
Option ExplicitPrivate Declare PtrSafe Function Shell_NotifyIconA Lib "shell32.dll" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As BooleanPrivate Declare PtrSafe Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)Private Type NOTIFYICONDATA cbSize As Long hwnd As LongPtr uID As Long uFlags As Long uCallbackMessage As LongPtr hIcon As LongPtr szTip As String * 64End TypePrivate Const NIM_ADD As Long = &H0Private Const NIM_MODIFY As Long = &H1Private Const NIM_DELETE As Long = &H2Private Const WM_MOUSEMOVE As Long = &H200Private Const WM_LBUTTONDOWN As Long = &H201Private Const WM_LBUTTONUP As Long = &H202Private Const WM_LBUTTONDBLCLK As Long = &H203Private Const WM_RBUTTONDOWN As Long = &H204Private Const WM_RBUTTONUP As Long = &H205Private Const WM_RBUTTONDBLCLK As Long = &H206Private Const NIF_MESSAGE As Long = &H1Private Const NIF_ICON As Long = &H2Private Const NIF_TIP As Long = &H4Private Const WM_USER As Long = &H400Private Sub AddNotificationIcon() Dim nid As NOTIFYICONDATA nid.cbSize = Len(nid) nid.hwnd = ThisWorkbook.Application.hwnd nid.uID = 1 nid.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE nid.uCallbackMessage = WM_USER + 103 nid.hIcon = ThisWorkbook.Application.Icon nid.szTip = "excel" Call Shell_NotifyIconA(NIM_ADD, nid)End SubPrivate Sub DeleteNotificationIcon() Dim nid As NOTIFYICONDATA nid.cbSize = Len(nid) nid.hwnd = ThisWorkbook.Application.hwnd nid.uID = 1 Call Shell_NotifyIconA(NIM_DELETE, nid)End SubPrivate Sub Workbook_Open() UserForm1.Show Call AddNotificationIconEnd SubPrivate Sub Workbook_BeforeClose(Cancel As Boolean) Call DeleteNotificationIconEnd SubPublic Sub HandleNotificationIconMessage(ByVal lngMsg As Long) Select Case lngMsg Case WM_LBUTTONUP ThisWorkbook.Application.Visible = True UserForm1.Show Case WM_RBUTTONUP MsgBox "右键菜单" End SelectEnd Sub这段代码使用了Windows API来添加和删除任务栏中的图标,并处理图标的鼠标消息。具体来说,我们使用了Shell_NotifyIconA函数来添加和删除图标,使用了CopyMemory函数来在VBA中使用自定义的数据类型。在代码中,我们将Userform1的属性“hwnd”作为图标的父窗口句柄,并将Userform1的图标作为图标的句柄。我们还设置了一个自定义的消息号“WM_USER + 103”,以便在用户单击图标时接收到消息。最后,我们需要在Userform1的代码窗口中添加以下代码:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = vbFormControlMenu Then Cancel = True Me.Hide End IfEnd Sub这段代码在用户尝试关闭Userform1时拦截关闭操作,并隐藏Userform1而不是关闭它。现在,我们已经完成了代码的编写。保存并关闭VBA编辑器。双击excel工作簿以打开它,你将看到excel应用程序被隐藏了,但在任务栏中显示了一个图标。当你单击图标时,Userform1将重新显示。案例代码:
VBAPrivate Sub Workbook_Open() UserForm1.ShowEnd SubPrivate Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = vbFormControlMenu Then Cancel = True Me.Hide End IfEnd SubPrivate Sub AddNotificationIcon() Dim nid As NOTIFYICONDATA nid.cbSize = Len(nid) nid.hwnd = ThisWorkbook.Application.hwnd nid.uID = 1 nid.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE nid.uCallbackMessage = WM_USER + 103 nid.hIcon = ThisWorkbook.Application.Icon nid.szTip = "excel" Call Shell_NotifyIconA(NIM_ADD, nid)End SubPrivate Sub DeleteNotificationIcon() Dim nid As NOTIFYICONDATA nid.cbSize = Len(nid) nid.hwnd = ThisWorkbook.Application.hwnd nid.uID = 1 Call Shell_NotifyIconA(NIM_DELETE, nid)End SubPublic Sub HandleNotificationIconMessage(ByVal lngMsg As Long) Select Case lngMsg Case WM_LBUTTONUP ThisWorkbook.Application.Visible = True UserForm1.Show Case WM_RBUTTONUP MsgBox "右键菜单" End SelectEnd Sub通过使用excel的Userform和Windows API,我们可以实现在隐藏excel应用程序的同时在任务栏中显示一个图标的功能。这对于需要用户输入数据或进行操作的excel应用程序非常有用。希望本文对你有所帮助!
Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号