VBA实现EXCEL透视表功能(汇总+计数)

本文介绍了一个使用VBA编写的透视表生成器,该工具能够根据提供的数据源快速创建Excel透视表,支持多种汇总方式及总计选项。通过定义不同的参数如汇总方式、总计方式等,可以灵活地对数据进行分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Enum 数值
    计数
    求和
End Enum
Enum 总计
    对行列禁用
    对行列启用
    仅对行启用
    仅对列启用
End Enum

Sub 调用()
    y = 透视(Sheets(1).Range("a1:d15"), True, 2, 3, 数值.求和, 总计.对行列启用, Sheets(1).[a21], 1)
    MsgBox "透视" & IIf(y, "成功", "失败")
End Sub

Function 透视(数据源 As Range, 首行为标题 As Boolean, 列标签所在列号 As Integer, 计数求和列所在列号 As Integer, 汇总方式, 总计方式, 结果起始单元格 As Range, ParamArray 行标签所列号()) As Boolean
    On Error GoTo ErrProcess
    sp1 = "|_|"
    Dim re()
    arr = 数据源
    数据起始行 = IIf(首行为标题, 2, 1)
    数据结束行 = UBound(arr)
    Set d = CreateObject("scripting.dictionary")
    Set d1 = CreateObject("scripting.dictionary")
    For i = 数据起始行 To 数据结束行
        d(arr(i, 列标签所在列号)) = ""
    Next
    列标签 = d.keys
    d.RemoveAll
    
    For i = 数据起始行 To 数据结束行
        键 = ""
        列数 = 0
        For Each t In 行标签所列号
            If t <> 列标签所在列号 And t <> 计数求和列所在列号 Then
                列数 = 列数 + 1
                键 = 键 & arr(i, t) & sp1 '作为列标签,则不能为行标签
            End If
        Next
        d1(键) = ""
        键 = 键 & arr(i, 列标签所在列号)
        If 汇总方式 = 数值.计数 Then
            d(键) = d(键) + 1
        ElseIf 汇总方式 = 数值.求和 Then
            d(键) = d(键) + arr(i, 计数求和列所在列号) * 1
        End If
    Next
    maxr = d1.Count + 2
    maxc = UBound(列标签) + 列数 + 2
    ReDim re(1 To maxr, 1 To maxc)
    列数 = 0
    For Each t In 行标签所列号
        If t <> 列标签所在列号 And t <> 计数求和列所在列号 Then
            列数 = 列数 + 1
            re(1, 列数) = IIf(首行为标题, arr(1, t), "")
        End If
    Next
    re(1, maxc) = "总计"
    re(maxr, 1) = "总计"
    For i = 0 To UBound(列标签)
        re(1, maxc - 1 - i) = 列标签(UBound(列标签) - i)
    Next
    rekey = d1.keys
    For i = 2 To maxr - 1
        tmp = Split(rekey(i - 2), sp1)
        For j = 0 To UBound(tmp) - 1
            re(i, j + 1) = tmp(j)
        Next
        For j = 0 To UBound(列标签)
            re(i, maxc - 1 - j) = d(rekey(i - 2) & 列标签(UBound(列标签) - j))
            re(maxr, maxc - 1 - j) = re(maxr, maxc - 1 - j) + re(i, maxc - 1 - j)
            re(i, maxc) = re(i, maxc) + re(i, maxc - 1 - j)
        Next
        s = s + re(i, maxc)
    Next
    re(maxr, maxc) = s
    Select Case 总计方式
        Case 总计.对行列禁用: maxr = maxr - 1: maxc = maxc - 1
        Case 总计.对行列启用 '默认
        Case 总计.仅对行启用: maxr = maxr - 1
        Case 总计.仅对列启用: maxc = maxc - 1
    End Select
    结果起始单元格.Resize(maxr, maxc) = re
    结果起始单元格.Resize(maxr, maxc).Interior.Color = 16051688
    透视 = True
    Exit Function
ErrProcess:
    Set d = Nothing
    Set d1 = Nothing
    透视 = False
End Function

SQL+数据透视+VBA 使数据透视走向更灵活,更智能,更适用。 这个是我和师傅一撇首度合作,他提供了文件并提出了要求,我帮他实现其效果 下面从几个方面解释一下: 1、功能 一个源文件和一个通过用SQL查询生成的数据透视 将源文件拖到电脑的任意位置,甚至将文件名也改掉,用VBA配上代码和窗体找到文件,数据透视仍然能够正常工作 2、套用 现在来讲讲怎么使做出来的东东适应大家的需要 2、1 用OLE DB窗口引用工作或写SQL语句,因为用这个方法同VBA相通,copy下来代码区的的语句 2、2 打开透视文件,将透视中的字段全部拖出来,也就是变成一个空数据透视。 右击下面工作图标 或者 工具》宏》visual basic 编辑器,点击模块看到代码区 2、3 将2、1步骤copy的语句commandtext的数据Array中的引号中 .CommandText = Array(" ") 可能不同版本会有一些差别,同时SQL语句中如果添加了文本生成新字段,双引号要成对翻倍 如:"出库" AS 单选项 要改成 ""出库"" AS 单选项 2、4 语句太长的处理:在代码区如果你想好看一些,你可以插入“ _”来换行,当然不能插在一个单词或自动名等中间。 2、5 将文件存盘,重新打开就会有了数据,你可以将字段拖入数据透视中,创建你自己的数据透视, 2、6 这样文件就可以使用,相信VBA的引导不用教就可以交给别人使用了 下面附上代码,包含3个区: 1、 工作簿去,打开文件时工作 Private Sub Workbook_Open() Dim OP If Dir(Sheets("path").Range("A1")) = "" Then OP = MsgBox("源文件已被移走,请选择下列选项" + Chr(10) + "1、选择是,重新输入文件全名" + Chr(10) + "2、选择否,打开原有的数据透视" + Chr(10) + "3、选择取消,关闭文件", vbYesNoCancel, "Scarlett温馨提示") If OP = vbYes Then UserForm1.Show End If If OP = vbNo Then ActiveWorkbook.Close True End If If OP = vbCancel Then Exit Sub End If Else Call refreshpv End If End Sub 2、窗体区,实现文件的查找 Private Sub CommandButton1_Click() Dim fopen As FileDialog Set fopen = Application.FileDialog(msoFileDialogFilePicker) fopen.Show TextBox1.Value = fopen.SelectedItems(1) Set fopen = Nothing End Sub Private Sub CommandButton2_Click() If InStr(TextBox1.Value, ".") > 0 Then Sheets("path").Range("A1") = TextBox1.Value Call refreshpv unload me Else MsgBox "文件名要带路径含后缀的文件名", "Scarlett_88温馨提示" TextBox1.SetFocus End If End Sub Private Sub CommandButton3_Click() Unload Me End Sub Private Sub TextBox1_Change() End Sub Private Sub UserForm_Activate() End Sub Private Sub UserForm_Click() TextBox1.Value = Sheets("path").Range("A1") End Sub 3、模块区,实现SQL语句的地址更新和刷新数据透视的数据源 Sub refreshpv() With ActiveSheet.PivotTables("数据透视1").PivotCache .Connection = Array( _ "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Sourc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值