zoukankan      html  css  js  c++  java
  • 20180830xlVBA_合并计算

    Sub WorkbooksSheetsConsolidate()
        Rem 设置求和区域为 sheet名称/单元格区域;sheet名称/单元格区域
        Const Setting As String = "Sheet1/A1:G6;Sheet1/A8:E8;Sheet1/F8:G8;Sheet2/A1:G3;Sheet2/A5:G5"
        Const FOLDER_NAME As String = "文件夹"
        Dim StartTime As Variant
        Dim UsedTime As Variant
        StartTime = VBA.Timer
        
        AppSettings True
        Dim Wb As Workbook
        Dim Sht As Worksheet
        Dim Dic As Object
        Dim Key As String
        Dim OneKey
        Dim Brr
        Dim Arr As Variant
        Dim Rng As Range
        Dim FilePaths, FilePath
        Dim FolderPath As String
        Dim OpenWb As Workbook
        Dim OpenSht As Worksheet
        
        
        Set Dic = CreateObject("Scripting.Dictionary")
        Set Wb = Application.ThisWorkbook
        FolderPath = Wb.Path & "" & FOLDER_NAME & ""
        
        Dim SheetName, RngAddress
        Dim Areas, OneArea
        Areas = Split(Setting, ";")
        For Each OneArea In Areas
            SheetName = Split(OneArea, "/")(0)
            RngAddress = Split(OneArea, "/")(1)
            '解析地址 初始化数组
            On Error Resume Next
            Set Sht = Wb.Worksheets(SheetName)
            If Err.Number = 9 Then
                MsgBox "当前工作簿不存在名为【" & SheetName & "】的工作簿!", vbInformation, "Information"
                GoTo ErrorExit
            End If
            On Error GoTo 0
            
            Set Rng = Sht.Range(RngAddress)
            Rng.ClearContents
            Arr = Rng.Value
            Debug.Print SheetName; "   "; RngAddress
            Do
                If Dic.Exists(SheetName) = False Then Exit Do
                SheetName = SheetName & "@"
            Loop
            Dic(SheetName) = Array(RngAddress, Arr)
            
            
        Next OneArea
        
        
        FilePaths = FsoGetFiles(FolderPath, "*.xls*")
        If FilePaths(1) = "None" Then
            MsgBox "指定文件夹未找到任何工作簿!", vbInformation, "Information"
            GoTo ErrorExit
        End If
        
        For Each FilePath In FilePaths
            Set OpenWb = Application.Workbooks.Open(FilePath)
            For Each OneKey In Dic.Keys
                SheetName = Replace(OneKey, "@", "")
                On Error Resume Next
                Set OpenSht = OpenWb.Worksheets(SheetName)
                If Err.Number = 9 Then
                    MsgBox "打开工作簿不存在名为【" & SheetName & "】的工作簿!", vbInformation, "Information"
                    OpenWb.Close False
                    GoTo ErrorExit
                End If
                On Error GoTo 0
                
                
                
                Ar = Dic(OneKey)
                RngAddress = Ar(0)
                Arr = Ar(1)
                
                Set Rng = OpenSht.Range(RngAddress)
                Brr = Rng.Value
                
                For i = LBound(Arr) To UBound(Arr)
                    For j = LBound(Arr, 2) To UBound(Arr, 2)
                        If IsNumeric(Brr(i, j)) Then
                            '只有为数字时才可以相加
                            Arr(i, j) = Arr(i, j) + Brr(i, j)
                        Else
                            MsgBox "工作簿:" & FilePath & vbCr & _
                                          "工作表:" & SheetName & vbCr & _
                                          "单元格:" & Rng.Cells(i, j).Address & "的数据不是数字,不能累加"
                            GoTo ErrorExit
                        End If
                    Next j
                Next i
                
                '更新求和数据
                Ar(1) = Arr
                Dic(OneKey) = Ar
            Next OneKey
            OpenWb.Close False
        Next FilePath
        
        For Each OneKey In Dic.Keys
            SheetName = Replace(OneKey, "@", "")
            Ar = Dic(OneKey)
            RngAddress = Ar(0)
            Arr = Ar(1)
            Set Sht = Wb.Worksheets(SheetName)
            Set Rng = Sht.Range(RngAddress)
            Rng.Value = Arr
        Next OneKey
        
        
        UsedTime = VBA.Timer - StartTime
        Debug.Print "UsedTime :" & Format(UsedTime, "#0.0000 Seconds")
        'MsgBox "UsedTime :" & Format(UsedTime, "#0.0000 Seconds")
        
        
    ErrorExit:
        Set Dic = Nothing
        Set Wb = Nothing
        Set Sht = Nothing
        Set Rng = Nothing
        Set OpenWb = Nothing
        Set OpenSht = Nothing
        Erase Arr
        Erase Brr
        Erase Ar
        AppSettings False
    End Sub
    Function FsoGetFiles(ByVal FolderPath As String, ByVal Pattern As String, Optional ComplementPattern As String = "") As String()
        Dim Arr() As String
        Dim FSO As Object
        Dim ThisFolder As Object
        Dim OneFile As Object
        ReDim Arr(1 To 1)
        Arr(1) = "None"
        Dim Index As Long
        Index = 0
        Set FSO = CreateObject("Scripting.FileSystemObject")
        On Error GoTo ErrorExit
        Set ThisFolder = FSO.getfolder(FolderPath)
        If Err.Number <> 0 Then Exit Function
        For Each OneFile In ThisFolder.Files
            If OneFile.Name Like Pattern Then
                If Len(ComplementPattern) > 0 Then
                    If Not OneFile.Name Like ComplementPattern Then
                        Index = Index + 1
                        ReDim Preserve Arr(1 To Index)
                        Arr(Index) = OneFile.Path
                    End If
                Else
                    Index = Index + 1
                    ReDim Preserve Arr(1 To Index)
                    Arr(Index) = OneFile.Path
                End If
            End If
        Next OneFile
    ErrorExit:
        FsoGetFiles = Arr
        Erase Arr
        Set FSO = Nothing
        Set ThisFolder = Nothing
        Set OneFile = Nothing
    End Function
    Sub AppSettings(Optional IsStart As Boolean = True)
        Application.ScreenUpdating = IIf(IsStart, False, True)
        Application.DisplayAlerts = IIf(IsStart, False, True)
        Application.Calculation = IIf(IsStart, xlCalculationManual, xlCalculationAutomatic)
        Application.StatusBar = IIf(IsStart, ">>>>>>>>Macro Is Running>>>>>>>>", False)
    End Sub
    

      

  • 相关阅读:
    《算法》C++代码 Floyd
    《算法》C++代码 快速排序
    3-3当访问到一个文件跳转到另一个文件
    分别应用include指令和include动作标识在一个jsp页面中包含一个文件。
    历届试题 蚂蚁感冒
    HDU 2817 A sequence of numbers
    HDU-2018 母牛的故事
    算法提高 复数归一化
    算法提高 十进制数转八进制数
    算法提高 约数个数
  • 原文地址:https://www.cnblogs.com/nextseven/p/9562420.html
Copyright © 2011-2022 走看看