Kontingenční tabulka (DATA - Průvodce daty) je šikovný nástroj,který umí zpracovávat velké množství dat ze základní tabulky "databáze".Z jedné tzv.databáze může data zpracovávat více kont.tabulek,ze kterých třeba čerpají informace zase jiné tabulky apod.V celém dokumentu jich můžeme mít calou řadu.Zde,ale narazíme na zásadní problém:kontingenční tabulky budeme muset jednu po druhé aktualizovat (na tabulce pravá myš/obnovit),aby došlo ke zpracování nových dat v databázi.Jelikož často dokumenty s mnoha kot.tabulkami používám,osvědčilo se mi makro,které aktualizuje kont.tabulky najednou v celém dokumentu.Toto makro pak přiřadím k tlačítku (ovládací prvek/události) na hlavním listu.
Po té už měníme jen data v databázích a makrem aktualizujeme všechny na ně napojené kont.tabulky.
MAKRO:aktualizace kontingenční tabulky (průvodce daty)
Sub refresh_DBRanges_And_Pilots
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:CalculateHard", "", 0, Array())
REM disable auto-calculation:
bAutoCalc = thisComponent.IsAutomaticCalculationEnabled
thisComponent.enableAutomaticCalculation(False)
oDBRangesEnum = thisComponent.DatabaseRanges.createEnumeration()
refresh_Enumeration(oDBRangesEnum)
oSheetsEnum = thisComponent.Sheets.createEnumeration()
refresh_All_DataPilots(oSheetsEnum)
REM reset auto-calculation to previous state:
thisComponent.enableAutomaticCalculation(bAutoCalc)
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:CalculateHard", "", 0, Array())
End Sub
Sub refresh_All_DataPilots(oSheetsEnum)
REM Bug: Disregards pilots created from datasource
while oSheetsEnum.hasMoreElements()
oSheet = oSheetsEnum.nextElement()
oDPEnum = oSheet.DataPilotTables.createEnumeration()
refresh_Enumeration(oDPEnum)
wend
End Sub
Sub refresh_Enumeration(oEnum)
while oEnum.hasMoreElements()
oNext = oEnum.nextElement()
oNext.refresh()
wend
End Sub