20170612xlVBA多文件多类别分类求和匹配

Posted Excel VBA 小天地

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20170612xlVBA多文件多类别分类求和匹配相关的知识,希望对你有一定的参考价值。

Public Sub Basic_CodeFrame()
    AppSettings
    ‘On Error GoTo ErrHandler
    Dim StartTime, UsedTime As Variant
    StartTime = VBA.Timer
    ‘Input code here

    Dim Wb As Workbook
    Dim Sht As Worksheet
    Dim OpenWb As Workbook
    Dim OpenSht As Worksheet
    Dim NewWb As Workbook
    Dim NewSht As Worksheet
    Dim Arr As Variant
    Dim i As Long, j As Long
    Dim EndRow As Long
    Dim Brr()
    Dim Crr()
    Dim Drr()
    Dim Index As Long
    Dim Index1 As Long
    Dim Index2 As Long
    Dim OneKey As Variant
   
    Dim Title As Variant
   
    Dim FolderPath As String
    Const FolderName As String = "原始文件"
    Const OutPutName As String = "结果文件"

    Const OpFile1 As String = "台面补货d.xlsx"
    Const OpFile2 As String = "品牌补货d.xlsx"
    Const OpFile3 As String = "小类补货d.xlsx"

    Dim OpPath As String


    Const AName As String = "盘点"
    Dim aFile As String, aPath As String
    Const CName As String = "产品资料"
    Dim cFile As String, cPath As String
    Const BName As String = "库存"
    Dim bFile As String, bPath As String
    Const DName As String = "销售"
    Dim dFile As String, dPath As String



    Dim aInfo(1 To 4) As Object
    Dim bInfo(1 To 4) As Object
    Dim cInfo(1 To 18) As Object
    Dim dInfo(1 To 5) As Object
    Dim dCate As Object    ‘小类
    Dim dBrand As Object    ‘品牌
    Dim Cate As String
    Dim Brand As String
    Set dCate = CreateObject("Scripting.Dictionary")
    Set dBrand = CreateObject("Scripting.Dictionary")

    Set Wb = Application.ThisWorkbook
    Set Sht = Wb.Worksheets("标题")
    Title = Sht.Range("A1:X1").Value
    FolderPath = Wb.Path & Application.PathSeparator & _
                 FolderName & Application.PathSeparator


    ‘先到C表保存各种字段信息

    For j = 1 To 18
        Set cInfo(j) = CreateObject("Scripting.Dictionary")
    Next j

    cFile = Dir(FolderPath & "*" & CName & "*.xls*")
    cPath = FolderPath & cFile
    Debug.Print cPath

    Set OpenWb = Application.Workbooks.Open(cPath)
    Set OpenSht = OpenWb.Worksheets(1)
    With OpenSht
        EndRow = .Cells(.Cells.Rows.Count, 1).End(xlUp).Row
        Set Rng = .Range("A2:R" & EndRow)
        Arr = Rng.Value
        For i = LBound(Arr) To UBound(Arr)
            Key = CStr(Arr(i, 1))
            Key = Replace(Key, " ", "")
            For j = LBound(Arr, 2) To UBound(Arr, 2)
                cInfo(j)(Key) = Arr(i, j)
            Next j
        Next i
    End With
    Set OpenSht = Nothing
    OpenWb.Close False

    ‘再到A表读取报货单
    For j = 1 To 4
        Set aInfo(j) = CreateObject("Scripting.Dictionary")
    Next j

    aFile = Dir(FolderPath & "*" & AName & "*.xls*")
    aPath = FolderPath & aFile
    Debug.Print aPath

    Set OpenWb = Application.Workbooks.Open(aPath)
    Set OpenSht = OpenWb.Worksheets(1)

    With OpenSht
        EndRow = .Cells(.Cells.Rows.Count, 1).End(xlUp).Row
        Set Rng = .Range("A2:D" & EndRow)
        Arr = Rng.Value

        For i = LBound(Arr) To UBound(Arr)
            Key = CStr(Arr(i, 1))
            Key = Replace(Key, " ", "")
            For j = LBound(Arr, 2) To UBound(Arr, 2)
                aInfo(j)(Key) = Arr(i, j)
            Next j
        Next i

    End With
    Set OpenSht = Nothing
    OpenWb.Close False


    ‘再到B表读取库存
    For j = 1 To 4
        Set bInfo(j) = CreateObject("Scripting.Dictionary")
    Next j

    bFile = Dir(FolderPath & "*" & BName & "*.xls*")
    bPath = FolderPath & bFile
    Debug.Print bPath

    Set OpenWb = Application.Workbooks.Open(bPath)
    Set OpenSht = OpenWb.Worksheets(1)

    With OpenSht
        EndRow = .Cells(.Cells.Rows.Count, 1).End(xlUp).Row
        Set Rng = .Range("A2:D" & EndRow)
        Arr = Rng.Value

        For i = LBound(Arr) To UBound(Arr)
            Key = CStr(Arr(i, 1))
            Key = Replace(Key, " ", "")
            For j = LBound(Arr, 2) To UBound(Arr, 2)
                bInfo(j)(Key) = Arr(i, j)
            Next j
        Next i

    End With
    Set OpenSht = Nothing
    OpenWb.Close False



    ‘再到D表读取销售
    For j = 1 To 5
        Set dInfo(j) = CreateObject("Scripting.Dictionary")
    Next j

    dFile = Dir(FolderPath & "*" & DName & "*.xls*")
    dPath = FolderPath & dFile
    Debug.Print dPath

    Set OpenWb = Application.Workbooks.Open(dPath)
    Set OpenSht = OpenWb.Worksheets(1)

    With OpenSht
        EndRow = .Cells(.Cells.Rows.Count, 1).End(xlUp).Row
        Set Rng = .Range("A2:D" & EndRow)
        Arr = Rng.Value

        For i = LBound(Arr) To UBound(Arr)
            Key = CStr(Arr(i, 1))
            Key = Replace(Key, " ", "")
            For j = LBound(Arr, 2) To UBound(Arr, 2)
                dInfo(j)(Key) = Arr(i, j)
            Next j
        Next i

    End With
    Set OpenSht = Nothing
    OpenWb.Close False


    ‘保存上报品牌与小类
    ‘For Each OneKey In aInfo(1).keys
    ‘Brand = cInfo(6)(OneKey) ‘保存品牌
    ‘dBrand(Brand) = ""
    ‘Cate = cInfo(4)(OneKey) ‘保存小类
    ‘dCate(Cate) = ""
    ‘Next OneKey

    ‘>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


    ‘计算台面补货
    ReDim Brr(1 To 24, 1 To 1)
    Index = 0
    For Each OneKey In aInfo(1).keys
        Index = Index + 1
        ReDim Preserve Brr(1 To 24, 1 To Index)
        Brr(1, Index) = OneKey & "     "    ‘条码
        Brr(2, Index) = cInfo(2)(OneKey)    ‘商品名称2
        Brr(3, Index) = IIf(aInfo(4)(OneKey) = "", 0, aInfo(4)(OneKey))    ‘商场库存4
        Brr(4, Index) = IIf(bInfo(3)(OneKey) = "", 0, bInfo(3)(OneKey))    ‘总部库存3
        Brr(5, Index) = IIf(dInfo(3)(OneKey) = "", 0, dInfo(3)(OneKey))    ‘销售数量3
        Brr(6, Index) = cInfo(6)(OneKey)   ‘品牌6
        Brr(7, Index) = cInfo(4)(OneKey)    ‘小类4

        Brand = cInfo(6)(OneKey)    ‘保存品牌
        dBrand(Brand) = ""
        Cate = cInfo(4)(OneKey)    ‘保存小类
        dCate(Cate) = ""

        Brr(8, Index) = (Brr(5, Index) - Brr(3, Index)) * 1.5   ‘(D-A)*1.5 要出多少货
        If Brr(8, Index) > 0 Then
            If Brr(4, Index) >= Brr(8, Index) Then    ‘库存足够出货
                Brr(9, Index) = Brr(8, Index)    ‘直接出货
                Brr(10, Index) = ""    ‘无需采购
            Else
                Brr(9, Index) = Brr(4, Index)    ‘库存全出
                Brr(10, Index) = Brr(8, Index) - Brr(4, Index)    ‘计算采购
            End If
        End If
        ‘------
        Brr(11, Index) = cInfo(3)(OneKey)    ‘大类
        Brr(12, Index) = cInfo(5)(OneKey)    ‘规格
        For j = 1 To 12
            Brr(j + 12, Index) = cInfo(j + 6)(OneKey)
        Next j
    Next OneKey

    ‘创建台面补货文件
    OpPath = Wb.Path & "\" & OutPutName & "\" & Replace(OpFile1, "d", "-" & Split(dFile, ".")(0))
    Debug.Print OpPath

    Set NewWb = Application.Workbooks.Add()
    Set NewSht = NewWb.Worksheets(1)
    NewSht.Name = Split(OpFile1, "d")(0)
    NewWb.SaveAs OpPath
    With NewSht
        .Columns("A:A").NumberFormat = "@"
        .Range("A1:X1").Value = Title
        .Range("a2").Resize(Index, 24).Value = _
        Application.WorksheetFunction.Transpose(Brr)
    End With

    NewWb.Close True
    ‘>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    ‘计算品牌与小类补货
    ReDim Crr(1 To 24, 1 To 1)
    ReDim Drr(1 To 24, 1 To 1)

    Index1 = 0
    Index2 = 0
    For Each OneKey In cInfo(1).keys

        Brand = cInfo(6)(OneKey)    ‘保存品牌
        If dBrand.Exists(Brand) Then    ‘属于改品牌
            Index1 = Index1 + 1
            ReDim Preserve Crr(1 To 24, 1 To Index1)
            Crr(1, Index1) = OneKey & "     "    ‘条码
            Crr(2, Index1) = cInfo(2)(OneKey)    ‘商品名称2
            Crr(3, Index1) = IIf(aInfo(4)(OneKey) = "", 0, aInfo(4)(OneKey))    ‘商场库存4
            Crr(4, Index1) = IIf(bInfo(3)(OneKey) = "", 0, bInfo(3)(OneKey))    ‘总部库存3
            Crr(5, Index1) = IIf(dInfo(3)(OneKey) = "", 0, dInfo(3)(OneKey))    ‘销售数量3
            Crr(6, Index1) = cInfo(6)(OneKey)   ‘品牌6
            Crr(7, Index1) = cInfo(4)(OneKey)    ‘小类4
            Crr(8, Index1) = (Crr(5, Index1) - Crr(3, Index1)) * 1.5   ‘(D-A)*1.5 要出多少货
            If Crr(8, Index1) > 0 Then
                If Crr(4, Index1) >= Crr(8, Index1) Then    ‘库存足够出货
                    Crr(9, Index1) = Crr(8, Index1)    ‘直接出货
                    Crr(10, Index1) = ""    ‘无需采购
                Else
                    Crr(9, Index1) = Crr(4, Index1)    ‘库存全出
                    Crr(10, Index1) = Crr(8, Index1) - Crr(4, Index1)    ‘计算采购
                End If
            End If
            ‘------
            Crr(11, Index1) = cInfo(3)(OneKey)    ‘大类
            Crr(12, Index1) = cInfo(5)(OneKey)    ‘规格
            For j = 1 To 12
                Crr(j + 12, Index1) = cInfo(j + 6)(OneKey)
            Next j
        End If
        Cate = cInfo(4)(OneKey)    ‘保存小类
        If dCate.Exists(Cate) Then
            Index2 = Index2 + 1
            ReDim Preserve Drr(1 To 24, 1 To Index2)
            Drr(1, Index2) = OneKey & "     "    ‘条码
            Drr(2, Index2) = cInfo(2)(OneKey)    ‘商品名称2
            Drr(3, Index2) = IIf(aInfo(4)(OneKey) = "", 0, aInfo(4)(OneKey))    ‘商场库存4
            Drr(4, Index2) = IIf(bInfo(3)(OneKey) = "", 0, bInfo(3)(OneKey))    ‘总部库存3
            Drr(5, Index2) = IIf(dInfo(3)(OneKey) = "", 0, dInfo(3)(OneKey))    ‘销售数量3
            Drr(6, Index2) = cInfo(6)(OneKey)   ‘品牌6
            Drr(7, Index2) = cInfo(4)(OneKey)    ‘小类4
            Drr(8, Index2) = (Drr(5, Index2) - Drr(3, Index2)) * 1.5   ‘(D-A)*1.5 要出多少货
            If Drr(8, Index2) > 0 Then
                If Drr(4, Index2) >= Drr(8, Index2) Then    ‘库存足够出货
                    Drr(9, Index2) = Drr(8, Index2)    ‘直接出货
                    Drr(10, Index2) = ""    ‘无需采购
                Else
                    Drr(9, Index2) = Drr(4, Index2)    ‘库存全出
                    Drr(10, Index2) = Drr(8, Index2) - Drr(4, Index2)    ‘计算采购
                End If
            End If
            ‘------
            Drr(11, Index2) = cInfo(3)(OneKey)    ‘大类
            Drr(12, Index2) = cInfo(5)(OneKey)    ‘规格
            For j = 1 To 12
                Drr(j + 12, Index2) = cInfo(j + 6)(OneKey)
            Next j
        End If

    Next OneKey

    ‘创建品牌补货文件
    OpPath = Wb.Path & "\" & OutPutName & "\" & Replace(OpFile2, "d", "-" & Split(dFile, ".")(0))
    Debug.Print OpPath

    Set NewWb = Application.Workbooks.Add()
    Set NewSht = NewWb.Worksheets(1)
    NewSht.Name = Split(OpFile2, "d")(0)
    NewWb.SaveAs OpPath
    With NewSht
        .Columns("A:A").NumberFormat = "@"
        .Range("A1:X1").Value = Title
        .Range("a2").Resize(Index, 24).Value = _
        Application.WorksheetFunction.Transpose(Crr)
    End With

    NewWb.Close True

    ‘创建小类补货文件
    OpPath = Wb.Path & "\" & OutPutName & "\" & Replace(OpFile3, "d", "-" & Split(dFile, ".")(0))
    Debug.Print OpPath

    Set NewWb = Application.Workbooks.Add()
    Set NewSht = NewWb.Worksheets(1)
    NewSht.Name = Split(OpFile3, "d")(0)
    NewWb.SaveAs OpPath
    With NewSht
        .Columns("A:A").NumberFormat = "@"
        .Range("A1:X1").Value = Title
        .Range("a2").Resize(Index, 24).Value = _
        Application.WorksheetFunction.Transpose(Drr)
    End With

    NewWb.Close True


    UsedTime = VBA.Timer - StartTime
    ‘Debug.Print "UsedTime:" & Format(UsedTime, "0.000 Seconds")
    MsgBox "UsedTime:" & Format(UsedTime, "0.000 Seconds"), vbOKOnly, "NS  QQ "
ErrorExit:
    AppSettings False
    Exit Sub
ErrHandler:
    If Err.Number <> 0 Then
        MsgBox Err.Description & "!", vbCritical, "NS QQ "
        Debug.Print Err.Description
        Err.Clear
        Resume ErrorExit
    End If
End Sub
Public Sub AppSettings(Optional IsStart As Boolean = True)
    If IsStart Then
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
        Application.Calculation = xlCalculationManual
        Application.StatusBar = ">>>>>>>>Macro Is Running>>>>>>>>"
    Else
        Application.ScreenUpdating = True
        Application.DisplayAlerts = True
        Application.Calculation = xlCalculationAutomatic
        Application.StatusBar = False
    End If
End Sub

  

以上是关于20170612xlVBA多文件多类别分类求和匹配的主要内容,如果未能解决你的问题,请参考以下文章

20170622xlVBA多部门分类汇总同类合并单元格

20161227xlVBA多文件合并计算

20170624xlVBA正则分割分类汇总

20171113xlVba指定文件夹多簿多表分表合并150

oracle 同一张表不同类别数据求和wnet

excel表格中怎么分类求和?