如何自动将不同发票工作表的指定单元格数据汇总至日志表?
解决方法
方法1:用公式实现批量引用不同工作表的D21(动态引用)
如果日志表的A列已填入各发票工作表的名称(比如A1为"INV-001"、A2为"INV-002"),在B1单元格输入以下公式:
=INDIRECT("'"&A1&"'!D21")
下拉填充时,公式会自动匹配A列对应的工作表名称,读取该表D21的值。
若不想手动输入工作表名称,可在A1单元格输入数组公式(输入后按Ctrl+Shift+Enter确认),自动提取当前工作簿除日志表外的所有工作表名(假设日志表名为"日志"):
=INDEX(GET.WORKBOOK(1),ROW()+1)&T(NOW())
搭配上述INDIRECT公式,就能自动生成所有发票表的金额引用。
方法2:用VBA自动将D21静态值写入日志表(推荐,彻底解放手动操作)
这个方法能让你复制模板工作表并重命名后,自动把该表D21的静态值写入日志表最后一行,无需手动输入公式:
- 按
Alt+F11打开VBA编辑器 - 在左侧工程窗口找到你的工作簿,右键选择「插入」→「模块」
- 粘贴以下代码:
Sub 新增发票并记录金额() Dim 模板表 As Worksheet Dim 新发票表 As Worksheet Dim 日志表 As Worksheet Dim 发票编号 As String Dim 应付总额 As Double ' 根据实际情况修改模板表和日志表名称 Set 模板表 = ThisWorkbook.Worksheets("模板") Set 日志表 = ThisWorkbook.Worksheets("日志") ' 输入发票编号 发票编号 = InputBox("请输入发票编号:") If 发票编号 = "" Then Exit Sub ' 复制模板表并重命名 模板表.Copy After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count) Set 新发票表 = ActiveSheet 新发票表.Name = 发票编号 ' 获取静态金额并写入日志表 应付总额 = 新发票表.Range("D21").Value With 日志表 Dim 最后一行 As Long 最后一行 = .Cells(.Rows.Count, "A").End(xlUp).Row + 1 .Cells(最后一行, "A").Value = 发票编号 .Cells(最后一行, "B").Value = 应付总额 .Cells(最后一行, "C").Value = "" ' 收款时间列,后续手动填写 ' 若需自动填创建日期,可替换为:.Cells(最后一行, "C").Value = Date End With MsgBox "发票" & 发票编号 & "已创建,金额已记录到日志表!" End Sub
- 将工作簿保存为启用宏的格式(.xlsm)
- 可给宏添加工作表按钮,点击即可一键创建发票并记录金额
如果已手动创建多个发票表,想批量导入所有表的D21静态值,用这个宏:
Sub 批量导入所有发票金额到日志() Dim 日志表 As Worksheet Dim ws As Worksheet Dim 最后一行 As Long Set 日志表 = ThisWorkbook.Worksheets("日志") ' 如需清空现有数据,可取消下面一行注释 ' 日志表.Range("A2:C" & 日志表.Rows.Count).ClearContents For Each ws In ThisWorkbook.Worksheets ' 跳过模板表和日志表 If ws.Name <> "模板" And ws.Name <> "日志" Then 最后一行 = 日志表.Cells(日志表.Rows.Count, "A").End(xlUp).Row + 1 日志表.Cells(最后一行, "A").Value = ws.Name 日志表.Cells(最后一行, "B").Value = ws.Range("D21").Value 日志表.Cells(最后一行, "C").Value = "" End If Next ws MsgBox "批量导入完成!" End Sub
补充:手动将公式结果转为静态值
如果已用公式引用D21,想把公式转为静态值,选中对应单元格区域按Ctrl+C复制,右键选择「粘贴选项」→「值」即可。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

