下面以“学生成绩管理系统”为例,演示数据统一使用MySQL中的students表,Excel作为前端界面,VBA作为中间桥梁,完整实现数据的查询、新增、修改、删除功能。全程采用一问一答形式,每个操作都附带真实数据和可运行的代码。
一、准备工作:建表与连接配置
首先在MySQL中创建测试表:
CREATE TABLE students ( stu_id INT PRIMARY KEY, name VARCHAR(20), classVARCHAR(20), score DECIMAL(5,1));INSERT INTO students VALUES(1, '小明', 'A班', 92),(2, '小红', 'B班', 88),(3, '小刚', 'A班', 75);
Excel工作簿命名为“学生管理系统.xlsm”,包含两个工作表:
VBA中需要先建立通用连接函数:
Function GetConn() As Object Set GetConn = CreateObject("ADODB.Connection") GetConn.Open "DRIVER={MySQL ODBC 8.0 Driver};SERVER=localhost;DATABASE=testdb;UID=root;PWD=123456"End Function
二、查询操作(Read)
场景:点击“查询”按钮,根据Sheet2中输入的学号或姓名模糊查找,结果显示在Sheet1中。
演示数据:假设用户在Sheet2的B2单元格输入“小”,点击查询。
VBA代码(绑定到查询按钮):
Sub QueryData() Dim conn As Object, rs As Object, sql As String Dim keyword As String keyword = Trim(Sheet2.Range("B2").Value) '学号或姓名关键词 Set conn = GetConn() If keyword = "" Then sql = "SELECT * FROM students" ElseIf IsNumeric(keyword) Then sql = "SELECT * FROM students WHERE stu_id = " & CLng(keyword) Else sql = "SELECT * FROM students WHERE name LIKE '%" & keyword & "%'" End If Set rs = conn.Execute(sql) Sheet1.Range("A2:D1048576").ClearContents '清空旧数据 Sheet1.Range("A2").CopyFromRecordset rs '从第二行开始填充 rs.Close: conn.Close MsgBox "查询完成,共返回 " & Sheet1.Range("A1").CurrentRegion.Rows.Count - 1 & " 条记录"End Sub
效果:Sheet1显示小明(学号1)、小红(学号2)两行数据,因为名字中都含“小”。
三、新增操作(Create)
场景:在Sheet2中输入新学生信息,点击“新增”按钮插入到MySQL。
演示数据:Sheet2的B2=4,C2=小丽,D2=C班,E2=95。
VBA代码(绑定到新增按钮):
Sub AddStudent() Dim conn As Object, sql As String Dim id As Long, name As String, cls As String, score As Double id = Val(Sheet2.Range("B2").Value) name = Sheet2.Range("C2").Value cls = Sheet2.Range("D2").Value score = Val(Sheet2.Range("E2").Value) If id = 0 Or name = "" Then MsgBox "学号和姓名不能为空" Exit Sub End If Set conn = GetConn() sql = "INSERT INTO students (stu_id, name, class, score) VALUES (" & id & ",'" & name & "','" & cls & "'," & score & ")" On Error Resume Next conn.Execute sql If Err.Number <> 0 Then MsgBox "新增失败:" & Err.Description Else MsgBox "新增成功!" Call QueryData '自动刷新列表 End If conn.CloseEnd Sub
效果:MySQL表中增加一条记录,然后自动调用查询函数刷新Sheet1显示全部数据。
四、修改操作(Update)
场景:先在Sheet1中选择一行(或手动在Sheet2输入学号),然后在Sheet2修改对应字段,点击“修改”按钮更新数据库。
演示数据:将学号为1的小明成绩从92改为98,班级从A班改为A+班。操作:在Sheet2的B2输入1,E2输入98,D2输入“A+班”,点击修改。
VBA代码(绑定到修改按钮):
Sub UpdateStudent() Dim conn As Object, sql As String Dim id As Long, name As String, cls As String, score As Double id = Val(Sheet2.Range("B2").Value) If id = 0 Then MsgBox "请输入要修改的学号" Exit Sub End If '获取修改后的值(若某字段为空则不更新) name = Sheet2.Range("C2").Value cls = Sheet2.Range("D2").Value score = Sheet2.Range("E2").Value Set conn = GetConn() '动态拼接SET子句 Dim setClause As String If name <> "" Then setClause = setClause & "name='" & name & "'," If cls <> "" Then setClause = setClause & "class='" & cls & "'," If score <> 0 Then setClause = setClause & "score=" & score & "," If setClause = "" Then MsgBox "没有要修改的字段" Exit Sub End If setClause = Left(setClause, Len(setClause) - 1) '去掉末尾逗号 sql = "UPDATE students SET " & setClause & " WHERE stu_id = " & id conn.Execute sql MsgBox "修改成功!" Call QueryData conn.CloseEnd Sub
效果:数据库中小明成绩变为98,班级变为A+班,Sheet1刷新后显示更新内容。
五、删除操作(Delete)
场景:在Sheet2中输入要删除的学号,点击“删除”按钮移除该学生。
演示数据:输入学号3(小刚),点击删除。
VBA代码(绑定到删除按钮):
Sub DeleteStudent() Dim conn As Object, sql As String Dim id As Long id = Val(Sheet2.Range("B2").Value) If id = 0 Then MsgBox "请输入要删除的学号" Exit Sub End If If MsgBox("确定要删除学号为 " & id & " 的学生吗?", vbYesNo + vbQuestion) = vbNo Then Exit Sub End If Set conn = GetConn() sql = "DELETE FROM students WHERE stu_id = " & id conn.Execute sql MsgBox "删除成功!" Call QueryData conn.CloseEnd Sub
效果:小刚记录被删除,Sheet1不再显示该行。
六、完整操作流程演示
初始状态:打开Excel,点击“查询”(不输入任何关键词),Sheet1显示三条原始数据。
新增:输入学号4、姓名小丽、班级C班、成绩95,点击新增,提示成功,列表刷新显示四条数据。
修改:在Sheet2的B2输入1,将成绩改为98,班级改为A+班,点击修改,列表中小明信息更新。
删除:在Sheet2的B2输入3,点击删除,确认后小刚消失。
最终查询:再次点击查询,Sheet1显示剩余三条记录(小明、小红、小丽)。
七、注意事项与扩展
防SQL注入:上述示例为了清晰使用了字符串拼接,生产环境务必改用参数化查询(如前面课程所示)。
错误处理:实际应用中应完善On Error处理,捕获主键冲突、连接超时等异常。
用户体验:可以在Sheet1中添加双击事件,自动将选中行的数据填充到Sheet2编辑区,方便修改。
安全性:密码建议存储在配置文件或使用Windows身份验证,避免硬编码。
通过这个完整的增删改查实例,你已经掌握了Excel VBA操作MySQL的核心方法。无论是简单的数据录入还是复杂的企业报表系统,都可以基于此框架进行扩展。