ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4372|回复: 5

[分享] 使用AutoShow生成前5名的数据透视表!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-11-20 21:20 | 显示全部楼层 |阅读模式
今天学习Bill Jelen的作品,使用VBA代码来创建。
我在文件里面做了详细说明,希望大家创建数据透视表使有用!这些代码的确是很好的学习资料,可以按F8键一步一步执行,了解数据透视表的生成过程! AutoShow_前5名.rar (1.81 MB, 下载次数: 153)
创建数据透视表.rar (1.84 MB, 下载次数: 131)

[ 本帖最后由 yanjie 于 2008-11-22 11:11 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-11-20 21:22 | 显示全部楼层
所有代码如下(注意是本人粗浅的理解,不足之处多多指教!)
Option Explicit

Sub Top5Markets()
'定义变量!
Dim WSD As Worksheet
Dim WSR As Worksheet
Dim WBN As Workbook
Dim pt As PivotTable
Dim pc As PivotCache
Dim prange As Range
Dim Finalrow As Long
Dim Finalcol As Long
Dim lastrow As Long

'给工作表设置一个变量,便于使用。
Set WSD = Worksheets("Pivottable")      '注意名字中大小写字母没有什么区别。

'删除工作表中所有的透视表!pt.tablerange1和pt.tablerange2的区别,后者是透视表全部单元格,前者不包括页字段的单元格区域!
For Each pt In WSD.PivotTables
pt.TableRange2.Clear
Next

'清除R:AZ列的所有内容。
WSD.Range("R1:AZ1").EntireColumn.Clear

'定义变动行号和列号!
Finalrow = WSD.Cells(Rows.Count, 1).End(xlUp).Row
Finalcol = WSD.Cells(1, Columns.Count).End(xlToLeft).Column

'设置变动数据源区域!
Set prange = WSD.Cells(1, 1).Resize(Finalrow, Finalcol)

'通过建立一个数据透视表缓存来创建透视表!需提供数据源的类型和数据源的单元格区域地址(文本)。即什么地方,什么数据源。
Set pc = ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:=prange.Address)

'建立透视表要求提供:透视表放在哪个单元格,什么名字!
Set pt = pc.CreatePivotTable(tabledestination:=WSD.Cells(2, Finalcol + 2), tablename:="pivottable1")

'停止透视表计算!加速代码执行速度!
pt.ManualUpdate = True

'添加行和列字段!
pt.AddFields RowFields:="Market", ColumnFields:="region"

'添加数字字段!
With pt.PivotFields("Revenue")
    .Orientation = xlDataField
    .Position = 1
    .NumberFormat = "#,##0"
    .Name = "Total Revenue"
End With

'对数字区域字段的空单元格设置为0
pt.NullString = "0"

'对字段Market进行自动排序!
pt.PivotFields("Market").AutoSort Order:=xlDescending, field:="Total Revenue"

'显示字段前5位!
pt.PivotFields("Market").AutoShow Type:=xlAutomatic, Range:=xlTop, Count:=5, field:="Total Revenue"

'计算以显示字段内容!
pt.ManualUpdate = False
pt.ManualUpdate = True

'新建一个空工作簿,一个工作表,取名Report
Set WBN = Workbooks.Add(xlWBATWorksheet)
Set WSR = WBN.Worksheets(1)
WSR.Name = "Report"

'设置A1单元格格式
With WSR.[a1]
    .Value = "Top 5 Markets"
    .Font.Size = 14
End With

'复制数据透视表到新工作簿里!
pt.TableRange2.Offset(1, 0).Copy
WSR.[a3].PasteSpecial Paste:=xlPasteValuesAndNumberFormats

'确定新工作簿里最后一行的第一个单元格,填充为"前五位合计数"
lastrow = WSR.Cells(65536, 1).End(xlUp).Row
WSR.Cells(lastrow, 1).Value = "前五位合计数"

'这一点尤其值得学习,隐藏行字段求得合计数。我曾为这一点感到很困难!
pt.PivotFields("Market").Orientation = xlHidden
pt.ManualUpdate = False
pt.ManualUpdate = True

'偏移2行复制合计数到新工作簿最后一行
pt.TableRange2.Offset(2, 0).Copy
WSR.Cells(lastrow + 2, 1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats
WSR.Cells(lastrow + 2, 1).Value = "Total company"

'清除数据透视表!
pt.TableRange2.Clear

'释放内存!
Set pc = Nothing

'使单元格自动适应列宽!
WSR.Range(WSR.Range("a3"), WSR.Cells(lastrow + 2, 10)).Columns.AutoFit

加粗第3行字体!
Range("a3").EntireRow.Font.Bold = True

'第3行字体靠右边设置
Range("a3").EntireRow.HorizontalAlignment = xlRight

'A3单元格靠左边对齐!
Range("a3").HorizontalAlignment = xlLeft

Range("a2").Select
MsgBox "CEO 报告创建完成"

End Sub

TA的精华主题

TA的得分主题

发表于 2008-11-20 21:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
很好。。支持版主。

TA的精华主题

TA的得分主题

发表于 2011-2-17 09:32 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-6-19 00:19 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-3-23 13:45 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-30 09:38 , Processed in 0.048439 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表