所以我有一个带有参数的ms查询(让我们称之为" qry_Accounting" )并且我将此参数链接到链接到组合框的字段。这样我就可以使用组合框过滤我的数据。
然后我根据ms查询创建了一个数据透视表。通常,我应该能够看到链接到组合框中所选项目的数据。我可以看到,当我更改组合框中选择的项目时,数据会在" qry_Accounting" 中更改。我不得不创建一个按钮,这样当我更改所选项目并单击按钮时,它将刷新数据透视表。
我的问题是我总是拥有数据透视表中上一个所选项目的数据,而且只有该数据。我真的不明白会发生什么。如果我创建一个新的数据透视表,它将拥有正确的数据,但是当我更改项目时,行为仍在继续,我仍然保留以前的数据,但我不会获得新数据。
还有一件事,如果我手动刷新表,它将起作用。如果它们全部链接到同一个qry_Accounting表,当我刷新其中一个数据透视表时,它甚至可以工作。
如何在不要求用户手动刷新的情况下显示正确的数据?
PS:我已经更改了属性"每个字段要保留的项目数"到"无"。
在评论中有一些问题,这里有更多我的代码(当点击按钮应用组合框更改时):
Sub Button5_Click()
'If the buffer place (O4) is different from the combo linked cell (F4) then
'assign the value from F4 to O4.
'the table will then be updated because as soon as O4 value changes the
'table is updated (the parameter is taken from O4)
If Sheets("base_pivot").Range("O4").Value <> Sheets("base_pivot").Range("F4").Value Then
Sheets("base_pivot").Range("O4").Value = Sheets("base_pivot").Range("F4").Value
'We wait 5 seconds to avoid access denied problems
Application.Wait (Now + #12:00:05 AM#)
'we ask for a refresh of the pivot tables explicitely
RefreshPivotTables ActiveWorkbook
'we ask for a refresh of all data.
ActiveWorkbook().RefreshAll
End If
End Sub
Sub RefreshPivotTables 代码
Sub RefreshPivotTables(wb As Workbook)
Dim ws As Worksheet
Dim pt As PivotTable
Dim pi As PivotItem
Dim pf As PivotField
For Each ws In wb.Worksheets
For Each pt In ws.PivotTables
pt.PivotCache().Refresh
pt.RefreshTable
Next
Next
End Sub
除此之外,一切都是自动的。 ms查询有一个参数,因此只要更新O4值,新数据就会加载到表中。 那么唯一要做的就是刷新数据表。
答案 0 :(得分:0)
由于我没有您的查询(“Table_edu_ana_invoices_query4”),我使用 Access DB 测试了以下代码,在下面的代码中编写了查询(您将在代码注释中看到)。
如果您弄清楚如何根据需要修改“查询”部分,请告诉我。
<强>代码强>
Sub RefreshPivotTables(wb As Workbook)
Dim ws As Worksheet
Dim pt As PivotTable
Dim ptCache As PivotCache
Dim pi As PivotItem
Dim pf As PivotField
Dim con As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim cmdCommand As ADODB.Command
'===== modify here to put your Connection String to your DB =====
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Radoshits\Desktop\Database11.accdb"
'===== this is the String query I am using >> replace with yours =====
rs.Open "SELECT * FROM Table1", con, adOpenStatic, adLockReadOnly
For Each ws In wb.Worksheets
For Each pt In ws.PivotTables
' update Pivot Cache with Query settings
With pt.PivotCache
Set .Recordset = rs
.Refresh
End With
Next pt
Next ws
Set rs = Nothing
con.Close
Set con = Nothing
End Sub
答案 1 :(得分:0)
所以最后我改变了我做事的方式,因为我无法使用MS查询。我现在正在使用excel 2016查询而不再使用参数。文件更大,速度更慢,但它有效(我的数据中有超过100k行)。我正在使用切片器来过滤表格。我正在使用VBA将切片器值更新为组合框中的值。这样,pivottable可以始终获得正确的数据。当使用带有参数的MS查询时,似乎数据透视表存在问题,至少这是我从这次体验中获得的。我可能会在将来再试一次文件。
感谢您对Shai Rado的帮助,我学习了一些数据透视表及其缓存:)