2017-01-05 8 views
1

Итак, у меня есть запрос ms с параметром (назовем его «qry_Accounting»), и я связал этот параметр с полем, связанным с поле со списком. Таким образом, я могу фильтровать свои данные с помощью combobox.старые данные при обновлении сводной таблицы, связанной с запросом ms с параметром

Затем я создал сводную таблицу на основе запроса ms. Обычно я должен видеть данные, связанные с элементом, выбранным в поле со списком. Я вижу, что когда я изменяю элемент, выбранный в поле со списком, данные изменяются в «qry_Accounting». Мне пришлось создать кнопку, так что, когда я изменю выбранный элемент и нажмем на кнопку, он обновит сводную таблицу.

Моя проблема: у меня всегда есть данные из предыдущего выбранного элемента в сводной таблице и только эти данные. Я действительно не понимаю, что происходит. Если я создаю новую сводную таблицу, у нее будут правильные данные, но поведение будет продолжаться, когда я изменю элемент, я все равно всегда сохраняю предыдущие данные, и я не получаю новые данные.

Еще одна вещь. Если я вручную обновляю таблицу, она будет работать. Он будет работать даже для нескольких сводных таблиц, когда я обновляю один из них, если они все связаны с одной и той же таблицей qry_Accounting.

Как я могу отобразить правильные данные, не спрашивая у пользователя постоянно обновляться вручную?

PS: Я уже изменил свойство «Количество элементов для сохранения за поле» на «none».

После некоторых вопросов в комментарии здесь больше моего кода (при нажатии на кнопку, чтобы применить изменения COMBOBOX):

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

Вы пропускаете ** «средний-человек» ** для 'PivotTable', и это 'PivotCache', вам нужно обновить' PivotCache' с новым обновленным «диапазоном данных», и только после того, как вы сможете использовать 'pt.RefreshTable' –

+0

Hey There Shai Rado, спасибо за ваш ответ. Я проверил онлайн, и, согласно Microsoft, это только чтение. https://msdn.microsoft.com/en-us/library/office/ff834938(v=office.15).aspx –

+0

Что такое только чтение? PivotCache? –

ответ

0

Так как я не ваш запрос («Table_edu_ana_invoices_query4»), я проверил код, приведенный ниже, используя Access DB, а просто написал запрос в коде ниже (вы увидите в коде Комментарии).

Дайте мне знать, если вы выясните, как изменить раздел Query в соответствии с вашими потребностями.

Код

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 
+0

Эй, спасибо за код. Я попробовал это, и я получил сообщение об ошибке «Set .recordset = rs»: «Ошибка времени выполнения» -2147417848 (80010108) »: Ошибка автоматизации. Объект, вызванный, отключен от своих клиентов». Я тестировал набор записей, и он работает, я могу перемещаться по нему. Но у pivotcache, похоже, нет активного свойства набора записей (при использовании часов на сводном кэше, я вижу, что для набора записей: «определено приложение или определена ошибка объекта». –

+0

@Bencorr не стесняйтесь повышать :) –

+0

Я сделал, но я я совершенно новый на сайте, и кажется, что он не появляется. У меня есть 15 очков, я думаю. –

0

Таким образом, в конце концов, я изменил способ, я делаю вещи, так как я не мог заставить его работать с MS запроса. Теперь я использую запрос excel 2016 и больше никаких параметров. Файл больше, он медленнее, но он работает (у меня в моих данных более 100 тыс. Строк). Я использую slicer для фильтрации таблицы. Я использую VBA для обновления значения slicer до значения в поле со списком. Таким образом, Pivottable получает правильные данные все время. Кажется, сводная таблица имеет проблему при использовании запроса MS с параметром, по крайней мере, это то, что я получаю от этого опыта. Вероятно, я попытаюсь снова в будущем с другим документом.

Спасибо за вашу помощь Шай Rado, я узнал довольно много вещей, сводные таблицы и их кэш :)