利用Excel-Vba进行多表汇总和数据透视表

汇总表格式

详情表格式

要求根据汇总表中的信息,到详情表中查找详细物料的具体个数

最终,对物料的个数进行汇总,结果如下图:

 ExcelVba代码如下(有一些注释代码供参考)

Sub Start()
    Sheet1.UsedRange.Clear
    
    '定义结果数组
    Dim detail
    
    '计算过程中屏幕不刷新
    Application.ScreenUpdating = False
    'm表示当前detail数组中已有的元素个数
    m = 1
    '定义一个大数组,用于放置结果
    ReDim detail(1 To 10000, 1 To 2)
    '结果的表头
    detail(1, 1) = "物料代码"
    detail(1, 2) = "数量"
    '当前工作簿所在地址
    p = ThisWorkbook.Path & ""
    '打开汇总表
    Set sumsheet = GetObject(p & "汇总.xlsx").Sheets(1)
    '获取汇总表中的内容
    rng = sumsheet.UsedRange
    '对汇总表中的内容,从第二行开始循环
    For i = 2 To UBound(rng)
        '获取详细表的名称
        fileName = rng(i, 1) & ".xls"
        '获取板卡数量
        bandCount = rng(i, 2)
        '获取详细信息的excel对象
        Set excelobj = GetObject(p & fileName)
        '获取详细信息所在的sheet
        Set sdetail = excelobj.Sheets(1)
        '获取sheet中数据
        arr = sdetail.UsedRange
        '释放excel
        Set excelobj = Nothing
        '对于每一条详细信息做循环,j=1是表头
        For j = 2 To UBound(arr)
           
             '在已有的数据中找到重复项
            For k = 2 To m
                '如果结果中存在相同项
                If detail(k, 1) = arr(j, 1) Then
                    '对数量进行求和
                    detail(k, 2) = detail(k, 2) + arr(j, 3) * bandCount
                    '进入下一次循环
                    GoTo n
                End If
                
            Next
            'm表示当前detail数组中已有的元素个数
             m = m + 1
            '累计detail用m
            '取物料代码
            detail(m, 1) = arr(j, 1)
            '计算物料数量
            detail(m, 2) = arr(j, 3) * bandCount
            
'goto 跳出本次循环
n:
        Next
        
    Next
'   循环遍历文件
'    Do While f <> ""
'        If f <> ThisWorkbook.Name Then
'             n = n + 1
'             Set sht = GetObject(p & f).Sheets(1)
'             Arr = sht.UsedRange
'             Workbooks(f).Close False
'             For i = 1 To UBound(Arr)
'                 m = m + 1
'                 brr(m, 1) = f
'                 For j = 2 To r
'                     brr(m, j) = Arr(i, j - 1)
'                 Next
'              Next
'         End If
'         f = Dir
'    Loop
   
    
    
    Set sumsheet = Nothing
    With Sheet1
        .[a1].Resize(m, UBound(detail, 2)) = detail
    End With
    
'    Range("A2").Select
'    ActiveWindow.ScrollRow = 1
'    'Sheets.Add
'    ActiveWorkbook.PivotCache.CreatePivotTable TableDestination:="Sheet2!R3C1", TableName:="数据透视表3", DefaultVersion:=1
'    Range("A3").Activate
'    ActiveSheet.PivotTable.AddDataField Field:=ActiveSheet.PivotTable.PivotField
'    With ActiveSheet.PivotTable.PivotField
'        .Orientation = xlRowField
'        .Position = 1
'    End With
    
' Call BuildPivotTable
    Application.ScreenUpdating = True
End Sub

'创建数据透视表 Sub BuildPivotTable() TableName = "数据透视表5" ActiveWindow.ScrollRow = 1 '建立透视表缓存数据 Set ptcache = ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:=Sheet1.UsedRange) '建立透视表,TableDestination用于指定 创建表的位置,wps这个参数好像没用,一直都会新建一个表,并以A1单元格为左上角定位 Set pt = ptcache.CreatePivotTable(TableDestination:=Sheet1.Range("D10"), TableName:=TableName, DefaultVersion:=1) '将物料代码作为行字段 With ActiveSheet.PivotTables(TableName).PivotFields("物料代码") .Orientation = xlRowField .Position = 1 End With ' With ActiveSheet.PivotTables(TableName).PivotFields("数量") ' .Orientation = xlColumnField ' .Position = 1 ' End With '对数据透视表 添加数据字段datafield ActiveSheet.PivotTables(TableName).AddDataField ActiveSheet.PivotTables(TableName).PivotFields("数量"), "求和:数量", xlSum End Sub
原文地址:https://www.cnblogs.com/xiaoti/p/9672517.html