网站首页 > 文章精选 正文
在现代企业环境中,数据安全与用户认证是不可或缺的重要环节。为了保障Excel工作簿中的数据不被未授权人员访问,设计并实现一个基于VBA(Visual Basic for Applications)的登录系统显得尤为重要。在开发Excel VBA应用程序时,用户界面(UI)的设计对于提升用户体验至关重要。默认情况下,Excel VBA中的用户表单(UserForm)带有一个标准的边框和标题栏,这在多数应用场景下是足够的。然而,在某些特定场景下,如创建全屏应用、嵌入式工具条或是模仿Office应用程序原生界面时,我们可能需要一个无边框的表单来提供更好的视觉效果和更灵活的布局控制。
本文介绍如何使用VBA在Excel中构建一个简单而有效的登录系统,该系统包括用户账号和密码的验证、登录尝试次数的限制、以及友好的用户交互界面。同时,介绍一种在VBA中通过调用Windows API函数来移除Excel用户表单边框的方法。我们将利用user32.dll库中的FindWindow、GetWindowLong、SetWindowLong和DrawMenuBar函数,结合VBA的条件编译指令#If VBA7 Then来确保代码兼容不同版本的Excel(特别是区分32位和64位系统下的LongPtr和Long类型)。
登录界面安全验证与用户交互设计
通过CommandButton1_Click子程序,我们实现了登录逻辑的核心部分。程序首先遍历工作表Sheet1中的第一列,查找用户输入的账号是否存在。如果账号不存在,则通过消息框提示用户并终止登录流程。若账号存在,则进一步验证密码是否正确。为了提高安全性,我们限制了用户尝试登录的次数,并在达到限制后自动关闭工作簿。关键代码如下:
Private Sub CommandButton1_Click()
Dim n As Long, ci As Long
For n = 2 To Sheet1.[a1].CurrentRegion.Rows.Count
If ComboBox1.Text = Sheet1.Cells(n, 1).Value Then
Exit For
End If
Next n
If n > Sheet1.[a1].CurrentRegion.Rows.Count Then
MsgBox "没有这个账号,请申请账号", vbInformation, "系统提示"
Exit Sub
End If
For n = 2 To Sheet1.[a1].CurrentRegion.Rows.Count
If ComboBox1.Text = Sheet1.Cells(n, 1).Value Then
If TextBox1.Text = Sheet1.Cells(n, 2).Value Then
MsgBox Me.ComboBox1 & " ,欢迎你使用本系统!", vbInformation, "系统提示"
Sheet1.Range("d2").Value = ComboBox1.Text
Unload Login
Unload Fullscreen
Else
TextBox1.Text = ""
TextBox1.SetFocus
.......
............
End If
End If
Next n
Application.Visible = True
End Sub
此外,CommandButton2_Click子程序用于处理系统退出操作,通过关闭登录和用户界面(Fullscreen)表单并关闭工作簿(不保存更改),实现快速且安全的退出机制。me_QueryClose子程序则用于防止用户通过关闭按钮绕过正常退出流程,提高了系统的整体安全性。
Private Sub CommandButton2_Click() '系统退出
Unload Login
Unload Fullscreen
ThisWorkbook.Close SaveChanges:=False
End Sub
UserForm_Initialize子程序在登录界面显示时执行,它负责初始化登录表单的显示,包括移除窗体标题栏(实现无边框样式)、填充用户名下拉列表(从Sheet1中读取),并设置其他UI元素的初始状态。这样的设计使得登录界面更加简洁且易于使用。
Private Sub UserForm_Initialize() '此窗体用于显示系统的登录界面
Dim hWndForm, iStyle, hMenu, i
If Val(Application.Version) < 9 Then
hWndForm = FindWindow("ThunderXFrame", Me.Caption) 'XL97
Else
hWndForm = FindWindow("ThunderDFrame", Me.Caption) 'XL2000
End If
iStyle = GetWindowLong(hWndForm, GWL_STYLE)
iStyle = iStyle And Not WS_CAPTION '无边框样式
SetWindowLong hWndForm, GWL_STYLE, iStyle
DrawMenuBar hWndForm
............
..............................
End Sub
用户表单(UserForm)无边框设计
技术要点:
- API函数调用:FindWindow:用于获取指定类名和窗口名的窗口句柄。在Excel VBA中,用户表单的类名依赖于Excel的版本(如ThunderXFrame为Excel 97的类名,ThunderDFrame为Excel 2000及之后版本的类名)。GetWindowLong与SetWindowLong:用于获取和设置窗口的样式。我们将使用这些函数来移除表单的标题栏和边框。DrawMenuBar:理论上用于重绘菜单条,但在此上下文中可能并不直接必要,但在修改窗口样式后有时可用于刷新窗口。
- 条件编译:VBA提供了条件编译指令(如#If VBA7 Then),允许开发者为不同版本的VBA(主要是区分32位和64位Office)编写不同的代码。这在调用需要区分指针大小的Windows API时特别有用。
- 用户界面调整:移除边框后,我们还需要通过VBA代码调整用户表单的位置和大小,以确保其完全覆盖Excel的工作区或根据需要定位。
核心代码如下:
#If VBA7
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
Private Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hWnd As LongPtr) As Long
Private Const GWL_STYLE As Long = -16
Private Const WS_CAPTION As Long = &HC00000
#Else
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Private Const GWL_STYLE As Long = -16
Private Const WS_CAPTION As Long = &HC00000
#End If
Private Sub UserForm_Initialize()
Dim hWndForm, iStyle, hMenu
If Val(Application.Version) < 9 Then
hWndForm = FindWindow("ThunderXFrame", Me.Caption) 'Excel 97
Else
hWndForm = FindWindow("ThunderDFrame", Me.Caption) 'Excel 2000
End If
iStyle = GetWindowLong(hWndForm, GWL_STYLE)
iStyle = iStyle And Not WS_CAPTION '无边框样式
SetWindowLong hWndForm, GWL_STYLE, iStyle
DrawMenuBar hWndForm
Me.Width = Application.Width + 5
Me.Height = Application.Height + 5
Me.Top = 0
Me.Left = 0
End Sub
通过本文,你将学习到如何在Excel中利用VBA构建基本的安全验证机制,以及如何通过编程实现用户友好的交互设计。无论是对于需要保护敏感数据的个人用户,还是希望提升工作簿安全性的企业用户,本文提供的登录系统都是一个实用且有效的解决方案。我们可以轻松地实现Excel VBA用户表单的无边框设计,从而为我们的应用程序提供更加丰富和灵活的用户界面选项。掌握这种技术将使得VBA开发者能够构建出更加专业和引人入胜的Excel应用程序。
猜你喜欢
- 2025-07-06 C语言精华:宏与预处理器技巧深度解析
- 2025-07-06 一文读懂C程序的编译过程(c 程序如何编译)
- 2025-07-06 C/C++ 自定义头文件,及头文件结构详解
- 2025-07-06 C#项目中引用不同版本的DLL(c# 引用c++的dll .h)
- 2025-07-06 20个最经典的C语言问答题,建议关注加收藏
- 2025-07-06 这些C++工程师面试题你都会了吗?(c/c++工程师面试会怎么问)
- 2025-07-06 C语言翻译环境:预编译+编译+汇编+链接详解
- 2025-07-06 C++基础知识总结(超详细总结)(c++ 基础知识)
- 2025-07-06 C++开发:源码编译过程(c++11源码)
- 2025-07-06 01程序编译过程分析,预处理,编译,汇编,链接
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)