如何以编程方式在 VBA 中重新定义 Pivot Table 数据源
How can I programmatically redefine a Pivot Table datasource in VBA
使用 'CopyFromRecordset' 是将数据源从 MS Access 保持到枢轴 table- 'unlinked' 的有效方法。
Access 数据库生成独立的报告,无需宏即可通过电子邮件发送。
我正在尝试编写一个例程来自动重新定义数据透视表 table 的数据源。我知道足以清理录制的宏,因此它不会有杂散的 Excel 对象保持打开状态,但有时我会错过一些让对象保持打开状态的东西 - 或者没有正确设置对象。
在这种特殊情况下,它位于这一行:
xlSheet.ListObjects.Add(xlSrcRange, xlSheet.Range(rngWorkingRange), , xlYes).Name _
= "tbl_MOSI"
我收到 运行-时间错误“1004”
对象定义错误
这是我的完整套路供参考:
Public Sub GetMOSIData(strSheetToPlaceData As String, strPathToWorkbook As String)
'Puts a recordset into a specific cell of an Excel workbook
'''
'8 objects created
Dim xlApp As Object
Dim WB As Object
Dim xlSheet As Object
Dim xlMain As Object
Dim xlOther As Object
Dim fld As Variant
Dim rs As DAO.Recordset
Dim rngWorkingRange As Range
Dim x As Integer
'''
'6 objects set
Set xlApp = CreateObject("Excel.Application")
Set WB = xlApp.Workbooks.Open(strPathToWorkbook)
Set xlSheet = WB.Sheets(strSheetToPlaceData) 'or you can manually type the sheet name in place of strSheetToPlaceData
Set xlMain = WB.Sheets("MOSI")
Set xlOther = WB.Sheets("SKL-LV-View")
Set rs = CurrentDb.OpenRecordset("Select * from " & strSheetToPlaceData)
'Assumes you will use A1 as the anchor cell - but it can be changed
'FIRST CLEAR THE RANGE OF CELLS
xlSheet.Range("A1").CurrentRegion.ClearContents
'PLACE THE FIELD NAMES
x = 1
For Each fld In rs.Fields
xlSheet.Cells(1, x).Value = fld.Name
x = x + 1
Next
'PLACE
xlSheet.Range("A2").CopyFromRecordset rs
'determine the data range for the PivotTable
'RECORDING FOR REFERENCE - I DON'T USE THIS CODE
'
' Sheets("tbl_MOSI_Detail").Select
' Range("C4").Select
' ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A:$AB411"), , xlYes).Name _
' = "Table1"
' Range("Table1[#All]").Select
' ActiveSheet.ListObjects("Table1").TableStyle = "TableStyleLight9"
' ActiveSheet.ListObjects("Table1").Name = "tbl_MOSI"
' Sheets("MOSI").Select
' Range("G4").Select
' ActiveSheet.PivotTables("pvMOSI").ChangePivotCache ActiveWorkbook.PivotCaches. _
' Create(SourceType:=xlDatabase, SourceData:="tbl_MOSI_Detail!tbl_MOSI", _
' Version:=xlPivotTableVersion12)
'END RECORDING FOR REFERENCE
'ATTEMPT to clean up recording...
'7th object set
Set rngWorkingRange = xlSheet.Range("A1").CurrentRegion
'convert tbl_MOSI_Detail Range into a Table
xlSheet.ListObjects.Add(xlSrcRange, xlSheet.Range(rngWorkingRange), , xlYes).Name _
= "tbl_MOSI"
xlSheet.ListObjects("tbl_MOSI").TableStyle = "TableStyleLight9"
'set pvMOSI to point to this table
xlMain.PivotTables("pvMOSI").ChangePivotCache WB.PivotCaches. _
Create(SourceType:=xlDatabase, SourceData:="tbl_MOSI_Detail!tbl_MOSI", _
Version:=xlPivotTableVersion12)
xlMain.RefreshAll
xlMain.Select
WB.Save
WB.Close
xlApp.Quit
'8 objects destroyed
Set rs = Nothing
Set rngWorkingRange = Nothing
Set fld = Nothing
Set xlSheet = Nothing
Set xlMain = Nothing
Set xlOther = Nothing
Set WB = Nothing
Set xlApp = Nothing
PresentExcel (strPathToWorkbook)
MsgBox "MOSI report is complete", vbOKOnly, "MOSI"
End Sub
您的 rngWorkingRange
变量是一个范围,您像使用字符串一样使用它。你需要
xlSheet.ListObjects.Add(xlSrcRange, rngWorkingRange, , xlYes).Name _
= "tbl_MOSI"
你也可以说 xlSheet.Range(rngWorkingRange.Address)
,但那太傻了。
你说的是 xlSheet.Range(rngWorkingRange.Value)
因为 Value 是 Range 对象的默认值 属性。如果 rngWorkingRange 是一个单元格,其值可以解释为范围地址,则不会出现错误。但是 rngWorkingRange.Value returns 数组和 xlSheet.Range(...) 不知道如何处理数组。
使用 'CopyFromRecordset' 是将数据源从 MS Access 保持到枢轴 table- 'unlinked' 的有效方法。
Access 数据库生成独立的报告,无需宏即可通过电子邮件发送。
我正在尝试编写一个例程来自动重新定义数据透视表 table 的数据源。我知道足以清理录制的宏,因此它不会有杂散的 Excel 对象保持打开状态,但有时我会错过一些让对象保持打开状态的东西 - 或者没有正确设置对象。
在这种特殊情况下,它位于这一行:
xlSheet.ListObjects.Add(xlSrcRange, xlSheet.Range(rngWorkingRange), , xlYes).Name _
= "tbl_MOSI"
我收到 运行-时间错误“1004” 对象定义错误
这是我的完整套路供参考:
Public Sub GetMOSIData(strSheetToPlaceData As String, strPathToWorkbook As String)
'Puts a recordset into a specific cell of an Excel workbook
'''
'8 objects created
Dim xlApp As Object
Dim WB As Object
Dim xlSheet As Object
Dim xlMain As Object
Dim xlOther As Object
Dim fld As Variant
Dim rs As DAO.Recordset
Dim rngWorkingRange As Range
Dim x As Integer
'''
'6 objects set
Set xlApp = CreateObject("Excel.Application")
Set WB = xlApp.Workbooks.Open(strPathToWorkbook)
Set xlSheet = WB.Sheets(strSheetToPlaceData) 'or you can manually type the sheet name in place of strSheetToPlaceData
Set xlMain = WB.Sheets("MOSI")
Set xlOther = WB.Sheets("SKL-LV-View")
Set rs = CurrentDb.OpenRecordset("Select * from " & strSheetToPlaceData)
'Assumes you will use A1 as the anchor cell - but it can be changed
'FIRST CLEAR THE RANGE OF CELLS
xlSheet.Range("A1").CurrentRegion.ClearContents
'PLACE THE FIELD NAMES
x = 1
For Each fld In rs.Fields
xlSheet.Cells(1, x).Value = fld.Name
x = x + 1
Next
'PLACE
xlSheet.Range("A2").CopyFromRecordset rs
'determine the data range for the PivotTable
'RECORDING FOR REFERENCE - I DON'T USE THIS CODE
'
' Sheets("tbl_MOSI_Detail").Select
' Range("C4").Select
' ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A:$AB411"), , xlYes).Name _
' = "Table1"
' Range("Table1[#All]").Select
' ActiveSheet.ListObjects("Table1").TableStyle = "TableStyleLight9"
' ActiveSheet.ListObjects("Table1").Name = "tbl_MOSI"
' Sheets("MOSI").Select
' Range("G4").Select
' ActiveSheet.PivotTables("pvMOSI").ChangePivotCache ActiveWorkbook.PivotCaches. _
' Create(SourceType:=xlDatabase, SourceData:="tbl_MOSI_Detail!tbl_MOSI", _
' Version:=xlPivotTableVersion12)
'END RECORDING FOR REFERENCE
'ATTEMPT to clean up recording...
'7th object set
Set rngWorkingRange = xlSheet.Range("A1").CurrentRegion
'convert tbl_MOSI_Detail Range into a Table
xlSheet.ListObjects.Add(xlSrcRange, xlSheet.Range(rngWorkingRange), , xlYes).Name _
= "tbl_MOSI"
xlSheet.ListObjects("tbl_MOSI").TableStyle = "TableStyleLight9"
'set pvMOSI to point to this table
xlMain.PivotTables("pvMOSI").ChangePivotCache WB.PivotCaches. _
Create(SourceType:=xlDatabase, SourceData:="tbl_MOSI_Detail!tbl_MOSI", _
Version:=xlPivotTableVersion12)
xlMain.RefreshAll
xlMain.Select
WB.Save
WB.Close
xlApp.Quit
'8 objects destroyed
Set rs = Nothing
Set rngWorkingRange = Nothing
Set fld = Nothing
Set xlSheet = Nothing
Set xlMain = Nothing
Set xlOther = Nothing
Set WB = Nothing
Set xlApp = Nothing
PresentExcel (strPathToWorkbook)
MsgBox "MOSI report is complete", vbOKOnly, "MOSI"
End Sub
您的 rngWorkingRange
变量是一个范围,您像使用字符串一样使用它。你需要
xlSheet.ListObjects.Add(xlSrcRange, rngWorkingRange, , xlYes).Name _
= "tbl_MOSI"
你也可以说 xlSheet.Range(rngWorkingRange.Address)
,但那太傻了。
你说的是 xlSheet.Range(rngWorkingRange.Value)
因为 Value 是 Range 对象的默认值 属性。如果 rngWorkingRange 是一个单元格,其值可以解释为范围地址,则不会出现错误。但是 rngWorkingRange.Value returns 数组和 xlSheet.Range(...) 不知道如何处理数组。