Seite 1 von 1

[gelöst] Datenbereich aktualisieren per Makro

Verfasst: Mi 6. Aug 2014, 19:53
von lessger
Hallo,

ich habe eine Calc-Tabelle mit einem Datenbankbereich (Name: "AlleSpesen") und einem Spezialfilter, der seine Ergebnisse in ein anderes Tabellenblatt schreibt. Wenn sich die Filterkrierien ändern, muß man ja "Datenbereich aktualisieren" anwählen. Ich möchte dies, aus einem anderen Tabellenblatt heraus, per Makro machen.

Dazu nutze ich folgenden Code

Code: Alles auswählen

	oDBRange = ThisComponent.DataBaseRanges()
	For i = 0 to oDBRange.Count()-1
		If oDBRange.ElementNames(i) = "AlleSpesen" Then
			oDBRange.getByIndex(i).refresh()
		End If
	Next i


Der Befehl oDBRange.getByIndex(i).refresh() wird zwar aufgerufen (d.h. "AlleSpesen" wird gefunden), aber es passiert nichts. Auch keine Fehlermeldung.

Hat jemand eine Idee, was ich falsch mache?

Grüße
Gerhard

Re: Datenbereich aktualisieren per Makro

Verfasst: Mi 6. Aug 2014, 21:41
von karolus
Hallo

Zunächst fällt mir auf das du mit .getByName( "AlleSpesen" ) arbeiten könntest.

Ansonsten scheint es mir das per →Daten→Bereich aktualisieren die komplette Filterroutine abgearbeitet wird, das müsstest du dann im Code auch alles nochmal explizit vor dem .refresh tun ??

Karolus

Re: Datenbereich aktualisieren per Makro

Verfasst: Mi 6. Aug 2014, 22:26
von lessger
Danke, Karolus.

GetByIndex war ein Workaround-Versuch, nachdem GetByName nicht geklappt hat. Aber daran lag's ja nicht.

Da werde ich mich wohl mit der Filterlogik befassen müssen. Aber erst morgen, das sah mir eben recht kompliziert aus.

Grüße
Gerhard

Re: Datenbereich aktualisieren per Makro

Verfasst: Do 7. Aug 2014, 11:35
von F3K Total
Hi,
lessger hat geschrieben: Da werde ich mich wohl mit der Filterlogik befassen müssen.
Kannst Du machen, wird sicherlich kompliziert. Der Befehl

Code: Alles auswählen

.refresh
in deinem Makro, aktualisiert aus einer Datenbank importierte Bereiche, setzt aber den Filter nicht neu.
Ich habe einen Workaraound, benutze den aufgezeichneten Befehl

Code: Alles auswählen

".uno:DataAreaRefresh"
, der macht alles zusammen, Bereich aktualisieren und Filter neu setzen. Damit der .uno Befehl greift, muss das Blatt, auf dem sich der Bereich "AlleSpesen" befindet, aktiv sein, darum springen wir auf das Blatt und danach zurück auf das Blatt, von dem aus du das Makro startest, die Aktion sieht man bei mir nicht.
Hier der angepasste Code:

Code: Alles auswählen

sub S_refresh_DB_Ranges_recorded
    oController = ThisComponent.CurrentController
    oCurrentsheet = oController.activesheet
    oDBRange = ThisComponent.DataBaseRanges.getByName("AlleSpesen")
    oDBRangeSheet = Thiscomponent.sheets(oDBRange.Dataarea.Sheet)
    oController.activesheet = oDBRangeSheet
    document   = ThisComponent.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    dispatcher.executeDispatch(document, ".uno:DataAreaRefresh", "", 0, Array())
    oController.activesheet = oCurrentsheet
end sub
Ein Beispiel anbei Refresh_Spezialfilter.ods
HTH R
EDIT: Es ist für den Spezialfilter nicht notwendig einen Datenbereich (Databaserange) zu verwenden, der üblicherweise, wie o.a. zum Import von Datenbankbereichen verwendet wird.
Es ist ausreichend, innerhalb der Calc-Datei einem Bereich einen Namen (Einfügen/Namen/Festlegen ...) zu geben und den Spezialfilter damit zu definieren. Dann muss das Makro etwas verändert werden:

Code: Alles auswählen

sub S_refresh_Named_Ranges_recorded
    oController = ThisComponent.CurrentController
    oCurrentsheet = oController.activesheet
    oNamedRange = ThisComponent.NamedRanges.getByName("AlleSpesen")
    oNamedRangeSheet = Thiscomponent.sheets(oNamedRange.ReferredCells.RangeAddress.Sheet)
    oController.activesheet = oNamedRangeSheet
    document   = ThisComponent.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    dispatcher.executeDispatch(document, ".uno:DataAreaRefresh", "", 0, Array())
    oController.activesheet = oCurrentsheet
end sub
Siehe Datei Refresh_Spezialfilter_named_Ranges.ods

Re: Datenbereich aktualisieren per Makro

Verfasst: Do 7. Aug 2014, 13:34
von lessger
Herzlichen Dank,

das hat genau so funktioniert und macht genau das was ich brauche.

Ist auch besser als die von mir angedachte Lösung, denn so werden die im Sheet hinterlegten Filterdefinitionen genutzt. Ich hatte in der uno-Dokumentation bislang nur gefunden, wie man einen eigenen Filter definiert und dann ausführt. Dann hätte man aber bei Änderungen des Filters immer auch das Makro anpassen müssen.

Vielleicht probier ich bei Gelegenheit trotzdem mal die Filterdefinition aus, aber das ist dann reine Neugier.

Vielen Dank nochmal,
Gerhard