zoukankan      html  css  js  c++  java
  • 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
    

      

  • 相关阅读:
    JS中关于clientWidth offsetWidth scrollWidth 等的含义
    javascript中数组concat()join()split()
    我的大数据学习路线(持续更新)
    java多线程-学习笔记
    java多线程-线程交互&互斥&同步
    java多线程-关键人物程咬金
    java多线程-军队战争
    java多线程-两个演员线程
    pytorch-Flatten操作
    龙良曲pytorch学习笔记_迁移学习
  • 原文地址:https://www.cnblogs.com/nextseven/p/7129109.html
Copyright © 2011-2022 走看看