小张看着Excel中的员工信息表,突然想到:“老王,我们的数据都在Excel里,但公司实际用的是数据库,如果能让Excel直接读取数据库就好了!”
01 准备工作:添加数据库引用
Sub 检查数据库引用()OnErrorResumeNextDim 引用 AsObjectForEach 引用 In ThisWorkbook.VBProject.ReferencesIf 引用.Name = "ADODB"ThenMsgBox "✅ ADO引用已成功添加!", vbInformationExitSubEndIfNextMsgBox "请先添加ADO引用:" & vbCrLf & _"1. 工具 → 引用" & vbCrLf & _"2. 勾选 Microsoft ActiveX Data Objects 6.1 Library", vbExclamationEndSub
02 连接Access数据库(最常用)
' 连接到Access数据库Sub 连接Access数据库()OnErrorGoTo 错误处理' 1. 创建连接对象Dim 连接 AsObjectSet 连接 = CreateObject("ADODB.Connection")' 2. 连接字符串(修改为你的数据库路径)Dim 数据库路径 AsString数据库路径 = ThisWorkbook.Path & "\员工数据库.accdb"Dim 连接字符串 AsString连接字符串 = "Provider=Microsoft.ACE.OLEDB.12.0;" & _"Data Source=" & 数据库路径 & ";" & _"Persist Security Info=False;"' 3. 打开连接连接.Open 连接字符串' 4. 测试连接MsgBox "✅ 数据库连接成功!" & vbCrLf & _"数据库位置:" & 数据库路径, vbInformation' 5. 关闭连接连接.CloseSet 连接 = NothingExitSub错误处理:MsgBox "❌ 连接失败:" & Err.Description, vbCriticalEndSub
' 创建示例数据库结构Sub 创建示例数据库()' 注意:Access数据库不能通过VBA代码直接创建' 需要先有一个.accdb或.mdb文件Dim 数据库路径 AsString数据库路径 = ThisWorkbook.Path & "\员工数据库.accdb"' 检查数据库文件是否存在If Dir(数据库路径) = ""ThenMsgBox "请先创建Access数据库文件:" & vbCrLf & _"1. 在文件夹中新建一个空白Access数据库" & vbCrLf & _"2. 命名为:员工数据库.accdb" & vbCrLf & _"3. 重新运行此程序", vbExclamationExitSubEndIfMsgBox "数据库文件已找到:" & 数据库路径, vbInformationEndSub
03 基础操作:增删改查(CRUD)
Sub 读取员工数据()OnErrorGoTo 错误处理' 1. 连接数据库Dim 连接 AsObject, 记录集 AsObjectSet 连接 = CreateObject("ADODB.Connection")Set 记录集 = CreateObject("ADODB.Recordset")Dim 连接字符串 AsString连接字符串 = "Provider=Microsoft.ACE.OLEDB.12.0;" & _"Data Source=" & ThisWorkbook.Path & "\员工数据库.accdb;"连接.Open 连接字符串' 2. 执行SQL查询Dim SQL语句 AsStringSQL语句 = "SELECT 员工编号, 姓名, 部门, 职位, 入职日期 FROM 员工表"记录集.Open SQL语句, 连接' 3. 检查是否有数据If 记录集.EOF ThenMsgBox "数据库中没有数据!", vbInformationGoTo 清理退出EndIf' 4. 将数据写入ExcelDim ws As WorksheetSet ws = ThisWorkbook.Sheets("员工数据")' 清空旧数据ws.Cells.Clear' 写入标题Dim 字段数量 AsInteger字段数量 = 记录集.Fields.CountDim i AsIntegerFor i = 0To 字段数量 - 1ws.Cells(1, i + 1).Value = 记录集.Fields(i).NameNext i' 设置标题格式With ws.Range(ws.Cells(1, 1), ws.Cells(1, 字段数量)).Font.Bold = True.Interior.Color = RGB(31, 78, 120).Font.Color = RGB(255, 255, 255)EndWith' 写入数据Dim 行号 AsLong行号 = 2记录集.MoveFirstDoWhileNot 记录集.EOFFor i = 0To 字段数量 - 1ws.Cells(行号, i + 1).Value = 记录集.Fields(i).ValueNext i行号 = 行号 + 1记录集.MoveNextLoop' 自动调整列宽ws.Columns.AutoFitMsgBox "✅ 成功读取 " & (行号 - 2) & " 条员工记录!", vbInformation清理退出:' 5. 关闭连接记录集.Close连接.CloseSet 记录集 = NothingSet 连接 = NothingExitSub错误处理:MsgBox "读取数据失败:" & Err.Description, vbCriticalGoTo 清理退出EndSub
Sub 插入员工数据()OnErrorGoTo 错误处理' 1. 获取用户输入(这里用输入框,实际中可以来自Excel单元格)Dim 姓名 AsString, 部门 AsString, 职位 AsString姓名 = InputBox("请输入员工姓名:", "新增员工")If 姓名 = ""ThenExitSub部门 = InputBox("请输入部门:", "新增员工")职位 = InputBox("请输入职位:", "新增员工")' 2. 连接数据库Dim 连接 AsObjectSet 连接 = CreateObject("ADODB.Connection")Dim 连接字符串 AsString连接字符串 = "Provider=Microsoft.ACE.OLEDB.12.0;" & _"Data Source=" & ThisWorkbook.Path & "\员工数据库.accdb;"连接.Open 连接字符串' 3. 构建SQL插入语句Dim SQL语句 AsStringSQL语句 = "INSERT INTO 员工表 (姓名, 部门, 职位, 入职日期) " & _"VALUES ('" & 姓名 & "', '" & 部门 & "', '" & 职位 & "', #" & Date & "#)"' 4. 执行插入连接.Execute SQL语句' 5. 检查影响的行数MsgBox "✅ 员工 " & 姓名 & " 已成功添加到数据库!", vbInformation' 6. 刷新Excel数据Call 读取员工数据清理退出:' 7. 关闭连接IfNot 连接 IsNothingThen连接.CloseSet 连接 = NothingEndIfExitSub错误处理:MsgBox "插入数据失败:" & Err.Description, vbCriticalGoTo 清理退出EndSub
Sub 更新员工数据()OnErrorGoTo 错误处理' 1. 选择要更新的员工Dim 员工编号 AsString员工编号 = InputBox("请输入要更新的员工编号:", "更新员工信息")If 员工编号 = ""ThenExitSub' 2. 获取新信息Dim 新部门 AsString, 新职位 AsString新部门 = InputBox("请输入新部门:", "更新员工信息")新职位 = InputBox("请输入新职位:", "更新员工信息")' 3. 连接数据库Dim 连接 AsObjectSet 连接 = CreateObject("ADODB.Connection")Dim 连接字符串 AsString连接字符串 = "Provider=Microsoft.ACE.OLEDB.12.0;" & _"Data Source=" & ThisWorkbook.Path & "\员工数据库.accdb;"连接.Open 连接字符串' 4. 构建SQL更新语句Dim SQL语句 AsStringSQL语句 = "UPDATE 员工表 SET " & _"部门 = '" & 新部门 & "', " & _"职位 = '" & 新职位 & "' " & _"WHERE 员工编号 = '" & 员工编号 & "'"' 5. 执行更新连接.Execute SQL语句MsgBox "✅ 员工 " & 员工编号 & " 的信息已更新!", vbInformation' 6. 刷新数据Call 读取员工数据清理退出:' 7. 关闭连接IfNot 连接 IsNothingThen连接.CloseSet 连接 = NothingEndIfExitSub错误处理:MsgBox "更新数据失败:" & Err.Description, vbCriticalGoTo 清理退出EndSub
Sub 删除员工数据()OnErrorGoTo 错误处理' 1. 获取要删除的员工编号Dim 员工编号 AsString员工编号 = InputBox("请输入要删除的员工编号:", "删除员工")If 员工编号 = ""ThenExitSub' 2. 确认删除If MsgBox("确定要删除员工 " & 员工编号 & " 吗?", vbYesNo + vbQuestion, "确认删除") = vbNo ThenExitSubEndIf' 3. 连接数据库Dim 连接 AsObjectSet 连接 = CreateObject("ADODB.Connection")Dim 连接字符串 AsString连接字符串 = "Provider=Microsoft.ACE.OLEDB.12.0;" & _"Data Source=" & ThisWorkbook.Path & "\员工数据库.accdb;"连接.Open 连接字符串' 4. 构建SQL删除语句Dim SQL语句 AsStringSQL语句 = "DELETE FROM 员工表 WHERE 员工编号 = '" & 员工编号 & "'"' 5. 执行删除连接.Execute SQL语句MsgBox "✅ 员工 " & 员工编号 & " 已从数据库删除!", vbInformation' 6. 刷新数据Call 读取员工数据清理退出:' 7. 关闭连接IfNot 连接 IsNothingThen连接.CloseSet 连接 = NothingEndIfExitSub错误处理:MsgBox "删除数据失败:" & Err.Description, vbCriticalGoTo 清理退出EndSub
04 实战:创建员工信息管理系统
OptionExplicit' 全局连接对象Public 数据库连接 AsObject' 初始化系统Sub 初始化系统()OnErrorGoTo 错误处理' 检查数据库文件Dim 数据库路径 AsString数据库路径 = ThisWorkbook.Path & "\员工数据库.accdb"If Dir(数据库路径) = ""ThenMsgBox "找不到数据库文件:" & 数据库路径 & vbCrLf & _"请确保员工数据库.accdb文件存在。", vbExclamationExitSubEndIf' 连接数据库Set 数据库连接 = CreateObject("ADODB.Connection")Dim 连接字符串 AsString连接字符串 = "Provider=Microsoft.ACE.OLEDB.12.0;" & _"Data Source=" & 数据库路径 & ";"数据库连接.Open 连接字符串MsgBox "✅ 系统初始化成功!", vbInformation' 加载数据Call 加载所有数据ExitSub错误处理:MsgBox "系统初始化失败:" & Err.Description, vbCriticalEndSub' 加载所有数据到ExcelSub 加载所有数据()OnErrorGoTo 错误处理If 数据库连接 IsNothingThenMsgBox "请先初始化系统!", vbExclamationExitSubEndIf' 1. 查询员工数据Dim 记录集 AsObjectSet 记录集 = CreateObject("ADODB.Recordset")Dim SQL语句 AsStringSQL语句 = "SELECT * FROM 员工表 ORDER BY 部门, 姓名"记录集.Open SQL语句, 数据库连接' 2. 写入ExcelDim ws As WorksheetSet ws = ThisWorkbook.Sheets("员工管理")' 清空旧数据ws.Cells.Clear' 写入标题Dim 字段数量 AsInteger字段数量 = 记录集.Fields.CountDim i AsIntegerFor i = 0To 字段数量 - 1ws.Cells(1, i + 1).Value = 记录集.Fields(i).NameNext i' 写入数据Dim 行号 AsLong行号 = 2IfNot 记录集.EOF Then记录集.MoveFirstDoWhileNot 记录集.EOFFor i = 0To 字段数量 - 1ws.Cells(行号, i + 1).Value = 记录集.Fields(i).ValueNext i行号 = 行号 + 1记录集.MoveNextLoopEndIf' 格式化表格With ws.UsedRange.Borders.LineStyle = xlContinuous.Borders.Color = RGB(200, 200, 200).HorizontalAlignment = xlCenterEndWithws.Columns.AutoFit' 3. 添加部门统计Call 添加部门统计' 4. 添加操作按钮Call 添加操作按钮记录集.CloseSet 记录集 = NothingExitSub错误处理:MsgBox "加载数据失败:" & Err.Description, vbCriticalEndSub' 添加部门统计Sub 添加部门统计()OnErrorGoTo 错误处理Dim 记录集 AsObjectSet 记录集 = CreateObject("ADODB.Recordset")Dim SQL语句 AsStringSQL语句 = "SELECT 部门, COUNT(*) AS 人数 FROM 员工表 GROUP BY 部门 ORDER BY 人数 DESC"记录集.Open SQL语句, 数据库连接Dim ws As WorksheetSet ws = ThisWorkbook.Sheets("部门统计")ws.Cells.Clear' 写入标题ws.Range("A1").Value = "部门"ws.Range("B1").Value = "人数"Dim 行号 AsLong行号 = 2IfNot 记录集.EOF Then记录集.MoveFirstDoWhileNot 记录集.EOFws.Cells(行号, 1).Value = 记录集.Fields("部门").Valuews.Cells(行号, 2).Value = 记录集.Fields("人数").Value行号 = 行号 + 1记录集.MoveNextLoopEndIf' 创建图表Dim 图表 As ChartObjectSet 图表 = ws.ChartObjects.Add(Left:=300, Width:=400, Top:=50, Height:=250)With 图表.Chart.ChartType = xlColumnClustered.SetSourceData Source:=ws.Range("A1:B" & 行号 - 1).HasTitle = True.ChartTitle.Text = "各部门人数统计".Axes(xlCategory).HasTitle = True.Axes(xlCategory).AxisTitle.Text = "部门".Axes(xlValue).HasTitle = True.Axes(xlValue).AxisTitle.Text = "人数"EndWith记录集.CloseSet 记录集 = NothingExitSub错误处理:MsgBox "添加统计失败:" & Err.Description, vbCriticalEndSub' 添加操作按钮Sub 添加操作按钮()Dim ws As WorksheetSet ws = ThisWorkbook.Sheets("员工管理")' 清除旧按钮OnErrorResumeNextws.Buttons.DeleteOnErrorGoTo0' 添加刷新按钮Dim 按钮 As ButtonSet 按钮 = ws.Buttons.Add(10, 10, 80, 30)With 按钮.Caption = "刷新数据".OnAction = "加载所有数据"EndWith' 添加新增按钮Set 按钮 = ws.Buttons.Add(100, 10, 80, 30)With 按钮.Caption = "新增员工".OnAction = "快速新增员工"EndWith' 添加搜索框ws.Range("L1").Value = "搜索员工:"ws.Range("M1").Value = ""EndSub' 快速新增员工Sub 快速新增员工()' 使用简单输入框Dim 姓名 AsString, 部门 AsString, 职位 AsString姓名 = InputBox("请输入员工姓名:", "新增员工")If 姓名 = ""ThenExitSub部门 = InputBox("请输入部门:", "新增员工")职位 = InputBox("请输入职位:", "新增员工")' 插入数据库OnErrorGoTo 错误处理Dim SQL语句 AsStringSQL语句 = "INSERT INTO 员工表 (姓名, 部门, 职位, 入职日期) " & _"VALUES ('" & 姓名 & "', '" & 部门 & "', '" & 职位 & "', #" & Date & "#)"数据库连接.Execute SQL语句MsgBox "✅ 员工 " & 姓名 & " 添加成功!", vbInformation' 刷新数据Call 加载所有数据ExitSub错误处理:MsgBox "添加失败:" & Err.Description, vbCriticalEndSub' 搜索员工Sub 搜索员工()Dim 搜索关键词 AsString搜索关键词 = ThisWorkbook.Sheets("员工管理").Range("M1").ValueIf 搜索关键词 = ""ThenCall 加载所有数据ExitSubEndIfOnErrorGoTo 错误处理Dim 记录集 AsObjectSet 记录集 = CreateObject("ADODB.Recordset")Dim SQL语句 AsStringSQL语句 = "SELECT * FROM 员工表 " & _"WHERE 姓名 LIKE '%" & 搜索关键词 & "%' " & _"OR 部门 LIKE '%" & 搜索关键词 & "%' " & _"OR 职位 LIKE '%" & 搜索关键词 & "%' " & _"ORDER BY 部门, 姓名"记录集.Open SQL语句, 数据库连接' 写入ExcelDim ws As WorksheetSet ws = ThisWorkbook.Sheets("员工管理")ws.Cells.Clear' 写入标题Dim 字段数量 AsInteger字段数量 = 记录集.Fields.CountDim i AsIntegerFor i = 0To 字段数量 - 1ws.Cells(1, i + 1).Value = 记录集.Fields(i).NameNext i' 写入数据Dim 行号 AsLong行号 = 2IfNot 记录集.EOF Then记录集.MoveFirstDoWhileNot 记录集.EOFFor i = 0To 字段数量 - 1ws.Cells(行号, i + 1).Value = 记录集.Fields(i).ValueNext i行号 = 行号 + 1记录集.MoveNextLoopEndIfws.Columns.AutoFit记录集.CloseSet 记录集 = NothingMsgBox "找到 " & (行号 - 2) & " 条匹配记录", vbInformationExitSub错误处理:MsgBox "搜索失败:" & Err.Description, vbCriticalEndSub' 导出为Excel文件Sub 导出数据()OnErrorGoTo 错误处理Dim 导出路径 AsString导出路径 = ThisWorkbook.Path & "\员工数据_" & Format(Date, "yyyymmdd") & ".xlsx"' 创建新工作簿Dim 新工作簿 As WorkbookSet 新工作簿 = Workbooks.Add' 复制数据ThisWorkbook.Sheets("员工管理").Copy Before:=新工作簿.Sheets(1)ThisWorkbook.Sheets("部门统计").Copy Before:=新工作簿.Sheets(1)' 删除默认工作表Application.DisplayAlerts = FalseDoWhile 新工作簿.Sheets.Count > 2新工作簿.Sheets(3).DeleteLoopApplication.DisplayAlerts = True' 保存新工作簿.SaveAs 导出路径新工作簿.CloseMsgBox "✅ 数据已导出到:" & vbCrLf & 导出路径, vbInformationExitSub错误处理:MsgBox "导出失败:" & Err.Description, vbCriticalEndSub' 关闭系统Sub 关闭系统()OnErrorResumeNextIfNot 数据库连接 IsNothingThenIf 数据库连接.State = 1Then数据库连接.CloseEndIfSet 数据库连接 = NothingEndIfMsgBox "✅ 系统已安全关闭!", vbInformationEndSub
05 创建快捷操作界面
Sub 显示主界面()' 在Excel中创建一个简单的控制面板Dim ws As WorksheetSet ws = ThisWorkbook.Sheets("控制面板")' 如果不存在,创建新工作表 If ws Is Nothing Then Set ws = ThisWorkbook.Sheets.Add ws.Name = "控制面板" End If ws.Cells.Clear ' 创建标题With ws.Range("A1").Value= "员工信息管理系统".Font.Size =18.Font.Bold =True.Font.Color = RGB(31, 78, 120)EndWith' 创建功能区域 ws.Range("A3").Value = "系统功能:" ws.Range("A3").Font.Bold = True ' 功能列表Dim 功能列表 As Variant功能列表 =Array("1. 初始化系统", "2. 加载所有数据", "3. 新增员工", _"4. 搜索员工", "5. 导出数据", "6. 关闭系统")Dim i As LongFor i =0To UBound(功能列表)ws.Cells(4+ i, 1).Value= 功能列表(i)Next i' 操作说明 ws.Range("A12").Value = "操作说明:" ws.Range("A12").Font.Bold = True ws.Range("A13").Value = "1. 首次使用请先点击'初始化系统'" ws.Range("A14").Value = "2. 然后点击'加载所有数据'查看数据" ws.Range("A15").Value = "3. 在'员工管理'工作表中操作数据" ' 添加按钮Call 添加控制面板按钮' 激活此工作表 ws.Activate MsgBox "✅ 系统主界面已创建!" & vbCrLf & _ "请在'控制面板'工作表中操作系统。", vbInformationEnd Sub' 添加控制面板按钮Sub 添加控制面板按钮()Dim ws As WorksheetSet ws = ThisWorkbook.Sheets("控制面板")' 清除旧按钮 On Error Resume Next ws.Buttons.Delete On Error GoTo 0 ' 初始化系统按钮Dim 按钮 As ButtonSet 按钮 = ws.Buttons.Add(Left:=ws.Range("C4").Left, _Top:=ws.Range("C4").Top, _Width:=100, Height:=30)With 按钮.Caption = "初始化系统".OnAction = "初始化系统"EndWith' 加载数据按钮 Set 按钮 = ws.Buttons.Add(Left:=ws.Range("C5").Left, _ Top:=ws.Range("C5").Top, _ Width:=100, Height:=30) With 按钮 .Caption = "加载数据" .OnAction = "加载所有数据" End With ' 新增员工按钮Set 按钮 = ws.Buttons.Add(Left:=ws.Range("C6").Left, _Top:=ws.Range("C6").Top, _Width:=100, Height:=30)With 按钮.Caption = "新增员工".OnAction = "快速新增员工"EndWith' 导出数据按钮 Set 按钮 = ws.Buttons.Add(Left:=ws.Range("C8").Left, _ Top:=ws.Range("C8").Top, _ Width:=100, Height:=30) With 按钮 .Caption = "导出数据" .OnAction = "导出数据" End With ' 关闭系统按钮Set 按钮 = ws.Buttons.Add(Left:=ws.Range("C9").Left, _Top:=ws.Range("C9").Top, _Width:=100, Height:=30)With 按钮.Caption = "关闭系统".OnAction = "关闭系统"EndWithEnd Sub
06 快速开始指南
CREATE TABLE 员工表 (员工编号 AUTOINCREMENT PRIMARY KEY,姓名 TEXT(50),部门 TEXT(50),职位 TEXT(50),入职日期 DATE,联系电话 TEXT(20))
Sub 启动员工管理系统()' 显示欢迎信息MsgBox "欢迎使用员工信息管理系统!" & vbCrLf & _"这是一个基于Excel和Access的数据库管理系统。", vbInformation' 创建控制面板Call 显示主界面EndSub
07 常见问题解决
Sub 修复数据库路径()Dim 数据库路径 AsString数据库路径 = ThisWorkbook.Path & "\员工数据库.accdb"MsgBox "数据库应该放在:" & vbCrLf & 数据库路径, vbInformation' 检查文件是否存在If Dir(数据库路径) = ""ThenIf MsgBox("找不到数据库文件,是否创建示例数据库?", vbYesNo) = vbYes Then' 创建示例数据库Call 创建示例数据库EndIfElseMsgBox "✅ 数据库文件已找到!", vbInformationEndIfEndSub
Sub 检查表结构()' 在Access中手动创建表MsgBox "请在Access中创建以下表结构:" & vbCrLf & vbCrLf & _"表名:员工表" & vbCrLf & _"字段:" & vbCrLf & _" 员工编号 - 自动编号(主键)" & vbCrLf & _" 姓名 - 文本(50)" & vbCrLf & _" 部门 - 文本(50)" & vbCrLf & _" 职位 - 文本(50)" & vbCrLf & _" 入职日期 - 日期/时间" & vbCrLf & _" 联系电话 - 文本(20)", vbInformationEndSub
Sub 检查数据库权限()Dim 数据库路径 AsString数据库路径 = ThisWorkbook.Path & "\员工数据库.accdb"' 检查文件是否只读If GetAttr(数据库路径) And vbReadOnly ThenMsgBox "数据库文件是只读的!" & vbCrLf & _"请右键点击文件 → 属性 → 取消'只读'", vbExclamationElseMsgBox "✅ 数据库文件有写入权限", vbInformationEndIfEndSub
夜雨聆风