Database Excel VBA:更新数据透视源数据

Database Excel VBA:更新数据透视源数据,database,vba,excel,pivot,Database,Vba,Excel,Pivot,我试图记录代码以更新pivot sourcedata,这给了我以下信息: ActiveSheet.PivotTableWizard SourceType:=xlExternal, _ SourceData:=QueryArry1, _ Connection:=Array( _ Array("ODBC;DSN=MS Access Database;DBQ=" & DBDir & "\" & DBName & ";"), _

我试图记录代码以更新pivot sourcedata,这给了我以下信息:

ActiveSheet.PivotTableWizard SourceType:=xlExternal, _
    SourceData:=QueryArry1, _
    Connection:=Array( _
        Array("ODBC;DSN=MS Access Database;DBQ=" & DBDir & "\" & DBName & ";"), _
        Array("DefaultDir=" & DBDir & ";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;") _
    )
但这甚至不允许我指定要更新哪个透视表。。。或者甚至做我真正想做的事情,即更新数据透视缓存,以便更新使用相同源的所有数据透视表

那么,更新sourcedata的好方法是什么呢

谢谢

编辑:

但我甚至得到了“应用程序定义的或对象定义的错误”错误,原因很简单:

str = Sheets("Totals").PivotTables("PivotTable2").PivotCache.CommandText
Sheets("Totals").PivotTables("PivotTable2").PivotCache.CommandText = str
我再次检查了我的数据透视表是否仍在访问实时数据,并刷新它是否仍然有效。。。但是我无法将命令字符串设置为当前的值?真奇怪


谢谢

可以通过工作簿访问数据透视缓存。您可以使用以下子项列出所有当前缓存:

Option Explicit

Private Sub listCaches()
    Dim selectedCache As PivotCache

    For Each selectedCache In ThisWorkbook.PivotCaches
        Debug.Print selectedCache.Index
        Debug.Print selectedCache.Connection
    Next selectedCache

End Sub
您可以访问要编辑的连接:

ThisWorkbook.PivotCaches(yourIndex).Connection
注意:更改连接后,您应呼叫:

ThisWorkbook.PivotCaches(yourIndex).Refresh
编辑:您可以更改命令文本,而不是更改源数据。这应该有同样的效果。以下代码适用于我:

ThisWorkbook.PivotCaches(1).CommandText = "SELECT movies.title, movies.rating, movies.comments FROM `C:\Folder\moviesDB`.movies movies"
ThisWorkbook.PivotCaches(1).Refresh
这段代码还更新了我的SourceData

Edit2:通过数据透视表更改命令文本:

Sheets("mySheet").PivotTables("PivotTable1").PivotCache.CommandText = "SELECT movies.title as meh, movies.rating, movies.comments FROM `C:\Folder\moviesDB`.movies movies"
Sheets("mySheet").PivotTables("PivotTable1").PivotCache.Refresh
注意:moviesDB是一个.mdb文件,movies是表/查询


注2:它还可以帮助您
调试。在更改工作命令文本之前,请打印它。这将为您的新CommandText提供一个模板。

可以通过工作簿访问数据透视缓存。您可以使用以下子项列出所有当前缓存:

Option Explicit

Private Sub listCaches()
    Dim selectedCache As PivotCache

    For Each selectedCache In ThisWorkbook.PivotCaches
        Debug.Print selectedCache.Index
        Debug.Print selectedCache.Connection
    Next selectedCache

End Sub
您可以访问要编辑的连接:

ThisWorkbook.PivotCaches(yourIndex).Connection
注意:更改连接后,您应呼叫:

ThisWorkbook.PivotCaches(yourIndex).Refresh
编辑:您可以更改命令文本,而不是更改源数据。这应该有同样的效果。以下代码适用于我:

ThisWorkbook.PivotCaches(1).CommandText = "SELECT movies.title, movies.rating, movies.comments FROM `C:\Folder\moviesDB`.movies movies"
ThisWorkbook.PivotCaches(1).Refresh
这段代码还更新了我的SourceData

Edit2:通过数据透视表更改命令文本:

Sheets("mySheet").PivotTables("PivotTable1").PivotCache.CommandText = "SELECT movies.title as meh, movies.rating, movies.comments FROM `C:\Folder\moviesDB`.movies movies"
Sheets("mySheet").PivotTables("PivotTable1").PivotCache.Refresh
注意:moviesDB是一个.mdb文件,movies是表/查询


注2:它还可以帮助您
调试。在更改工作命令文本之前,请打印它。这将为您的新CommandText提供一个模板。

连接正常,我正在尝试更改源数据。。。但当我尝试“ThisWorkbook.PivotCaches(2).SourceData=QueryAry1”时,会出现“应用程序定义或对象定义错误”。。。我开始认为这种类型的SourceData引用是只读的,不能用于设置值。我尝试了几种不同形式的QueryAry1,包括“QueryAry1=ThisWorkbook.PivotCaches(2).SourceData”。。。我总是遇到同样的错误我不确定你的查询里的内容是什么,但我想你想更改发送到数据库的查询。更改命令文本对我很有用。我在回答中添加了一个示例代码。Pivot缓存不断更改其索引。。。因此,我正在尝试命令:“工作表(“总计”).PivotTables(“数据透视表1”).PivotCache.CommandText=“从总计中选择*”,但它给了我一个错误:“应用程序定义的或对象定义的错误”。我能够用我在回答中添加的代码更改CommandText到高数据透视表。我还可以通过尝试将CommandText设置为错误的查询(如“SEEELEKT*From…”)或在查询中不包含数据库的路径来复制您的错误。谢谢您的帮助。虽然它仍然不起作用,但您确实帮助我完善了我的问题和方法。我已经创建了一个新线程来解决我在这里遇到的特定错误:连接很好,我正在尝试更改SourceData。。。但当我尝试“ThisWorkbook.PivotCaches(2).SourceData=QueryAry1”时,会出现“应用程序定义或对象定义错误”。。。我开始认为这种类型的SourceData引用是只读的,不能用于设置值。我尝试了几种不同形式的QueryAry1,包括“QueryAry1=ThisWorkbook.PivotCaches(2).SourceData”。。。我总是遇到同样的错误我不确定你的查询里的内容是什么,但我想你想更改发送到数据库的查询。更改命令文本对我很有用。我在回答中添加了一个示例代码。Pivot缓存不断更改其索引。。。因此,我正在尝试命令:“工作表(“总计”).PivotTables(“数据透视表1”).PivotCache.CommandText=“从总计中选择*”,但它给了我一个错误:“应用程序定义的或对象定义的错误”。我能够用我在回答中添加的代码更改CommandText到高数据透视表。我还可以通过尝试将CommandText设置为错误的查询(如“SEEELEKT*From…”)或在查询中不包含数据库的路径来复制您的错误。谢谢您的帮助。虽然它仍然不起作用,但您确实帮助我完善了我的问题和方法。我已经创建了一个新线程来解决我在这里遇到的特定错误: