【发布时间】:2015-09-25 14:37:47
【问题描述】:
我更喜欢生成一个没有链接的 Excel 报告,这样它很轻量级并且可以很容易地通过电子邮件发送。
所以我有这个从 MS Access 生成的报告 - 它将表格写入工作簿的 TAB,我之前构建了一个使用该选项卡作为源的数据透视表。
我似乎无法正常工作的是
xlPivot.PivotTables("pvAFP").RefreshTable
我的代码如下:
Public Sub ViewAFP(strPathToTemplate As String, Optional dbFullPath As String)
'10 Excel objects created
Dim xlApp As Object
Dim WB As Object
Dim xlSheet As Object
Dim xlPivot As Object
Dim rngWorkingRange As Object
Dim intCOL As Integer
Dim db As Database
Dim rsAFP_Pivot As DAO.Recordset
Dim rsAFP_Data As DAO.Recordset
Dim fld As Variant
Dim strLocation As String
'uses the 'My Documents\COB folder of the user
'C:\Users\[username]\Documents\COB
strLocation = "C:\users\" & Environ$("Username") & "\Documents\COB\AFP_Summary_" & DateString & ".xlsx"
Set xlApp = CreateObject("Excel.Application")
Set WB = xlApp.Workbooks.Open(strPathToTemplate)
Set xlSheet = WB.Sheets("AFP DATA")
Set xlPivot = WB.Sheets("AFP PIVOT")
'ALLOW FOR EXTERNAL ENGINES
If Len(dbFullPath) < 1 Then
Set db = CurrentDb
Else
Set db = OpenDatabase(dbFullPath, True)
End If
Set rsAFP_Data = db.OpenRecordset("Select * FROM AFP_DATA")
intCOL = 1
For Each fld In rsAFP_Data.Fields
xlSheet.Cells(1, intCOL).Value = fld.Name
Debug.Print fld.Name
intCOL = intCOL + 1
Next
xlSheet.Range("A2").CopyFromRecordset rsAFP_Data
Set rngWorkingRange = xlSheet.Range("A1").CurrentRegion
xlSheet.ListObjects.Add(xlSrcRange, rngWorkingRange, , xlYes).Name _
= "AFP_Data"
xlSheet.ListObjects("AFP_Data").TableStyle = "TableStyleLight9"
'set pvAFP to point to this table
xlPivot.PivotTables("pvAFP").ChangePivotCache WB.PivotCaches. _
Create(SourceType:=xlDatabase, SourceData:="AFP DATA!AFP_Data", _
Version:=xlPivotTableVersion12)
xlPivot.Select
xlPivot.PivotTables("pvAFP").RefreshTable
WB.RefreshAll
WB.SaveAs FileName:=strLocation
xlApp.Quit
Set xlSheet = Nothing
Set fld = Nothing
Set rsAFP_Data = Nothing
Set db = Nothing
Set WB = Nothing
Set xlApp = Nothing
End Sub
准备好使用就好了,因为用户需要“刷新所有”,然后才能对数据透视表执行任何操作
【问题讨论】:
-
首先,将数据存储在 Excel 中会使它变得更重而不是轻量级。链接不是数据。您会看到使用 ODBC 数据透视表的文件大小存在显着差异,尤其是当表为数千时。其次,我看到您使用模板,但您没有使用
Range().Delete删除以前的数据。另外,考虑刷新PivotCache -
但是,如果您经常将文件发送给无法访问您的网络的人 - 或者拥有设计网页的软件或权限以授予他们访问权限,该怎么办?
标签: excel ms-access vba pivot-table