• 20170928xlVBA自定义分类汇总


    SubtotalByCQL Range("A1:E100").Value, "Select 1,2,Sum(4),Count(4) GroupBy 1,2", Range("J1"), True
    Sub SubtotalByCQL(ByVal Arr As Variant, ByVal CQL As String, ByVal DesRange As Range, Optional Header As Boolean = False)
        Dim i As Long, j As Long, m As Long
        Dim Sel As String, Grp As String, Sels, Grps
        Dim Ar() As Variant, Br As Variant
        Dim Dic As Object
        Set Dic = CreateObject("Scripting.Dictionary")
        
        CQL = UCase(CQL)
        Sel = Replace(Replace(Split(CQL, "GROUPBY")(0), " ", ""), "SELECT", "")
        Sels = Split(Sel, ",")
        Grp = Replace(Split(CQL, "GROUPBY")(1), " ", "")
        Grps = Split(Grp, ",")
        
        If Header Then
            Key = ""
            For j = LBound(Grps) To UBound(Grps)
                Key = Key & ";" & Arr(1, CLng(Grps(j)))
            Next j
            Key = Mid(Key, 2)
            ReDim Ar(0 To 0)
            m = 0
            For j = LBound(Sels) To UBound(Sels)
                ReDim Preserve Ar(0 To m)
                If IsNumeric(Sels(j)) Then
                    Ar(m) = Arr(1, CLng(Sels(j)))
                Else
                    Select Case Split(Sels(j), "(")(0)
                    Case "SUM"
                        Ar(m) = Arr(1, CLng(Split(Split(Sels(j), "(")(1), ")")(0))) & "-求和"
                    Case "COUNT"
                        Ar(m) = Arr(1, CLng(Split(Split(Sels(j), "(")(1), ")")(0))) & "-计数"
                    End Select
                End If
                m = m + 1
            Next j
            Dic(Key) = Ar
        End If
        
        For i = LBound(Arr) + IIf(Header, 1, 0) To UBound(Arr)
            Key = ""
            For j = LBound(Grps) To UBound(Grps)
                Key = Key & ";" & Arr(i, CLng(Grps(j)))
            Next j
            Key = Mid(Key, 2)
            If Not Dic.Exists(Key) Then
                ReDim Ar(0 To 0)
                m = 0
                For j = LBound(Sels) To UBound(Sels)
                    
                    ReDim Preserve Ar(0 To m)
                    If IsNumeric(Sels(j)) Then
                        Ar(m) = Arr(i, CLng(Sels(j)))
                    Else
                        Select Case Split(Sels(j), "(")(0)
                        Case "SUM"
                            Ar(m) = Arr(i, CLng(Split(Split(Sels(j), "(")(1), ")")(0)))
                        Case "COUNT"
                            Ar(m) = 1
                        End Select
                    End If
                    m = m + 1
                Next j
                Dic(Key) = Ar
            Else
                Br = Dic(Key)
                For j = LBound(Sels) To UBound(Sels)
                    If IsNumeric(Sels(j)) Then
                    Else
                        Select Case Split(Sels(j), "(")(0)
                        Case "SUM"
                            Br(j) = Br(j) + Arr(i, CLng(Split(Split(Sels(j), "(")(1), ")")(0)))
                        Case "COUNT"
                            Br(j) = Br(j) + 1
                        End Select
                    End If
                Next j
                Dic(Key) = Br
            End If
        Next i
        DesRange.Resize(Dic.Count, UBound(Sels) + 1).Value = _
            Application.Rept(Dic.items, 1)
            Set Dic = Nothing
    End Sub
    

      

  • 相关阅读:
    bzoj 1012: [JSOI2008]最大数maxnumber 线段树
    Codeforces Round #260 (Div. 2) A , B , C 标记,找规律 , dp
    Codeforces Round #256 (Div. 2) E. Divisors 因子+dfs
    Codeforces Round #340 (Div. 2) E. XOR and Favorite Number 莫队算法
    Codeforces Round #348 (VK Cup 2016 Round 2, Div. 1 Edition) C. Little Artem and Random Variable 数学
    BZOJ 1005 [HNOI2008]明明的烦恼 purfer序列,排列组合
    BZOJ 1211: [HNOI2004]树的计数 purfer序列
    UVA 1629 Cake slicing 记忆化搜索
    UVA1630 Folding 区间DP
    BNU 51640 Training Plan DP
  • 原文地址:https://www.cnblogs.com/nextseven/p/7612581.html
Copyright © 2020-2023  润新知