汇总表格式

详情表格式

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

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

 

 

 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