网站首页 > 技术文章 正文
在现代企业环境中,数据安全与用户认证是不可或缺的重要环节。为了保障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应用程序。
- 上一篇: 「ACCESS」权限不同登录不同窗体界面
- 下一篇: VB界面设计的对象(4) vb设计软件界面
猜你喜欢
- 2024-12-24 Excel VBA 用户窗体设置/一步一步代你设计EXCEL用户+密码登录界面
- 2024-12-24 家庭收支理财管理系统 Access数据库系统课程设计制作实例
- 2024-12-24 Qt 2D绘图:图形视图框架的事件处理与传播
- 2024-12-24 MFC界面库BCGControlBar v32.1 - 可视化管理器和主题升级
- 2024-12-24 DJYGUI系列文章九:GDD消息系统 gd信息
- 2024-12-24 Qt设备识别(简单的密钥生成器) qt设备管理系统
- 2024-12-24 Access开发的《财务经济管理系统》
- 2024-12-24 初级开发人员告诉我:OO 设计模式太复杂而且没用
- 2024-12-24 从零开始学Qt(89):UDP单播和广播
- 2024-12-24 Qt入门阶段之事件 qtc间期延长的临床意义
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)