VBA透视表

  • 目标:按照年月,统计不同日期的销售、采购以及净增(销售-采购)金额。
  • 数据源样式如下:
    17年5月到19年3月
  • 透视表效果如下:
    在这里插入图片描述
  • 代码如下:
Sub CreatePivotTable()
    Dim PTcache As PivotCache
    Dim pt As PivotTable
    
    Application.ScreenUpdating = False
'   如果存在指定工作表,则删除这个工作表
    On Error Resume Next
    Application.DisplayAlerts = False
    Sheets("PivotSheet").Delete
    On Error GoTo 0
    
'   数据放在PTcache缓存对象中。SourceData参数可以用单元格,也可以用地址
    Set PTcache = ActiveWorkbook.PivotCaches.Create( _
      SourceType:=xlDatabase, _
      SourceData:=Range("A1").CurrentRegion.Address)

    '新建一个工作表,命名为PivotSheet
    Worksheets.Add
    ActiveSheet.Name = "PivotSheet"
    '隐藏excel网格线
    ActiveWindow.DisplayGridlines = False

    '创建透视表,PivotCache:数据缓存对象;
    'TableDestination:透视表左上角位置;
    'TableName:透视表名字
    Set pt = ActiveSheet.PivotTables.Add( _
      PivotCache:=PTcache, _
      TableDestination:=Range("A1"), _
      TableName:="透视表名称")
    
    With pt
        'xlPageField:筛选,PivotFields使用数字索引,能避免用户修改字段名称报错。比如第一个字段:PivotFields(1)
        '下面示例:筛选字段‘地市’在数据源的第二个字段,也可以使用PivotFields(2)
        '.PivotFields("地市").Orientation = xlPageField
        
        'xlRowField:行
        .PivotFields("日期").Orientation = xlRowField
        
        '日期按照年月组合,单元格只要是透视表日期所在区域任意一个单元格。start和end=True表示日期组合区域包括数据源所有日期。
        'periods日期组合形式:从左到右依次为:array(秒,分,小时,天,月,季度,年),这里组合为年、月,把年月所在位置设置为True即可。
        Range("a10").Group Start:=True, End:=True, Periods:=Array(False, False, False, False, True, False, True)
        
        'xlColumnField:列
        .PivotFields("地市").Orientation = xlColumnField
        
        'xlDataField:值,默认.Function=xlsum求和
        .PivotFields("采购").Orientation = xlDataField
        .PivotFields("销售").Orientation = xlDataField
        
        '多个值,逐行展开,相当于二级index,也可以设置xlcolumnfield逐列展开。
        .DataPivotField.Orientation = xlRowField
    
		'新建一个计算字段,净增值=销售-采购
        .CalculatedFields.Add "净增值", "=销售-采购"
        .PivotFields("净增值").Orientation = xlDataField
        
		;设置数值格式:千位符;DataBodyRange是针对透视表所有单元格
        .DataBodyRange.NumberFormat = "0,000"
        
		'设置透视表类型
        .TableStyle2 = "PivotStyleMedium2"
        
		'Hide Field Headers隐藏数据行列的名字,这样透视表看起来规整。
        .DisplayFieldCaptions = False
        
        '修改字段透视表计算字段名称,不能跟字段同名,命名前面加上一个空格。
        .PivotFields("求和项:采购").Caption = " 采购"
        .PivotFields("求和项:销售").Caption = " 销售"
        .PivotFields("求和项:净增值").Caption = " 净增值"
    End With
End Sub
  • 其他补充:
    1. PivotFields除了Orientation属性外,还有Name(名称),Function(透视表值汇总依据,比如xlcount计数),NumberFormat(值的数值格式),Calculation(值显示方式,比如xlPercentOfRow行汇总百分比)等,具体设置大家也可以通过录制宏查看相关参数设置。
    2. DataPivotField.Orientation = xlRowField,当有多个值计算字段时,我们就需要设置这些计算字段是一行还是以列扩展显示,这里是行扩展显示。
    3. 如果我们只需要在固定sheet中呈现透视表内容,通常我们会通过公式-自定义名称实现透视表动态数据源选择。这样,当数据源更新时,我们只需要将新的数据写入到数据源sheet中,在原来的透视表基础上调用透视表的refresh刷新下就可以了。```
      '透视表的名称不一,具体大家可以通过录制宏查看。
      ActiveSheet.PivotTables("数据透视表1").PivotCache.Refresh
      

测试数据源:
链接:https://pan.baidu.com/s/1kr-zTqvEQ5maWzqoWcfd2g
提取码:0nay

参考:《Excel2016高级VBA编程宝典》

  • 10
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
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
可以使用 VBA 编写代码来实现透视的汇总和整理格的功能。以下是一个简单的示例代码: Sub PivotTableSummary() '定义变量 Dim pt As PivotTable Dim ws As Worksheet '设置工作 Set ws = ActiveWorkbook.Worksheets("Sheet1") '创建透视 Set pt = ws.PivotTableWizard(TableDestination:=ws.Range("H1"), _ TableName:="PivotTable1", _ RowGrand:=True, _ ColumnGrand:=True, _ SaveData:=True, _ HasAutoFormat:=True, _ AutoPage:=True, _ Reserved:=True, _ BackgroundQuery:=False, _ OptimizeCache:=True, _ PageFieldOrder:=xlDownThenOver, _ PageFieldWrapCount:=0, _ ReadData:=True) '设置透视字段 With pt.PivotFields("Region") .Orientation = xlRowField .Position = 1 End With With pt.PivotFields("Product") .Orientation = xlRowField .Position = 2 End With With pt.PivotFields("Sales") .Orientation = xlDataField .Function = xlSum .NumberFormat = "#,##0.00" End With '整理格 ws.Range("H1").Select ws.Range(Selection, Selection.End(xlToRight)).Select ws.Range(Selection, Selection.End(xlDown)).Select ws.Sort.SortFields.Clear ws.Sort.SortFields.Add Key:=Range("H2"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ws.Sort.SortFields.Add Key:=Range("I2"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal With ws.Sort .SetRange Range("H1:I11") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub 这个代码可以在 Excel 中使用,它会创建一个透视,并对格进行排序和整理。你可以根据自己的需求修改代码中的参数和字段。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值