napisał: jalamas postów: 316
umieszczony: 29 sierpnia 2007 21:17
edytowany: 29 sierpnia 2007 21:19
|
|
Ta no i załączonym przeze mnie linku jest pytanie:
Cytat:1. Rozumiem, że one mają ten sam CacheIndex ?
Lecz przy prawidłwoym projekcie ten kod nie jest potrzebny, bo jest to ten sam "cache" i to chciał powiedzieć LAnd.
... |
|
napisał: michalko postów: 25
umieszczony: 29 sierpnia 2007 09:52
|
|
Dzięi wszystkim za linki i podpowiedzi.
Znalazłem to, czego szukałem
Makro wygląda bardzo prosto
Sub ChangePivotCache()
'change pivot cache for all pivot tables in workbook
Dim pt As PivotTable
Dim wks As Worksheet
For Each wks In ActiveWorkbook.Worksheets
For Each pt In wks.PivotTables
pt.CacheIndex = Sheets("Arkusz1").PivotTables(1).CacheIndex 'wpisz nazwę arkusza, założenie że jest w nim tylko jedna tabela
Next pt
Next wks
End Sub |
|
napisał: jalamas postów: 316
umieszczony: 31 lipca 2007 14:53
edytowany: 31 lipca 2007 14:55
|
|
Ja zapewne nie rozumiem problemu.
LAnd podał takie hasło: PivotCache Object
I słusznie, bo jak sadzę powinieneś mieć 1-den PivotCache, tylko dla tabeli A.
Resztę tabel oprzeć na tym PivotCache tabeli A.
A wygląda z Twojego opisu, że opierasz je bezpośrednio na tej samej kwerendzie tworząc dla każdej PivotCache,
a nie na tym samym PivotCache.
Chyba, że nie zrozumiałam tekstu ostatniego, bo tu A i tam A, tabela A i kwerenda A.
Ile masz PivotCaches w skoroszycie (Count) ?
Zrobiłam sobie taki przykład dla tematu z
http://www.vbamania.estrefa.pl/?go=forum&go2=zobacz&id_watek=1163&return=watek
2 tabele na 1-dnym PivotCache, zmieniam SQL w kodzie, dodając (zmieniając, przy tych samych polach) WHERE, jak tam chciał Moreno i nie mam problemu.
Więc nie jest dla mnie wsio jasne.
Nie wiem czy jasno się wyraziłam. |
|
napisał: michalko postów: 25
umieszczony: 31 lipca 2007 13:44
|
|
Hej, może nie wyrażam się zbyt jasno, więc teraz napiszę po kolei o co chodzi:
W pliku jest kilka arkuszy np 10
W arkuszu A jest tabela przestawna A, która czerpie dane z kwerendy access A
W arkuszu B jest tabela przest. B, która oparta jest na tabeli A z arkusza A, więc tez czerpie dane z kwerendy A
W arkuszu C jest tabela przest. C, która podobnie jak B oparta jest na tabeli A
itd
Oczywiście jeżeli odświeżam tabelę A odświeżają się wszystkie.
Problem polega na tym, że excel nie zapisuje tego, że tabela B jest oparta na tabeli A, tylko pomaięta że tabela A i B powstają z kwerendy A i jeżeli odświeża kwerendę A, to odświeżają się wszystkie oparte na niej tabele. (no chyba że tu się mylę, ale u mnie to tak działą - Excel2002)
Problem pojawia się, jeżeli w kwerndzie A coś zmienię lub zmienię kwenedę, tak, że tabela A będzie się opierała na kwerendzie B (zmiana danych). Co się stanie? Tabele B, C itd dalej opierają się na kwerendzie A i są odświeżane niezależnie. Excel olewa to, że tabela B, C itp opiera się na tabeli A.
A ja chcę, żeby wszystkie tabelę opierały się na kwerendzie B. Można to zrobić pokazując znowu po kolei każdej tabeli w kreatorze, zęby opeirała się na tabeli A, ale jak arkusze z tabelami są ukryte to trzeba się długo bawić.
Skracając: nie chodzi mi o samo ODŚWIEŻANIE, chodzi mi o ZMIANĘ DANYCH. Wygląy tabel się nie zmieniają.
Czyli trzeba, żeby VBA zrobił:
1. pokazał wszystkim tabelom, żeby opierały się na tabeli A lub
2. pozamieniał ich kwerendy lub cache (nie wiem jak) na taki sam jak ma tabela A
To pewnie nie jest takie trudne, ale nie wiem jak to zrobić. |
|
napisał: LAnd postów: 107
umieszczony: 4 lipca 2007 18:00
|
|
Jeżeli zmianie ulegają tylko dane do poniżsa procedura umieszczona w nowym module kodu i uruchomiona odświeży wszystkie tabele
Sub TabelePrzestRefreshy()
Dim WSh As Worksheet, PvT As PivotTable, MsgStr, isTest As Boolean
For Each WSh In ThisWorkbook.Worksheets
For Each PvT In WSh.PivotTables
If UCase(WSh.Name) = UCase("arkusz z bazą") And _
UCase(PvT.Name) = UCase("nazwa tabeli bazowej") Then
'gdyby odświeżanie tabeli bazowej trwało bardzo długo to
'napis arkusz z bazą : zastąpić faktyczna nazwą arkusza
'a napis nazwa tabeli bazowej : zastąpić faktyczną nazwą tabeli
' zostanie pominięte odświeżanie tej tabeli
Else
PvT.RefreshTable
End If
Next
Next
End Sub
Jezeli zmieniasz liczbę pól w kolumnach i\lub w wierszach to programowe wyszukiwanie nowych lub usunietych pól i wprowadzenie tych zmian w pozostałych 29-ciu tabelach jest dość skomplikowane do napisania i może być trudnre do zrozumienia.
Zakladając, że poprzednie 29 arkuszy z klonami tablicy źródłowej zostało wykonane programowo
1. usunąć 29 arkuszy z klonami tablicy
2 uruchomić tamtą procedurę tak aby dodała 29 nowych arkuszy z nowymi odpowiednimi tabelami a jako żrodło danych podać zmienioną tabelę bazową
trudno mi cokowiek innego radzić gdyż nie znam celu ani sposobu tworzenia 29 arkuszy z tablicami
gdybym cokolwiek wiedział może dałoby się obmyśleć jakąs racjonalizację procesu |
|
napisał: LAnd postów: 107
umieszczony: 4 lipca 2007 12:16
|
|
nie potrzebujesz używać kreatora tabel jeżeli tabele już istnieją i zostały utworzone na podstawie danych w innej tabeli
po zmianie danych w atbeli źródłowej wystarczy programowo wywołać dla każdej tabeli metodę odświeżania jej danych ( tak jabyś przy użyciu paska narzędzi tabeli przestawnej wybrał wykrzyknik )
czy zaobserwowałes która procedura obsługi zdarzeń w arkuszu tabeli źródłowej jest uruchamiana ?
Worksheet_Change czy Worksheet_Calculate()
czas będę mial dopiero ok 16 i postaram się jak najszybciej odpowiedzieć |
|
napisał: michalko postów: 25
umieszczony: 4 lipca 2007 10:19
|
|
Ok
To działa, bo pokazuje mi ścieżki tabel
Ale jak zrobić, żeby wszystki table zmieniły swoje dane źródłowe: żeby opierały się na takich samych danych jak tabela podstawowa, czyli jak włączyć do makra kod
ActiveSheet.PivotTableWizard SourceType:=xlPivotTable, SourceData:= _
"Tabela przestawna1BAZA"
Przecież w nim nie jest podane ani ścieżka do arkusza, a poza tym ten PT wizard nie chce się z makra odpalać?
Jak w parametrach odświeżania tabeli zmienić jej źródło?
Jestem początkującym makrowiczem i help jest dla mnie niejasny - nie ma przykładów składni
Proszę o pomoc
Michał |
|
napisał: LAnd postów: 107
umieszczony: 1 lipca 2007 02:38
|
|
Przeczytaj załaczony wyciąg z Helpa i zalecany
Z przykładów VBA wynika ,że tylko jedna tablica jest podłączona do danych źródłowych
a dla pozostałych żródłem jest ta tabela
SourceType:=xlPivotTable, SourceData:= "Tabela przestawna1"
po wklejeniu procedur
przetestować ktore zdarzenie uruchamia się po zmianie-odświeżeniu danych źródłowyh
w procedurze TblPrzestOdswiez
odblokować odpowiednią linię z metodą odświeżania
zablokować linie isTest = ....
zablokować linie z MsgBox
w obu procedurach zdarzeń
zablokować Stop
odblokować procedurę TblPrzestOdswiez Me w wybranej na postawie testu procedurze zdarzenia
można nie usuwać lini kontrolnych mogą się kiedyś przydac
utworzyć moduł kodu wkleić poniższą procedure
Sub TblPrzestOdswiez(AktSh As Worksheet)
Dim WSh As Worksheet, PvT As PivotTable, MsgStr, isTest As Boolean
isTest = True 'jak będą decyzje ze uruchamiać to tę linię zablokować
For Each WSh In ThisWorkbook.Worksheets
If WSh.Name <> AktSh.Name Then 'zakładam ze ten arkusz zawiera tylko jedną tablicę
For Each PvT In WSh.PivotTables
MsgStr = MsgStr & vbCr & WSh.Name & vbTab & PvT.Name
If Not isTest Then
'PvT.PivotCache.Refresh ' po analize której lini użyc jedną odblokować
'PvT.RefreshTable
End If
Next
Else
Stop
End If
Next
If isTest Then MsgBox "Tabele przestawne" & MsgStr 'tylko kontrola potem zablokować
End Sub
wkleić do arkusza gdzie znajduje się tabela podłączona do danych źródłowych
Private Sub Worksheet_Calculate()
Stop 'aby sprawdzić które zdarzenie uruchamia się po zmianie źródła po wyborze zdarzenia zablokować lub usunąc
'procedurę niżej odblokować w tym zdarzeniu któe jest wyzwalane przy odświerzaniu lu zmianie danych źródłowych
'TblPrzestOdswiez Me
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Stop 'aby sprawdzić które zdarzenie uruchamia się po zmianie źródła po wyborze zdarzenia zablokować lub usunąc
'procedurę niżej odblokować w tym zdarzeniu któe jest wyzwalane przy odświerzaniu lu zmianie danych źródłowych
'TblPrzestOdswiez Me
End Sub
TO BARDZO UWAŻNIE PZRECZYTAĆ i zerknąc jeszcze do Helpa ( tu Excel 2000 )
Change Event
Occurs when cells on the worksheet are changed by the user or by an external link.
Syntax
Private Sub Worksheet_Change(ByVal Target As Range)
Target The changed range. Can be more than one cell.
Remarks
This event doesn't occur when cells change during a recalculation. Use the Calculate event to trap a sheet recalculation.
Deleting cells doesn't trigger this event.
Calculate Event
Chart object: Occurs after the chart plots new or changed data.
Worksheet object: Occurs after the worksheet is recalculated.
Syntax
Private Sub object_Calculate()
object Chart or Worksheet. For information about using events with the Chart object, see Using Events with the Chart Object.
RefreshTable Method
Refreshes the PivotTable report from the source data. Returns True if it’s successful.
Syntax
expression.RefreshTable
expression Required. An expression that returns a PivotTable object.
Refesh Metod - zobacz w helpie |
|
napisał: LAnd postów: 107
umieszczony: 28 czerwca 2007 14:34
|
|
to jest z Helpa Excela , jest coś o odświeżaniu może coś wykombinujesz ?
PivotCache Object
Represents the memory cache for a PivotTable report. The PivotCache object is a member of the PivotCaches collection.
Using the PivotCache Object
Use the PivotCache method to return a PivotCache object for a PivotTable report (each report has only one cache). The following example causes the first PivotTable report on the first worksheet to refresh itself whenever its file is opened.
Worksheets(1).PivotTables(1).PivotCache.RefreshOnFileOpen = True
Use PivotCaches(index), where index is the PivotTable cache number, to return a single PivotCache object from the PivotCaches collection for a workbook. The following example refreshes cache one.
ActiveWorkbook.PivotCaches(1).Refresh
RefreshPeriod Property Example
This example sets the refresh period for the PivotTable cache (PivotTable3) to 15 minutes.
Set objPC = Worksheets("Sheet1").PivotTables("PivotTable3").PivotCache
objPC.RefreshPeriod = 15
EnableRefresh property
True if the PivotTable cache or query table can be refreshed by the user. The default value is True. Read/write Boolean.
Remarks
The RefreshOnFileOpen property is ignored if the EnableRefresh property is set to False.
For OLAP data sources, setting this property to False disables updates. |
|
napisał: michalko postów: 25
umieszczony: 25 czerwca 2007 14:55
|
|
Witam
Mam problem. W pliku excel mam ok 30 tabel, wszystki opierają się na tych sanych danych zewnętrznych 9kwerenda access).
Jeżeli zmienię coś w danych źródłowych jednej tabeli np w arkuszu "baza" (np dodam jeszcze jedno pole z kwerendy), to tabele są od siebie i tak niezależne, czyli po tej operacji już nie mają tych samych danych.
Mogę za pomocą kreatora tabel przestawnych pokazywać na każdą tabelę i zmieniać jej dane źródłowe na inne tabela w arkuszu baza. Ale dla tylku tabel to za duża zabawa.
Próbowałem coś w VBA ale mi nie chodzi
'próbowałem coś z tym
ActiveSheet.PivotTableWizard SourceType:=xlPivotTable, SourceData:= _
"Tabela przestawna1"
i z tym, ale nie chodzi:
Sub TabelaPrzest()
Dim pt As PivotTable
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
ws.PivotTableWizard SourceType:=xlPivotTable, SourceData:= _
"Tabela przestawna1"
Next ws
End Sub
Proszę o makro, które wszystkich tabelom w pliku zmienia dane źródłowe na inną tabelę w raz pokazanym arkuszu
Michał |
|
 wstecz 1 dalej  wszystkich stron: 1
|
|