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

      

  • 相关阅读:
    SDNU 1219.sign up problem
    SDNU 1232.A*B Problem(高精度)
    Go操作MySQL
    BootStrap jQuery 在线cdn
    Go语言标准库之http/template
    Go语言基础之net/http
    Go语言基础之网络编程
    Go语言基础之单元测试
    Go语言基础之rand(随机数)包
    Go语言基础之并发
  • 原文地址:https://www.cnblogs.com/nextseven/p/7612581.html
Copyright © 2011-2022 走看看