You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Excel VBA开发需求:差旅工作簿项目公里数汇总至主工作簿

完善差旅费用工作簿汇总的VBA代码

嘿,我来帮你搞定按项目编号合并累加KM数的需求!你的现有代码已经搭好了遍历文件夹的基础框架,现在只需要加上**字典(Dictionary)**这个高效工具,就能轻松实现相同项目KM数累加、不同项目新增行的功能。

完整代码实现

Sub ConsolidateTravelExpenses()
    Dim master As Worksheet
    Dim directory As String, fileName As String
    Dim targetWB As Workbook
    Dim targetWS As Worksheet
    Dim projectID As String, kmValue As Double
    Dim kmDict As Object ' 用字典存储项目编号与累计KM数
    Dim lastRow As Long, i As Long
    
    ' 初始化主工作表
    Set master = ThisWorkbook.Worksheets(1)
    ' 创建字典对象(后期绑定,无需手动添加引用)
    Set kmDict = CreateObject("Scripting.Dictionary")
    kmDict.CompareMode = vbTextCompare ' 项目编号不区分大小写,按需调整
    
    ' 替换为你的目标文件夹路径(注意末尾加反斜杠)
    directory = "C:\YourTravelFilesFolder\"
    fileName = Dir(directory & "*.xlsx") ' 仅处理xlsx格式文件,可按需修改
    
    Application.ScreenUpdating = False ' 关闭屏幕更新提升运行速度
    
    While fileName <> ""
        Set targetWB = Workbooks.Open(directory & fileName)
        ' 定位到存储KM数据的工作表(根据你的实际表名调整)
        Set targetWS = targetWB.Worksheets("Ewidencja przebiegu pojazdu")
        
        ' 遍历目标区域的项目与KM数据(假设项目在E26:E35,KM在F26:F35,按需修改)
        For i = 26 To 35
            projectID = Trim(targetWS.Cells(i, "E").Value)
            kmValue = targetWS.Cells(i, "F").Value
            
            ' 仅处理非空的项目编号
            If projectID <> "" Then
                If kmDict.Exists(projectID) Then
                    ' 项目已存在,累加KM数
                    kmDict(projectID) = kmDict(projectID) + kmValue
                Else
                    ' 项目不存在,添加新条目
                    kmDict(projectID) = kmValue
                End If
            End If
        Next i
        
        ' 关闭目标工作簿,不保存修改
        targetWB.Close SaveChanges:=False
        ' 获取下一个文件
        fileName = Dir
    Wend
    
    ' 将字典中的汇总数据写入主工作表
    ' 清空主表原有数据(若需保留表头,从第2行开始清空)
    master.Range("A2:B" & master.Cells(master.Rows.Count, "A").End(xlUp).Row).ClearContents
    
    ' 批量写入汇总结果
    lastRow = 2 ' 假设第1行是表头:A1="项目编号",B1="累计KM数"
    For Each projectID In kmDict.Keys
        master.Cells(lastRow, "A").Value = projectID
        master.Cells(lastRow, "B").Value = kmDict(projectID)
        lastRow = lastRow + 1
    Next projectID
    
    Application.ScreenUpdating = True ' 恢复屏幕更新
    MsgBox "差旅KM数汇总完成!", vbInformation
End Sub

关键逻辑说明

  • 字典的核心作用:字典是VBA中高效的键值对存储工具,用项目编号作为唯一键,累计KM数作为对应值,能瞬间判断项目是否已存在,避免了逐行查找的低效操作。
  • 动态范围适配:如果你的项目/KM数据行数不固定,可以用End(xlUp)获取实际最后一行,替换固定的遍历范围:
    Dim lastTargetRow As Long
    lastTargetRow = targetWS.Cells(targetWS.Rows.Count, "E").End(xlUp).Row
    For i = 26 To lastTargetRow ' 从起始行到实际数据最后一行
        ' 处理逻辑不变
    Next i
    
  • 屏幕更新优化:关闭ScreenUpdating能大幅减少代码运行时的屏幕闪烁,尤其是处理大量文件时效果明显。

额外提示

如果需要保留原有代码中的其他费用数据(比如F3、R42:R43等),可以根据需求将这些数据与项目编号关联存储,或者单独处理,但核心的项目KM数合并逻辑依然可以复用字典的高效特性。

内容的提问来源于stack exchange,提问作者Remuron

火山引擎 最新活动