ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 9116|回复: 28

[分享] Excel VBA 对 Access增删改查代码分享

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-8-16 12:25 | 显示全部楼层 |阅读模式
本帖最后由 xmh850216 于 2019-8-16 14:07 编辑

结合官方的文档,前人的经验和自己工作中的实例。整理了一篇关于VBA里操控Access的例子。和大家分享.
前提:
本例使用的是Office 2016

添加ADO Lib引用
  • 快捷键Alt+F11进入VBE Tools>References...>
excel-crud-1.png

  • 勾选 Microsoft ActiveXData Object
excel-crud-2.png

创建链接
  1. Function Connect(dbPath As String) As ADODB.Connection
  2.     Set objConn = New ADODB.Connection
  3.     With objConn
  4.         .Provider = "Microsoft.ACE.OLEDB.12.0"
  5.         .Properties("Data Source") = dbPath
  6.         .Properties("Persist Security Info") = False
  7.         .Open
  8.     End With
  9.     Set Connect = objConn
  10.     Debug.Print "Connection established..."
  11. End Function
复制代码
关闭链接
  1. Sub CloseConnection(objConn As ADODB.Connection)
  2.     On Error Resume Next
  3.     objConn.Close
  4.     Debug.Print "Connection closed..."
  5.     Set objConn = Nothing
  6. End Sub
复制代码
增/删/改/查 基础程序
  1. Sub Insert_Data(strSQL as String)
  2.     '示例strSQL = "INSERT INTO TableName(Column_Name1, Columns_Name2) Values('Value1', 'Value12')"
  3.     '需要在使用的时候传入strSQL查询语句
  4.     objCon.Execute strSQL
  5. End Sub

  6. Sub Delete_Data(strSQL as String)
  7.     '示例strSQL = "DELETE FROM TableName WHERE Column_Name1='Value1'"
  8.     '需要在使用的时候传入strSQL查询语句
  9.     objCon.Execute strSQL
  10. End Sub

  11. Sub Update_Data(strSQL as String)
  12.     '示例strSQL = "UPDATE TableName SET Column_Name2= 'Value2' WHERE Column_Name1='Value1"
  13.     '需要在使用的时候传入strSQL查询语句
  14.     objCon.Execute strSQL
  15. End Sub

  16. Sub Read_Data(strSQL As String, shtName As String, objConn As ADODB.Connection)
  17.     '示例strSQL = "SELECT * FROM TableName"
  18.     Set objRecordSet = New ADODB.Recordset
  19.     objRecordSet.Open strSQL, objConn
  20.     '输出字段名称和查询内容
  21.     With ThisWorkbook.Sheets(shtName)
  22.         .UsedRange.ClearContents
  23.         .Range("A1").Select
  24.         For Each objField In objRecordSet.Fields
  25.             ActiveCell.Value = objField.Name
  26.             ActiveCell.Offset(0, 1).Select
  27.         Next
  28.         .Range("A2").CopyFromRecordset objRecordSet
  29.         .Range("A1").CurrentRegion.EntireColumn.AutoFit
  30.     End With
  31. End Sub
复制代码

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-16 12:33 | 显示全部楼层
进阶, 使用commit
在操作数据库时,不想实时读写,遇到错误的时候需要回滚 引用这段代码时,需要自己根据实际情况修改SQL相关字段名称和语句

新增

  1. Sub Main_Insert()
  2.    
  3.     Dim objConn As ADODB.Connection
  4.     Dim i As Integer, total_row As Integer
  5.     Dim myPath As String

  6.     '放在共享盘上,方便多人操作,权限需要通过共享盘来控制
  7.     myPath = "\\ant\Database" & "\db.mdb"
  8.      
  9.     With Sheets("新增")
  10.       total_row = .Cells(Rows.Count, 1).End(xlUp).Row
  11.         'Excel一大特征就是灵活,代价是对数据格式控制的不好,即便设置了数据有效性,也会被用户轻易覆盖,本段代码用来检查key值是否为空,可以增加检查其他字段
  12.         i = 2
  13.         Do While (i <= total_row)
  14.             If .Cells(i, 1).Value = Null Or Trim(.Cells(i, 1).Value) = "" Then
  15.                 MsgBox ("第一列Tracking Number有空值,请检查后再上传!  --" & i & "行")
  16.                 Exit Sub
  17.             End If
  18.             i = i + 1
  19.         Loop
  20.         
  21.         Set objConn = Connect(myPath)
  22.         On Error GoTo CleanFail
  23.         objConn.BeginTrans

  24.         i = 2
  25.         Do While (i  <= total_row)         

  26.             Tracking_Number = .Cells(i, 1).Value
  27.             Depart_Date = .Cells(i, 2).Value
  28.             Scan_Date = .Cells(i, 3).Value
  29.             User_Name = .Cells(i, 4).Value
  30.             Report_ID = .Cells(i, 5).Value
  31.             Filling_Number = .Cells(i, 6).Value
  32.             Uploader = .Cells(i, 7).Value

  33.             strSQL = "Insert Into Expense (Tracking_Number,Depart_Date,Scan_Date,User_Name,Report_ID,Filling_Number,Uploader) " & _
  34.                         "Values('" & Tracking_Number & "'," & _
  35.                         IIf(Depart_Date = 0, "Null", "'" & Depart_Date & "'") & "," & _
  36.                         IIf(Scan_Date = 0, "Null", "'" & Scan_Date & "'") & ",'" & _
  37.                         User_Name & "','" & Report_ID & "','" & Filling_Number & "','" & Uploader & "')"
  38.                
  39.             Set cmd = New ADODB.Command
  40.             Set cmd.ActiveConnection = objConn
  41.             cmd.CommandType = adCmdText
  42.             cmd.CommandText = strSQL
  43.             cmd.Execute

  44.             i = i + 1
  45.         Loop
  46.         '循环全部完成后统一提交
  47.         objConn.CommitTrans
  48.    
  49.     End With
  50.    
  51. CleanExit:
  52.     Call CloseConnection(objConn)
  53.     MsgBox "数据上传成功!", vbOKOnly, "成功"
  54.     Exit Sub
  55.    
  56. CleanFail:
  57.     objConn.RollbackTrans
  58.     MsgBox "上传数据有误,本次未成功上传." & Err.Description
  59.     Debug.Print Err.Number, Err.Description
  60.     Call CloseConnection(objConn)
  61.     Exit Sub

  62. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-16 12:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
删除

  1. Sub Main_Delete()
  2.    
  3.     Dim objConn As ADODB.Connection
  4.     Dim i As Integer, total_row As Integer
  5.     Dim myPath As String
  6.    
  7.     myPath = "\\ant\Database" & "\db.mdb"
  8.      
  9.     With Sheets("删除")
  10.         total_row = .Cells(Rows.Count, 1).End(xlUp).Row
  11.         'Excel一大特征就是灵活,代价是对数据格式控制的不好,即便设置了数据有效性,也会被用户轻易覆盖,本段代码用来检查key值是否为空,可以增加检查其他字段
  12.         i = 2
  13.         Do While (i <= total_row)
  14.             If .Cells(i, 1).Value = Null Or Trim(.Cells(i, 1).Value) = "" Then
  15.                 MsgBox ("第一列Parcel Tracking Number有空值,请检查后再上传!  --" & i & "行")
  16.                 Exit Sub
  17.             End If
  18.             i = i + 1
  19.         Loop
  20.         
  21.         Set objConn = Connect(myPath)
  22.         On Error GoTo CleanFail
  23.         objConn.BeginTrans
  24.    
  25.         i = 2
  26.         Do While (i < total_row + 1)          '条件判定,运行到最后一行
  27.             strSQL = "DELETE FROM Expense WHERE Tracking_Number='" & .Cells(i, 1).Value & "'"
  28.             Set cmd = New ADODB.Command
  29.             Set cmd.ActiveConnection = objConn
  30.             cmd.CommandType = adCmdText
  31.             cmd.CommandText = strSQL
  32.             cmd.Execute
  33.             i = i + 1
  34.         Loop

  35.         objConn.CommitTrans
  36.    
  37.     End With
  38.       
  39. CleanExit:
  40.     Call CloseConnection(objConn)
  41.     MsgBox "数据删除成功!", vbOKOnly, "成功"
  42.     Exit Sub

  43. CleanFail:
  44.     objConn.RollbackTrans
  45.     MsgBox "数据有误,本次未成功删除." & Err.Description
  46.     Debug.Print Err.Number, Err.Description
  47.     Call CloseConnection(objConn)
  48.     Exit Sub

  49. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-16 12:36 | 显示全部楼层
本帖最后由 心电感应 于 2019-8-16 13:57 编辑

更新
  1. Sub Main_Update()

  2.     Dim objConn As ADODB.Connection
  3.     Dim myPath As String
  4.     Dim strSQL As String
  5.     Dim shtName As String
  6.     Dim i As Integer, total_row As Integer
  7.    
  8.     myPath = "\\ant\Database" & "\db.mdb"

  9.     With ThisWorkbook.Sheets("更新")
  10.         total_row = .Cells(Rows.Count, 1).End(xlUp).Row
  11.         'Excel一大特征就是灵活,代价是对数据格式控制的不好,即便设置了数据有效性,也会被用户轻易覆盖,本段代码用来检查key值是否为空,可以增加检查其他字段
  12.         i = 2
  13.         Do While (i <= total_row)
  14.             If .Cells(i, 1).Value = Null Or Trim(.Cells(i, 1).Value) = "" Then
  15.                 MsgBox ("第一列Parcel Tracking Number有空值,请检查后再上传!  --" & i & "行")
  16.                 Exit Sub
  17.             End If
  18.             i = i + 1
  19.         Loop
  20.         
  21.         Set objConn = Connect(myPath)
  22.         On Error GoTo CleanFail
  23.         objConn.BeginTrans
  24.         
  25.         i = 2
  26.         Do While (i <= total_row)         
  27.            
  28.             Tracking_Number = .Cells(i, 1).Value
  29.             Depart_Date = .Cells(i, 2).Value
  30.             Scan_Date = .Cells(i, 3).Value
  31.             User_Name = .Cells(i, 4).Value
  32.             Report_ID = .Cells(i, 5).Value
  33.             Filling_Number = .Cells(i, 6).Value
  34.             Uploader = .Cells(i, 7).Value
  35.             
  36.             strSQL = "UPDATE Expense SET Depart_Date=" & IIf(Depart_Date = 0, "Null", "'" & Depart_Date & "'") & "," & _
  37.                      "Scan_Date=" & IIf(Scan_Date = 0, "Null", "'" & Scan_Date & "'") & "," & _
  38.                      "User_Name='" & User_Name & "'," & _
  39.                      "Report_ID='" & Report_ID & "'," & _
  40.                      "Filling_Number='" & Filling_Number & "'," & _
  41.                      "Uploader='" & Uploader & "' " & _
  42.                      "where Tracking_Number ='" & Tracking_Number & "' "
  43.                        
  44.             Set cmd = New ADODB.Command
  45.             Set cmd.ActiveConnection = objConn
  46.             cmd.CommandType = adCmdText
  47.             cmd.CommandText = strSQL
  48.             cmd.Execute
  49.             
  50.             i = i + 1
  51.         Loop
  52.         objConn.CommitTrans
  53.     End With
  54.    
  55. CleanExit:
  56.     Call CloseConnection(objConn)
  57.     MsgBox "数据更新成功!", vbOKOnly, "成功"
  58.     Exit Sub
  59.         
  60. CleanFail:
  61.     objConn.RollbackTrans
  62.     MsgBox "更新有误!" & Err.Description
  63.     Debug.Print Err.Number, Err.Description
  64.     Call CloseConnection(objConn)
  65.     Exit Sub
  66. End Sub
复制代码


查询
引用了基础模块里的Read_Data
  1. Sub Main_Read()

  2.     Dim objConn As ADODB.Connection
  3.     Dim myPath As String
  4.     Dim strSQL As String
  5.     Dim shtName As String
  6.    
  7.     myPath = "\\ant\Database" & "\db.mdb"
  8.     Set objConn = Connect(myPath)

  9.     strSQL = "Select * from Expense"
  10.     shtName = "查询"
  11.     Call Read_Data(strSQL, shtName, objConn)

  12.     Call CloseConnection(objConn)

  13. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2019-8-16 16:06 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-16 17:27 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-8-18 07:38 | 显示全部楼层
xmh850216老师,没有附件呀。可否弄个上传?

TA的精华主题

TA的得分主题

发表于 2019-8-18 11:31 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-19 11:51 | 显示全部楼层
public.zip (66.54 KB, 下载次数: 330)

附件, 新增的时候如果key和库里的数据重复,会设置成失败

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-3-25 17:45 | 显示全部楼层
xmh850216 发表于 2019-8-19 11:51
附件, 新增的时候如果key和库里的数据重复,会设置成失败

213123.JPG
运行出错
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-25 15:26 , Processed in 0.046258 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表