|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
这样就达到你的奇葩要求了
Sub 数据透视表vba法()
Dim arr
Application.ScreenUpdating = False
For i = 1 To Range("a" & Rows.Count).End(xlUp).Row
Sheet1.Cells(i, 5) = Cells(i, 1) & " " & Cells(i, 2)
Next
Set 数据源区 = Sheet1.Range("A1").CurrentRegion
Set 结果起始单元格 = Sheet1.Range("h1")
arr = 数据源区 '原始数据区
ReDim Preserve arr(1 To UBound(arr), 1 To UBound(arr, 2) + 1)
行字段数组 = Array(arr(1, 3), arr(1, 5))
列字段数组 = Array(arr(1, 1)) 'Array(arr(1, 3), arr(1, 6)) 非数组都视为没有列字段
值字段数组 = Array(arr(1, 4))
汇总函数数组 = Array(xlSum) '一定要与值字段相匹配
横向分类汇总 = False 'True 或者 1 开启分类汇总合计 False 或者 0 不开启
纵向分类汇总 = 1 'True 或者 1 开启分类汇总合计 False 或者 0 不开启
横向总合计 = 1 'False 或者 0 不要行方向合计 True 或者 1 为开启合计
纵向总合计 = 1 'False 或者 0 不要列方向合计 True 或者 1 为开启合计
重复标签 = 1 'False 或者 0 不重复标签 True 或者 1 为开启重复标签
Application.DisplayAlerts = False
Set 缓存 = ThisWorkbook.PivotCaches.Create(xlDatabase, 数据源区.Address(External:=True))
Set Pi = 缓存.CreatePivotTable(结果起始单元格)
With Pi
If IsArray(列字段数组) Then
.AddFields RowFields:=行字段数组, ColumnFields:=列字段数组 'RowFields行字段 ColumnFields列字段 PageFields筛选字段
Else
.AddFields RowFields:=行字段数组
End If
For i = 0 To UBound(值字段数组)
.AddDataField .PivotFields(值字段数组(i)), , 汇总函数数组(i) '求值
Next
'显示透视表的形式
' .RowAxisLayout xlOutlineRo '大纲型
.RowAxisLayout xlTabularRow '表格型
If 重复标签 Then
.RepeatAllLabels xlRepeatLabels
End If
.RowGrand = 横向总合计 '行方向合计
.ColumnGrand = 纵向总合计 '列方向合计
If IsArray(行字段数组) Then
For i = 0 To UBound(行字段数组) - 1
.PivotFields(行字段数组(i)).Subtotals(1) = 纵向分类汇总
Next
End If
If IsArray(列字段数组) Then
For i = 0 To UBound(列字段数组) - 1
.PivotFields(列字段数组(i)).Subtotals(1) = 横向分类汇总
Next
End If
End With
brr = 结果起始单元格.CurrentRegion
结果起始单元格.CurrentRegion.Clear
Sheet1.Columns(5).Clear
结果起始单元格.Resize(UBound(brr), UBound(brr, 2)) = brr
结果起始单元格.CurrentRegion.Borders.LineStyle = 1
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
|
|