VBA学习(71):Excel VBA 访问带密码保护的Access数据库/用户窗体设置/EXCEL用户+密码登录界面(Access版)

news2024/12/25 16:47:11

前两天我们分享了一个用户密码登录EXCEL的案例【Excel VBA 用户窗体设置/一步一步代你设计EXCEL用户+密码登录界面】,文中提及数据存储在Access中的情况,今天我就来把数据表(tb用户)移到Access中,修改一下代码,登录界面保持不变。把EXCEL文件改名为“收费管理系统”并放到“收费管理系统”文件夹下。准备把前面分享的【中医诊所收费系统】重新来设计一下,并将设计过程分享给大家。 今天我们的任务是把“tb用户”表移到ACCESS数据库中,并实现正常登录。详细的窗体设计过程请看上期文章。

设计思路与过程:

1、新建一个Access数据库文件,这不是本文重点,具体过程也比较简单,我把它放在第二条文章。

2、在excel文件中,我们建立几个自定义函数,用来处理数据库连接,获取数据之用,我们可以参考复制前面的文件中的自定义函数​ (Excel VBA 凭证打印/SQL连接Eexcel文件/Listview控件/CommandButton命令按钮控件),稍作修改,把访问数据库的密码设置进去,具体如下:

Function GetExtn(iName)
    '获取文件后缀名
Function GetStrCnn(ByVal DbFile As String, Optional ByVal Psw As String = "")
'获取数据库连接字符串
Function GetData(dataFile, sql)
'获取SQL数据查询记录
    ......
    passWord = "p111111"
    strCnn = GetStrCnn(dataFile, passWord)
    ......
end sub
Function GetFields(dataFile, sql)
'获取SQL数据查询结果的字段名

3、设置一个公共变量dataFile,存放数据库文件的完整路径及文件名,并在Thisworkbook的open事件中,给它赋值:

Private Sub Workbook_Open()
    dataFile = "E:\我的坚果云QQ\我的坚果云\001-公众号\002-Excel活学活用\公众号示例文件\收费管理系统\收费管理系统数据库.accdb"
    UsF_Login.Show
End Sub

上面的代码还是有问题的,文件拷到别的电脑就不能正常运行了。我们可以改一下,采用相对路径,要求excel文件与Access文件放在同一个目录下,修改代码如下:


Private Sub Workbook_Open()
    dataFile = ThisWorkbook.Path & "\收费管理系统数据库.accdb"
    UsF_Login.Show
End Sub

这样,我们在EXCEL文件启动时,即取得数据文件路径,供后续访问,其他过程可以直接调用。不过,如果VBA代码运行异常退出,那么dafaFile的值可能会丢失,这样就无法重新登录,后续对数据库的操作也无法进行,只能关闭EXCEL文件再重新打开。这里为了方便起见,在“登录”按钮代码里还是重新对dataFile赋值,确保数据库连接正常。

4、修改Usf_Login用户窗体代码:

(1)Private Sub UserForm_Activate()

窗体激活代码,这里暂时可以什么都不用做,所以我把过程中的代码都给注释掉了,等后续再视情况添加代码。

(2)Private Sub CmdLogin_Click(),“登录”按钮点击事件:

Private Sub CmdLogin_Click()
    dataFile = ThisWorkbook.Path & "\收费管理系统数据库.accdb"
    '点击“登录”按钮
    '判断一下有没有输入用户ID,
    '如果为空,提示信息,然后退出
    If Me.TxbUserID = "" Then
        MsgBox "请输入用户ID!"
        Exit Sub
    Else
        '查询tb用户表中Me.TxbUserID的数量,
        '如果有此用户,则计数结果应为1,否则为0
        SQL = "select count(*) from tb用户 where 用户ID='" & Me.TxbUserID & "'"
        arr = GetData(dataFile, SQL)
        If arr(0, 0) = 0 Then
            MsgBox "无此用户ID!"
            Exit Sub
        End If
    End If
    SQL = "select 密码,用户姓名 from tb用户 where 用户ID='" & Me.TxbUserID & "'"
    arr = GetData(dataFile, SQL)
    If arr(0, 0) = Me.TxtPassWord Then
        currUserID = Me.TxbUserID
        currUserName = arr(1, 0)
        '把登录用户信息记到Sheets("Main")
        Sheets("Main").Range("A1") = "用户ID:"
        Sheets("Main").Range("A2") = "用户姓名:"
        Sheets("Main").Range("B1") = currUserID
        Sheets("Main").Range("B2") = currUserName
        LoginStatus = 1
        Unload Me
    Else
        MsgBox "密码不正确,请重新输入!"
        Me.TxtPassWord = ""
        Me.TxtPassWord.SetFocus
    End If
End Sub

代码解析:代码块中也有部分注释。

line 2: 给dataFile再次赋值,确保本过程接下来能正常读取数据库信息。

line 6~18:判断用户输入的“用户ID”,如果为空,则提示输入,否则就到数据库“tb用户”表中查询“用户ID=TxbUserID”的记录的数量,如果为0,则表明数据库中没有此用户ID,给出提示信息,退出过程,之所以要预先查询用户ID是否存在,是为了避免后面查询“密码、用户姓名”出现错误。

line 19:SQL语句,查询“用户ID=TxbUserID”的记录的“密码、用户姓名”。

line 20:查询结果存入数组。

line 21~35:比较查询到的密码【arr(0,0)】与用户输入的密码【TxtPassWord】,如果相同,则正常登录,退出窗体;如果不同,则提示密码不正确,返回继续输入。

这里注意一下,记录集对象的数据结构与我们正常看到的表格是不一样的。我们用代码测试下,输入到一个工作表“TEM”:

Sub test1()
    dataFile = ThisWorkbook.Path & "\收费管理系统数据库.accdb"
    SQL = "select * from tb用户"
    arr = GetFields(dataFile, SQL)
    arr = GetData(dataFile, SQL)
    Sheets("TEM").Range("A1").Resize(UBound(arr, 1) + 1, UBound(arr, 2) + 1) = arr
End Sub

结果是这样子的:   

图片

我们可以把它作一个转置,但似乎也没有这个必要,记得它的结构就行了。

5、其他代码基本不用改,删除了EXCEL文件中的“tb用户”表,相关代码删除。

6、登录密码改为“123456”。看一下登录过程,与前面的并无两样。

图片

 感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你,干货内容:

点击文末的名片可以抱走,或点此链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2103263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用jmeter压测数据库

写在文章开头 除了wrk以外,jmeter一直是笔者比较喜欢的一个压测工具,从使用场景和功能范围来看,算是一款比较全面且上手快速的压测工具,本文将基于MySQL数据库为读者演示一下如何通过jmeter压测数据库,希望对你有帮助。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的…

FreeRTOS学习笔记—②RTOS的认识(持续更新中)

由于正在学习韦东山大佬的RTOS课程,结合了网上的一些资料,整理记录了下自己的感悟,用于以后自己的回顾。如有不对的地方请各位大佬纠正。 课程链接:https://www.bilibili.com/video/BV1844y1g7ud/?spm_id_from333.337.search-car…

Postman环境变量:简化API测试的利器

引言 在当今快速发展的互联网时代,API(应用程序接口)的重要性不言而喻。无论是内部系统间的通信还是对外服务的提供,API都扮演着至关重要的角色。然而,在API的开发与测试过程中,经常需要处理各种各样的配置…

Java语言程序设计基础篇_编程练习题**17.21 (十六进制编辑器)

目录 题目:**17.21 (十六进制编辑器) 代码示例 结果展示 题目:**17.21 (十六进制编辑器) 编写一个 GUI 应用程序,让用户在文本域输入一个文件名,然后按回车键,在文本域显示它的十六进制表达形式。用户也可以修改十六…

SEO之网站结构优化(十四-内部链接及权重分配3)

初创企业搭建网站的朋友看1号文章;想学习云计算,怎么入门看2号文章谢谢支持: 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客:阿幸SEO~探索搜索排名之道 7、锚文字分布及变化 前面…

不可不知的WPF形状(Shape)

在WPF开发中经常需要进行绘制图形,可以利用Shape类型绘制基本的形状,而且Shape派生自FrameworkElement,属于UI元素范畴,可以直接利用XAML进行绘制。本文通过一些简单的小例子,简述如何通过Shape类绘制形状,…

SMB攻击利用之-设置远程mimikatz程序为定时任务流量数据包分析

SMB协议作为windows环境下最为常见的一种协议,在历史上出现过无数的通过SMB协议进行网络攻击利用的案例,包括针对SMB协议本身以及通过SMB协议实施网络攻击。 本文将介绍一种SMB协议的常见利用方式,即通过windows的服务调用将远程主机上的mim…

MySQL数据库安装(详细)—>Mariadb的安装(day21)

该网盘链接有效期为7天,有需要评论区扣我: 通过网盘分享的文件:mariadb-10.3.7-winx64.msi 链接: https://pan.baidu.com/s/1-r_w3NuP8amhIEedmTkWsQ?pwd2ua7 提取码: 2ua7 1 双击打开安装软件 本次安装的是mariaDB,双击打开mar…

【STM32开发】GPIO最全解析及应用实例

目录 【1】GPIO概述 GPIO的基本概念 GPIO的应用 【2】GPIO功能描述 1.IO功能框图 2.知识补充 3.功能详述 浮空输入 上拉输入 下拉输入 模拟输入 推挽输出 开漏输出 复用开漏输出和复用推挽输出 【3】GPIO常用寄存器 相关寄存器介绍 4个32位配置寄存器 2个32位数据寄存器 1个32位…

Linux【1】基础

目录 cd ​编辑 Linux的粘贴是Ctrlshiftv,复制、剪切: pwd打印当前路径 cat 文件目录 读取 ↑ 可以调取之间输过的命令 mv A B 把文件名A改成B #掐头%去尾 touch 文件名 mkdir创建目录​编辑 删除rm 只能删除文件 终端命令格式 帮助 man命…

vant 动态查询下拉菜单(可用)

动态查询item项 <van-form submit"onSubmit" ref"formRef"><Title title"企业信息" title-line title-size"19" class"ml-[18px] mb-[18px]"></Title><van-cell-group inset class"py-[18px]&quo…

springblade-JWT认证缺陷漏洞CVE-2021-44910

漏洞成因 SpringBlade前端通过webpack打包发布的&#xff0c;可以从其中找到app.js获取大量接口 然后直接访问接口&#xff1a;api/blade-log/api/list 直接搜索“请求未授权”&#xff0c;定位到认证文件&#xff1a;springblade/gateway/filter/AuthFilter.java 后面的代码…

【数据分享】2021-2024年我国主要城市逐月轨道交通客运量数据

以地铁为代表的轨道交通是大城市居民的主要交通出行方式之一&#xff0c;轨道交通的客运量数据是评估城市轨道交通系统运行效率、承载能力和服务水平的重要指标。本次我们为大家带来的是2021-2024年我国主要城市的逐月轨道交通客运量数据&#xff01;数据更新到2024年7月份。 …

网络安全之DC-2靶机渗透测试实战

一、靶机环境搭建 1.下载DC-2虚拟机镜像文件&#xff0c;解压后用VM打开。 DC-2镜像&#xff0c;若链接失效&#xff0c;关注公众号 文化仁 回复DC-2获取&#xff0c;或联系我获取https://pan.baidu.com/s/1gVVdEbiTkFUEOpewsn1iRg?pwd2t1j 2.设置DC-2虚拟机的网络适配器为…

redis之缓存淘汰策略

1.查看redis的最大占用内存 使用redis-cli命令连接redis服务端&#xff0c;输入命令&#xff1a;config get maxmemory 输出的值为0&#xff0c;0代表redis的最大占用内存等同于服务器的最大内存。 2.设置redis的最大占用内存 编辑redis的配置文件&#xff0c;并重启redis服务…

C语言基础(三十四)

Win32 API&#xff08;Application Programming Interface&#xff09;是微软Windows操作系统提供的一套底层的应用程序编程接口&#xff0c;允许开发者直接与Windows操作系统交互&#xff0c;创建和管理窗口、图形界面、系统资源等。Win32 API主要用于开发桌面应用程序&#x…

【OpenWrt(2)】编译OpenWrt 的SDK,以linksys e8450 的MT7622 CPU为例

资源 参考 https://downloads.openwrt.org/releases/ 文章目录 资源依赖下载 SDK查询 CPU 信号 解压使用 feed 编译后台运行 依赖 apt-get update apt-get install subversion build-essential libncurses5-dev zlib1g-dev gawk git ccache gettext libssl-dev xsltproc wget…

气膜体育馆空气质量保障:健康运动新选择—轻空间

随着气膜体育馆的广泛应用&#xff0c;人们对其内部空气质量的关注日益增加。许多人担心封闭的气膜结构可能会导致空气流通不畅&#xff0c;进而影响健康。然而&#xff0c;现代气膜体育馆凭借独特的建筑设计、先进的空气净化系统以及良好的通风和换气机制&#xff0c;能够有效…

传统CV算法——边缘算子与图像金字塔算法介绍

边缘算子 图像梯度算子 - Sobel Sobel算子是一种用于边缘检测的图像梯度算子&#xff0c;它通过计算图像亮度的空间梯度来突出显示图像中的边缘。Sobel算子主要识别图像中亮度变化快的区域&#xff0c;这些区域通常对应于边缘。它是通过对图像进行水平和垂直方向的差分运算来…

MyBatis错误(一)

说明&#xff1a;记录一次MyBatis错误&#xff0c;错误信息如下&#xff0c;说数字转换异常&#xff0c;显然&#xff0c;把一个字符串类型转为数字类型&#xff0c;肯定是不行的。 2024-08-29 19:44:43.198 ERROR 24216 --- [nio-9090-exec-2] o.a.c.c.C.[.[.[/].[dispatcher…