ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 用ADO逐条写入ACCESS数据库,关键字重复时,获取错误码,并提示错误所在的行号。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-5-10 09:18 | 显示全部楼层 |阅读模式
问题:逐条写入数据库,判断发票号码是否与数据库中的发票发码(主键)重复,以下代码能捕获Err.Number信息,但是循环写下一行,没有重复的发票号码,VBA也报相同的错误代码(见截图),找不到原因,请高手帮忙解决!

代码:
  1. Sub 写入_发票信息()
  2. Dim i1%, i2%, i3%, i4%, i5%, i6%, i7%, k%, j As Long, n As Long
  3. Dim cnn As Object, rs As Object, SQL$
  4. Dim wb As Workbook
  5. Dim ws As Worksheet
  6. Set wb = ThisWorkbook
  7. Set ws = wb.ActiveSheet
  8. i1 = Excel.Application.WorksheetFunction.Match("序号", ws.Rows(4), 0) '序号所在的列数
  9. i2 = Excel.Application.WorksheetFunction.Match("发票号码", ws.Rows(4), 0) '发票号码所在的列数
  10. i3 = Excel.Application.WorksheetFunction.Match("凭证号码", ws.Rows(4), 0) '凭证号码所在的列数
  11. i4 = Excel.Application.WorksheetFunction.Match("名称及规格", ws.Rows(4), 0) '凭证号码所在的列数
  12. i5 = Excel.Application.WorksheetFunction.Match("购置时间", ws.Rows(4), 0) '购置时间所在的列数
  13. i6 = Excel.Application.WorksheetFunction.Match("数量", ws.Rows(4), 0) '数量所在的列数
  14. i7 = Excel.Application.WorksheetFunction.Match("金额", ws.Rows(4), 0) '金额所在的列数
  15. j = ws.Cells(Rows.Count, i2).End(xlUp).Row
  16. '没有数据则退出
  17. If j < 6 Then
  18.     MsgBox "没有数据!"
  19.     Exit Sub
  20. End If
  21. Set cnn = CreateObject("adodb.connection")
  22. Set rs = CreateObject("adodb.recordset")
  23. '建立与数据库链接
  24. With cnn
  25.     .provider = "microsoft.ace.oledb.12.0"
  26.     .connectionstring = "data source=" & "E:\CTA信息管理" & "" & "技改数据.accdb"
  27.     .Open
  28. End With
  29. '删除数据
  30. SQL = "delete from 发票信息 where ID = '" & Sheets("基本信息").Range("c4") & "'"
  31. cnn.Execute SQL

  32. SQL = "select * from 发票信息 where ID = '" & Sheets("基本信息").Range("c4") & "'"
  33. rs.Open SQL, cnn, 1, 3
  34. On Error Resume Next
  35. Sheets("重号发票清单").UsedRange.ClearContents
  36. Sheets("重号发票清单").Range("a1:d1") = Array("序号", "发票号", "凭证号码", "金额")
  37. n = 6
  38. Do While n <= j

  39.     rs.AddNew
  40.     rs.Fields("发票号码").Value = ws.Cells(n, i2).Value
  41.     rs.Fields("ID").Value = Sheets("基本信息").Cells(4, 3).Value
  42.     rs.Fields("序号").Value = Int(ws.Cells(n, i1).Value)
  43.     rs.Fields("凭证号码").Value = ws.Cells(n, i3).Value
  44.     rs.Fields("名称及规格").Value = ws.Cells(n, i4).Value
  45.     rs.Fields("购置时间").Value = ws.Cells(n, i5).Value
  46.     rs.Fields("数量").Value = ws.Cells(n, i6).Value
  47.     rs.Fields("金额").Value = ws.Cells(n, i7).Value
  48.     rs.Update

  49.         If Err.Number = -2147217887 Then
  50.         k = k + 1

  51.         MsgBox "发票重号,所在行号为:" & n & Chr(10) & Chr(10) _
  52.         & "错误代码:" & Err.Number & Chr(10) _
  53.         & "错误提示:" & Err.Description
  54.         Err.Clear
  55.         
  56.             With Sheets("重号发票清单")
  57.                 .Range("a" & k + 1) = ws.Cells(n, i1).Value
  58.                 .Range("b" & k + 1) = ws.Cells(n, i2).Value
  59.                 .Range("c" & k + 1) = ws.Cells(n, i3).Value
  60.                 .Range("d" & k + 1) = ws.Cells(n, i7).Value
  61.             End With
  62.         End If
  63.     n = n + 1
  64. Loop
  65. 'myout:
  66. '
  67. '    If Err.Number = -2147217887 Then
  68. '        MsgBox "发票重号,所在行号为" & n
  69. '
  70. '    Else
  71. '        MsgBox "其他错误,错误代码:" & Err.Number & ",错误内容:" & Err.Description
  72. '
  73. '    End If

  74. '    Resume Next

  75. 'MsgBox Err.Description '错误的描述

  76. MsgBox "数据保存完毕!", vbInformation + vbOKOnly
  77. rs.Close
  78. cnn.Close
  79. Set rs = Nothing
  80. Set cnn = Nothing
  81. Set wb = Nothing
  82. Set ws = Nothing
  83. End Sub
复制代码

数据表

数据表

EXCEL文件

EXCEL文件



错误提示

错误提示


错误提示

错误提示












技改数据.rar

49.85 KB, 下载次数: 9

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-10 09:38 | 显示全部楼层
,或者有没有其他的方法可以实现重复提示。

TA的精华主题

TA的得分主题

发表于 2024-5-10 09:41 | 显示全部楼层
image.png
ID主键一般都是自动编号,具有唯一性,发票号就不要设置主键了

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-10 09:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
tanglf188 发表于 2024-5-10 09:41
ID主键一般都是自动编号,具有唯一性,发票号就不要设置主键了

主要目的是发票号码不能重号,说明重复报销了

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-10 09:49 | 显示全部楼层
tanglf188 发表于 2024-5-10 09:41
ID主键一般都是自动编号,具有唯一性,发票号就不要设置主键了

此表的ID,与基本信息表的ID是一致的,而基本信息表的ID就是自动编号 的

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-10 09:51 | 显示全部楼层
tanglf188 发表于 2024-5-10 09:41
ID主键一般都是自动编号,具有唯一性,发票号就不要设置主键了

发票重号检测,主是是防止重复记账

TA的精华主题

TA的得分主题

发表于 2024-5-10 10:11 | 显示全部楼层
cxd1001 发表于 2024-5-10 09:48
主要目的是发票号码不能重号,说明重复报销了

你代码不是判断了吗,如果代码不判断,数据库用主键设置唯一性还是会报错的,所以还是用代码判断唯一性就可以了,没必要设置主键

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-10 10:39 | 显示全部楼层
tanglf188 发表于 2024-5-10 10:11
你代码不是判断了吗,如果代码不判断,数据库用主键设置唯一性还是会报错的,所以还是用代码判断唯一性就 ...

问题在于怎么判断EXCEL文件中的发票号与ACCESS数据表中已有发票号是否重号,原先我是通过设置唯一性,存入时报销,获取ERR的值,实现重号提示的

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-10 11:56 | 显示全部楼层
或者用其他方法实现,EXCEL表中的发票号码字段值在Access发票信息表中发票号码是否已存在,并给出提示

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-10 14:12 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-16 12:01 , Processed in 0.043695 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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