Bereichsnamen über Makro ansprechen

Hallo Listlinge,

in einem Calc-Dokument habe ich 10-15 Tabellen. In jeder Tabelle sind 6 Bereiche definiert, welche nur in der jeweiligen Tabelle gültig sind. Die Bereiche befinden sich in jeder Tabelle an der gleichen Stelle und haben die gleichen Namen.

Bereichsnamen:
_ID
_Lagerplatz
_Artikel
_Index
_Datenbereich
_SV_Datenbereich

Nun habe ich mir ein Makro aufzeichnen lassen, welches mir den Bereichsnamen anzeigt, da dies zur Erläuterung der jeweiligen Darstellung sehr hilfreich ist.

sub _Datenbereich
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 ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "_Datenbereich (Tabelle 1)"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

end Sub

Diese Subroutine habe ich kopiert und mit den entsprechenden Änderungen der Tabellennamen für alle Bereiche zum Laufen gebracht.

Der Quellcode unterscheidet sich ja lediglich durch den Funktionsnamen und den Namen der Tabelle. Der Code ist somit sehr redundant. Wenn ich das Ganze jetzt in dieser Form auf 10-15 Tabellen erweitere, muss ich neben den Bereichsnamen auch eine entsprechende Anzahl an Subroutinen definieren.

Gibt es denn die Möglichkeit, der jeweiligen Subroutine den Namen der Tabelle zu übergeben?
Oder könnte der in der Subroutine angegebene Bereichsname grundsätzlich mit der aktuellen Tabelle verbunden werden?
Vielleicht gibt es ja noch eine viel einfachere Lösung!?

Liebe Grüße

josinoro

VERGLEICH Makro.ods (25,1 KB)

Du kannst benannte Bereiche mit der Namensliste auswählen (links von der Formelleiste).
Du kannst benannte Bereiche mit dem Navigator auswählen (Taste F5).
Du kannst beide Aktionen mit dem Makrorecorder aufzeichnen.

Es ist grundsätzlich immer ein Fehler, gleich strukturierte Datensätze in verschiedene Tabellen aufzuspalten.
t99018.ods (33.8 KB)

Das ist grundsätzlich richtig, aber mir geht es hier nicht primär um die Verarbeitung der Daten. Wenn es mehr Tabellen werden, sollte man natürlich über eine Referenzierung, zum Beispiel auf die erste Datensammlung, nachdenken.

Ich möchte hier die unterschiedlichen Prinzipien und das Zusammenspiel von Funktionen darstellen. Zum Beispiel die Funktionen SVERWEIS(), INDEX() und VERGLEICH(). Da ist es dann hilfreich, wenn man auf einfache Art und Weise die richtigen benannten Bereiche optisch hervorheben kann.

Dann nimm doch einfach Hyperlinks oder Hyperlink-Buttons statt Makros.

Danke. Das schaue ich mir am Wochenende mal an.

Sub example()
	select_range("Tabelle 1", "_Artikel (Tabelle 1)")
End Sub


Sub select_range(sheet_name, range_name)
	doc = ThisComponent
	sheet = doc.Sheets(sheet_name)
	range = sheet.getCellRangeByName(range_name)
	ThisComponent.CurrentController.select(range)
End Sub

Vielen Dank für deine Antwort,

der redundante Teil wird dadurch erheblich reduziert. :ok_hand:

Da ich 6 Bereichsnamen und 10-15 Tabellen habe, ist es natürlich einfacher in den übersichtlichen Subroutinen von dir Änderungen vorzunehmen. Dennoch verbleiben 60-90 Subroutinen, die zu definieren sind.

Gibt es denn die Möglichkeit, die Eigenschaften der aufrufenden Tabelle zu ermitteln, sodass bei jedem Schalter der jeweiligen Tabelle die gleichlautende Subroutine, angesprochen und dort der Name der aufrufenden Tabelle ermittelt wird?

sub _Datenbereich
        Tabellenname = ermittele Tabellenname
	Bereichsauswahl("Tabellenname", "_Datenbereich (Tabellenname)")
end Sub

Normalerweise würde man Dir jetzt empfehlen mit xray oder MRI nachzusehen, aber ich nehme an, dass in diesem Fall das “aktive” Blatt ausreicht:

odoc.currentcontroller.activesheet.name

aus:
https://www.dannenhoefer.de/faqstarbasic/WiekannmandasaktuelleSheetoderalleermitt.html#Zweig203

Vielen Dank erstmal für eure Hilfe,

in der Zwischenzeit habe ich mich auch etwas mehr eingelesen, scheitere aber bisher an dem grundlegenden Objektmodell.

Nun bin ich so weit, dass ich den Namen der Tabelle und den Namen des Bereiches in der Subroutine habe. Mir gelingt es aber anhand der Beispiele nicht, den Bereich letztendlich in der aufrufenden Tabelle zu markieren.

Liebe Grüße

josinoro

VERGLEICH Makro.ods (25,7 KB)

Moin,
ich verstehe das Problem nicht, wenn ich in deiner Datei auf eine der Schaltflächen klicke, wird auch der entsprechende Bereich markiert:
Ranges

Gruß R

Ja, aber immer nur von Tabelle 1.

Moin, versuche es mal so:

Sub Bereichsauswahl(range_name)
    doc = ThisComponent
	sheet = doc.currentcontroller.activesheet
    MsgBox (sheet.name & "  " & range_name)
	range = sheet.getCellRangeByName(range_name)
	doc.CurrentController.select(range)
End Sub

Vielen Dank F3KTotal,

so funktioniert es genau so, wie gewünscht.
Um das allerdings zu verstehen, muss ich mir noch ein paar Beispiele anschauen.

So wird das aber nix mit dem Verstehen.

Moin, den Fehler habe ich eben erst gesehen, du hattest:

sheet = doc.Sheets.(sheet_name)

müsste richtig heißen:

sheet = doc.Sheets.getbyName(sheet_name)

mit meinem Code ignoriert man den Namen des aktiven Tabellenblattes.

Villeroy: Dann nimm doch einfach Hyperlinks oder Hyperlink-Buttons statt Makros.

ich habe dir mal ein Dokument ohne Makro gebaut, das mit den Hyperlinkbuttons arbeitet.
Vergleich_Hyperlink_Buttons.ods (23.7 KB)

1 Like

Hallo F3KTotal,

vielen Dank für die Erläuterung. Durch dein Beispiel weiß ich jetzt auch, was Villeroy meinte.

Hi Villeroy,

nimm mir doch nicht meine Hoffnung. :innocent:

Programmieren ist kein auswendig Lernen von Zaubersprüchen, sondern die Konstruktion von logischen Bausteinen. Man kann sich das nicht durch reine Lektüre (oder Copy/Paste) von Beispielen aneignen, weil alles, was man da lesen würde nur Zaubersprüche sind, ohne Einblick in den konstruktiven Prozess, der zu jegliichem Resultat führt. Dann ärgern sich Leute darüber, dass man ein bestimmtes Makro im Netz nicht finden kann, statt selber das Ding zu schreiben.

1 Like