zoukankan      html  css  js  c++  java
  • 20180831xlVBA_WorksheetsCosolidate

    Sub WorkSheetsConsolidate()
        Rem 设置求和区域为 单元格区域;单元格区域
        Const Setting As String = "A1;B2:C4"
        Dim StartTime As Variant
        Dim UsedTime As Variant
        StartTime = VBA.Timer
        
        AppSettings True
        Dim Wb As Workbook
        Dim Sht As Worksheet
        Dim OneSht As Worksheet
        Const MAIN_SHEET As String = "1"
        Dim Dic As Object
        Dim Key As String
        Dim OneKey
        Dim Brr
        Dim Arr As Variant
        Dim Rng As Range
        Dim RngAddress
        Dim Areas, OneArea
        
        
        
        Set Dic = CreateObject("Scripting.Dictionary")
        Set Wb = Application.ThisWorkbook
        Set Sht = Wb.Worksheets(MAIN_SHEET)
        
        Areas = Split(Setting, ";")
        For Each OneArea In Areas
            RngAddress = OneArea
            Set Rng = Sht.Range(RngAddress)
            Rng.ClearContents
            Arr = Rng.Value
            Dic(RngAddress) = Arr
        Next OneArea
        
        For Each OneKey In Dic.Keys
            For Each OneSht In Wb.Worksheets
                If OneSht.Name <> Sht.Name Then
                    Arr = Dic(OneKey)
                    RngAddress = OneKey
                    Set Rng = OneSht.Range(RngAddress)
                    Brr = Rng.Value
                    
                    If Rng.Cells.Count > 1 Then
                        
                        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 "工作表:" & OneSht.Name & vbCr & _
                                        "单元格:" & Rng.Cells(i, j).Address & "的数据不是数字,不能累加"
                                    GoTo ErrorExit
                                End If
                            Next j
                        Next i
                    Else
                        Arr = Arr + Brr
                    End If
                    '更新求和数据
                    Dic(OneKey) = Arr
                End If
            Next OneSht
        Next OneKey
        
        
        For Each OneKey In Dic.Keys
            RngAddress = OneKey
            Arr = Dic(OneKey)
            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
    
        AppSettings False
    End Sub
    
    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
    

      

  • 相关阅读:
    并行编译 Xoreax IncrediBuild
    FreeImage使用
    wxWidgets简单的多线程
    wx菜单栏
    #你好Unity3D#Hierarchy视图监听gameObject点击事件
    #你好Unity3D#Project脚本执行双击资源操作
    Unity3D研究院编辑器之Editor的GUI的事件拦截
    Unity3D研究院编辑器之脚本设置ToolBar
    Unity3D研究院编辑器之不影响原有布局拓展Inspector
    Unity3D研究院之Editor下监听Transform变化
  • 原文地址:https://www.cnblogs.com/nextseven/p/9564624.html
Copyright © 2011-2022 走看看