🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[gelöst] Datenbereich aktualisieren per Makro

Alles zur Programmierung im LibreOffice.
Antworten
lessger
Beiträge: 249
Registriert: Fr 4. Mai 2012, 13:33

[gelöst] Datenbereich aktualisieren per Makro

Beitrag von lessger » Mi 6. Aug 2014, 19:53

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
Zuletzt geändert von lessger am Do 7. Aug 2014, 13:35, insgesamt 1-mal geändert.
LibreOffice 5.4.6.2 / Windows 10 64Bit / WIndows 10 32Bit

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2539
Registriert: Fr 10. Dez 2010, 10:01

Re: Datenbereich aktualisieren per Makro

Beitrag von karolus » Mi 6. Aug 2014, 21:41

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
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

lessger
Beiträge: 249
Registriert: Fr 4. Mai 2012, 13:33

Re: Datenbereich aktualisieren per Makro

Beitrag von lessger » Mi 6. Aug 2014, 22:26

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
LibreOffice 5.4.6.2 / Windows 10 64Bit / WIndows 10 32Bit

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: Datenbereich aktualisieren per Makro

Beitrag von F3K Total » Do 7. Aug 2014, 11:35

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
Dateianhänge
Refresh_Spezialfilter_named_Ranges.ods
(41.21 KiB) 236-mal heruntergeladen
Refresh_Spezialfilter.ods
(46.13 KiB) 235-mal heruntergeladen
Windows 11: AOO, LO Linux Mint: AOO, LO

lessger
Beiträge: 249
Registriert: Fr 4. Mai 2012, 13:33

Re: Datenbereich aktualisieren per Makro

Beitrag von lessger » Do 7. Aug 2014, 13:34

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
LibreOffice 5.4.6.2 / Windows 10 64Bit / WIndows 10 32Bit


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten