处理数量较大的数据时,通常分为数据获取、数据筛选,以及结果展现几个步骤。在 Excel 中,咱们能够利用数据透视表(Pivot Table)方便快捷的实现这些工做。php
本文首先手把手的教你如何在 Excel 中手动构建一个基本的数据透视表,最后用 VBA 展现如何自动化这一过程。html
注: 数据库
Excel 提供了丰富的数据来源,咱们能够从 HTML、文本、数据库等处获取数据。windows
这个步骤本文不展开讨论,如下是咱们做为分析来源的工做表数据:bash
sheet1
注意观察对话框中的各类选项,这里咱们都采用默认值编辑器
点击“肯定”后,一个空的数据透视表出如今了新工做表中:ide
i
图标此时一个基本的数据透视表已经成型工具
有时基本的字段并不能知足分析的须要,此时就能够在数据透视表中插入基于公式计算的自定义字段。开发工具
下面用不一样的方法加入两个自定义字段:ui
首先简单计算一下各队的场均进球数:
/
=进球/场次
再简单的评估一下球队的防守质量,这里咱们假设以以下 Excel 公式判断:
= IF(净胜球>=0,2,1)
防守还不错的取 2,不佳的则标记为 1。
除了能够在“数据透视表生成器”中指定若干个“过滤器”,切片器(Slicers)也能够用来过滤数据,使分析工做更清晰化。
切片器的建立很是简单:
至此,咱们获得了一个基于源数据的、能够自由组合统计维度、能够用多种方式筛选展现的数据透视表。
能够在 Ribbon 的“设计”菜单中选择预设的样式等,本文不展开论述。
以上就是建立数据透视表的基本过程。
基本的数据透视表的建立和调整并不复杂,但若是有不少相似的重复性工做的话,使用一些简单的 VBA 来自动化这一过程,将极大提高工做的效率。
本例中使用 VBA 脚本完成与上述例子同样的任务,对于 VBA 语言仅作简单注释,想更多了解能够自行查阅官方的文档等
此处咱们放置一个按钮在源数据所在的数据表,用于每次点击自动生成一个数据透视表。
ThisWorkbook.onCreatePovit
Sub onCreatePovit()
Application.DisplayAlerts = False
' 声明变量 Dim sheet1 As Worksheet Dim pvtTable As PivotTable Dim pvtField As PivotField Dim pvtSlicerCaches As SlicerCaches Dim pvtSlicers As slicers Dim pvtSlicer As Slicer ' 删除可能已存在的透视表
Dim existFlag As Boolean
Dim ws As Worksheet
For Each ws In Worksheets
If ws.Name = "pivot1" Then existFlag = True: Exit For
Next
If existFlag = True Then
Sheets("pivot1").Select
ActiveWindow.SelectedSheets.Delete
End If
' 初始化 Set sheet1 = ActiveWorkbook.Sheets("sheet1") Set pvtSlicerCaches = ActiveWorkbook.SlicerCaches ' 指定数据源
sheet1.Select
Range("A1").Select
' 建立透视表 Set pvtTable = sheet1.PivotTableWizard ActiveSheet.Name = "pivot1" ' 指定行和列
pvtTable.AddFields _
RowFields:=Array("平", "球队"), _
ColumnFields:="Data"
' 指定数据字段 Set pvtField = pvtTable.PivotFields("失球") pvtField.Orientation = xlDataField pvtField.Function = xlAverage pvtField.Name = "平均值/失球" Set pvtField = pvtTable.PivotFields("进球") pvtField.Orientation = xlDataField pvtField.Function = xlAverage pvtField.Name = "平均值/进球" Set pvtField = pvtTable.PivotFields("积分") pvtField.Orientation = xlDataField pvtField.Function = xlAverage pvtField.Name = "平均值/积分" ' 指定计算字段
pvtTable.CalculatedFields.Add Name:="场均进球", Formula:="=进球/场次"
Set pvtField = pvtTable.PivotFields("场均进球")
pvtField.Orientation = xlDataField
pvtField.Function = xlAverage
pvtField.Name = "平均值/场均进球"
pvtTable.CalculatedFields.Add Name:="防守质量", Formula:="= IF(净胜球>=0,2,1)"
Set pvtField = pvtTable.PivotFields("防守质量")
pvtField.Orientation = xlDataField
pvtField.Function = xlCount
pvtField.Name = "计数/防守质量"
' 指定切片器 Set pvtSlicers = pvtSlicerCaches.Add(pvtTable, "胜", "胜_" & ActiveSheet.Name).slicers Set pvtSlicer = pvtSlicers.Add(ActiveSheet, , , , 300, 400) Set pvtSlicers = pvtSlicerCaches.Add(pvtTable, "负", "负_" & ActiveSheet.Name).slicers Set pvtSlicer = pvtSlicers.Add(ActiveSheet, , , , 350, 450) ' 指定过滤器
Set pvtField = pvtTable.PivotFields("更新日期")
pvtField.Orientation = xlPageField
Application.DisplayAlerts = True
End Sub复制代码
回到界面中,每次点击按钮就会在新工做表中生成结构和以前例子一致的数据透视表
若是遇到此类问题,可按如下步骤尝试解决:
vbe6ext.OLB
from http://www.121down.com/soft/softview-63611.html
vbe6ext.OLB
to C:\Program Files\Common Files\microsoft shared\VBA\VBA6
and C:\Program Files\Common Files\microsoft shared\VBA\VBA7
and C:\Program Files\Common Files\microsoft shared\VBA\VBA7.1