基于发票号将RECEIPT表数据同步至DATABASE表的VBA按钮需求
VBA实现点击按钮同步收据数据至数据库表
需求说明
点击「UPDATE RECEIPT」按钮时,将RECEIPT工作表中标记为A的值,根据对应发票号B,添加或更新至DATABASE工作表的C列对应行。
修正后的完整代码
Sub UpdateReceiptToDatabase() Dim wsReceipt As Worksheet Dim wsDatabase As Worksheet Dim receiptInvoice As Variant Dim receiptValue As Variant Dim foundRow As Range ' 指定工作表对象(用表名而非索引,避免工作表顺序变动导致错误) Set wsReceipt = ThisWorkbook.Worksheets("RECEIPT") Set wsDatabase = ThisWorkbook.Worksheets("DATABASE") ' 获取RECEIPT表中的发票号和待同步的值(请根据实际单元格地址修改B、A对应的Range) receiptInvoice = wsReceipt.Range("B2").Value ' 假设发票号在B2 receiptValue = wsReceipt.Range("A2").Value ' 假设待同步值在A2 ' 校验必要数据是否为空 If IsEmpty(receiptInvoice) Then MsgBox "发票号不能为空,请检查!", vbExclamation Exit Sub End If ' 在DATABASE表中查找匹配的发票号(假设发票号在DATABASE的第一列,可根据实际修改) Set foundRow = wsDatabase.Columns(1).Find(What:=receiptInvoice, LookIn:=xlValues, LookAt:=xlWhole) If Not foundRow Is Nothing Then ' 找到匹配行,更新C列对应值 wsDatabase.Cells(foundRow.Row, "C").Value = receiptValue MsgBox "已更新发票号为 " & receiptInvoice & " 的数据!", vbInformation Else ' 未找到匹配行,新增一行写入数据 Dim lastRow As Long lastRow = wsDatabase.Cells(Rows.Count, 1).End(xlUp).Row + 1 ' 找到数据库表最后一行的下一行 wsDatabase.Cells(lastRow, 1).Value = receiptInvoice ' 写入发票号 wsDatabase.Cells(lastRow, "C").Value = receiptValue ' 写入待同步值 MsgBox "已新增发票号为 " & receiptInvoice & " 的数据!", vbInformation End If ' 可选:清空RECEIPT表中已同步的单元格(根据需求调整) wsReceipt.Range("A2:B2").ClearContents End Sub
代码关键说明
- 工作表对象定义:用
Worksheets("表名")替代SheetX,避免工作表顺序调整后代码失效 - 发票号查找:使用
Find方法精准匹配完整发票号,比循环遍历更高效 - 新增/更新逻辑:通过判断
foundRow是否为空,区分是更新已有数据还是新增行 - 数据校验:增加发票号为空的判断,避免无效操作
原代码问题分析
- 工作表引用错误:硬编码
Sheet10/Sheet9,工作表顺序变动会直接报错;且Sheets("Sheet9").Range("Receipt!H5")写法错误,跨表引用应直接用Sheets("Receipt").Range("H5") - 逻辑不符需求:原代码是按日期匹配列,和你需要的「按发票号匹配行」逻辑完全不一致
- 无效语句:
Sheets("Sheet10").Range("").Value = ""是空Range赋值,无任何作用
按钮绑定方法
右键点击「UPDATE RECEIPT」按钮 → 选择「指定宏」→ 选中上述UpdateReceiptToDatabase宏即可。
内容的提问来源于stack exchange,提问作者Rizal Yaakub
相关产品推荐
相关产品推荐

