vbamania.pl
login:
hasło:
 
  *Rejestracja *Zapomniane hasło
 Dziś jest piątek, 17 maja 2024 roku.
Ustaw jako stronę startową Ulubione Napisz
PowrótPowrót do serwisu  RegulaminRegulamin rssRSS

  tytuł wątku:
Wątki dyskusji

źródło tabel przstawnych w excelu


otwartyotwarty rozpoczął: michalko postów: 11



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:
5 lipca 2007
05:27

  
dużo linków o tabelach przestawnych w temacie
http://www.vbamania.estrefa.pl/?go=forum&go2=zobacz&id_watek=1082&return=watek
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&#8217;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


Sortuj posty: z