Excel Useform:如何隐藏应用程序但在任务栏中有图标

vbaexcel

1个回答

写回答

story_moko

2025-06-17 11:50

+ 关注

excel
excel

使用excel的Userform,可以创建一个自定义的用户界面,以便用户输入数据或进行操作。有时候,我们可能希望在用户使用Userform时隐藏excel应用程序,但仍然在任务栏中显示一个图标,以便用户可以方便地切换回excel。在本文中,我们将介绍如何实现这个功能,并提供一个案例代码供参考。

首先,让我们来看一下如何创建一个简单的Userform。打开excel,并按下Alt + F11打开Visual Basic for Applications(VBA)编辑器。在左侧的“项目-项目资源管理器”窗格中,双击“这台电脑”以展开项目树。然后,双击“Microsoft excel对象”以展开excel对象。双击“这个工作簿”以打开代码窗口。

在代码窗口中,输入以下代码:

Private Sub Workbook_Open()

UserForm1.Show

End Sub

这段代码将在工作簿打开时自动显示Userform1。现在,我们需要创建一个Userform,并将其命名为“Userform1”。在VBA编辑器中,选择“插入-用户窗体”以创建一个新的Userform。然后,将Userform的属性“ShowModal”设置为False,以便我们可以隐藏excel应用程序。

接下来,让我们来看一下如何在任务栏中显示一个图标。在VBA编辑器中,选择“插入-模块”以创建一个新的模块。在模块中,输入以下代码:

Option Explicit

Private Declare PtrSafe Function Shell_NotifyIconA Lib "shell32.dll" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean

Private 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 * 64

End Type

Private Const NIM_ADD As Long = &H0

Private Const NIM_MODIFY As Long = &H1

Private Const NIM_DELETE As Long = &H2

Private Const WM_MOUSEMOVE As Long = &H200

Private Const WM_LBUTTONDOWN As Long = &H201

Private Const WM_LBUTTONUP As Long = &H202

Private Const WM_LBUTTONDBLCLK As Long = &H203

Private Const WM_RBUTTONDOWN As Long = &H204

Private Const WM_RBUTTONUP As Long = &H205

Private Const WM_RBUTTONDBLCLK As Long = &H206

Private Const NIF_MESSAGE As Long = &H1

Private Const NIF_ICON As Long = &H2

Private Const NIF_TIP As Long = &H4

Private Const WM_USER As Long = &H400

Private 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 Sub

Private 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 Sub

Private Sub Workbook_Open()

UserForm1.Show

Call AddNotificationIcon

End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Call DeleteNotificationIcon

End Sub

Public Sub HandleNotificationIconMessage(ByVal lngMsg As Long)

Select Case lngMsg

Case WM_LBUTTONUP

ThisWorkbook.Application.Visible = True

UserForm1.Show

Case WM_RBUTTONUP

MsgBox "右键菜单"

End Select

End 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 If

End Sub

这段代码在用户尝试关闭Userform1时拦截关闭操作,并隐藏Userform1而不是关闭它。

现在,我们已经完成了代码的编写。保存并关闭VBA编辑器。双击excel工作簿以打开它,你将看到excel应用程序被隐藏了,但在任务栏中显示了一个图标。当你单击图标时,Userform1将重新显示。

案例代码:

VBA

Private Sub Workbook_Open()

UserForm1.Show

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

If CloseMode = vbFormControlMenu Then

Cancel = True

Me.Hide

End If

End Sub

Private 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 Sub

Private 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 Sub

Public Sub HandleNotificationIconMessage(ByVal lngMsg As Long)

Select Case lngMsg

Case WM_LBUTTONUP

ThisWorkbook.Application.Visible = True

UserForm1.Show

Case WM_RBUTTONUP

MsgBox "右键菜单"

End Select

End Sub

通过使用excel的Userform和Windows API,我们可以实现在隐藏excel应用程序的同时在任务栏中显示一个图标的功能。这对于需要用户输入数据或进行操作的excel应用程序非常有用。希望本文对你有所帮助!

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号