Mehrere Spalten markieren [Calc]

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Benutzeravatar
womolbo
*
Beiträge: 11
Registriert: So, 12.04.2020 12:43

Mehrere Spalten markieren [Calc]

Beitrag von womolbo »

Hallo,
wie kann ich in Calc mehrere [in meinem Fall zusammenhänge] Spalten markieren?

Mit ...

Code: Alles auswählen

oColumns = oSheet.getcolumns().getByIndex(iSpalte)
ThisComponent.CurrentController.Select(oColumns)
... geht leider nur eine.
Ein zweiter Parameter ist laut Xray nicht vorgesehen und wird auch tatsächlich ignoriert.

Danke und Gruß
Zuletzt geändert von womolbo am Sa, 23.05.2020 11:43, insgesamt 1-mal geändert.
LibreOffice Portable 6.3.5.2 (x86), Windows 7

Benutzeravatar
Faol
****
Beiträge: 180
Registriert: Di, 26.01.2016 21:18

Re: Mehrere Spalten markieren [Calc]

Beitrag von Faol »

Hallo

Selektionen verwende ich nur äußerst selten, meist kommt man ohne Selektion aus.

Da ich Deinen Code nicht kenne schlage ich wie folgt vor:

Code: Alles auswählen

REM  *****  BASIC  *****

Sub Main
oSheet = thisComponent.sheets(0) 
' xray osheet
' Auswahl per Bereichsname
oRange = oSheet.getCellRangeByName("C1:F10")

REM ----------------------------------------------------------------------------------------------------
REM Auswahl per Bereichsindex
' getCellRangeByPosition ( [in] long nLeft, [in] long nTop, [in] long nRight, [in] long nBottom )
' Zellzählung beginnt bei 0
' nLeft		→	Spalte C	= 2
' nTop		→	Zeile 1		= 0
' nRight	→	Spalte F	= 5
' nBottom	→	Zeile 31	= 30
' 								∟→
' oRange = oSheet.getCellRangeByPosition(nLeft,nTop,nRight,nBottom)
'										  ↨ ↨ ↨ ↨
' oRange = oSheet.getCellRangeByPosition(2,0,5,30)

REM geht auch mittels Deiner Variablen - iSpalte -
' oRange = oSheet.getCellRangeByPosition(iSpalte1,0,iSpalte2,30)

REM ----------------------------------------------------------------------------------------------------

ThisComponent.CurrentController.Select(oRange)
End Sub
Ganze Spalten mit ca. 1,048 MIllionen Zeilen zu markieren kann zu erheblichen Performance-Einbußen
führen, zumal sich dies bei jeder weiteren markierten Spalte addiert.

Deshalb schlage ich in meinem Beispiel "getCellRangeByName" und "getCellRangeByPosition" vor.
Mit beiden Methoden werden nur kleine Bereiche markiert.

Kannst Du auch in Xray nachlesen:
' xray osheet
→ Methoden → getCellRangeByName
ODER
→ Methoden → getCellRangeByPosition
Gruß
Faol

Tipp des Tages:
Heute schon an eine Sicherungskopie gedacht?


⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒
Win.10 Prof. (x64) • AOO 4.1.6 • LibO 6.4.4.2 (x64)
⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐

Stephan
********
Beiträge: 11542
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Mehrere Spalten markieren [Calc]

Beitrag von Stephan »

In dem speziellen Falle von Spalten würde ich VBA-Code verwenden, z.B.:

Code: Alles auswählen

Option VBASupport 1

sub Spalten_selektieren()
	Sheets("Tabelle2").Range("A:F,J:L").Select
end sub
weil ich mittels Starbasic auch nur den Weg benennen könnte wie mein Vorredner, ggf. auch für komplette Spalten, nur um die Notwendigkeit der Schleife(n) komme ich auch nicht rum:

Code: Alles auswählen

Sub Spalten_selektieren2()
	bereiche = ThisComponent.CreateInstance("com.sun.star.sheet.SheetCellRanges")
	For i = 0 To 6
		bereiche.addRangeAddress(ThisComponent.Sheets(1).columns(i).RangeAddress, False)
	Next i
	For i = 9 To 11
		bereiche.addRangeAddress(ThisComponent.Sheets(1).columns(i).RangeAddress, False)
	Next i
	ThisComponent.CurrentController.Select(bereiche)
End Sub 

Gruß
Stephan

Benutzeravatar
womolbo
*
Beiträge: 11
Registriert: So, 12.04.2020 12:43

Re: Mehrere Spalten markieren [Calc]

Beitrag von womolbo »

@Faol:
Danke für diese schnelle, enorm strukturierte und detaillierte Antwort. Ganz hervorragend aufbereitet. Alle Achtung.
Allerdings wollte ich Euch nicht so viel Arbeit machen. Ranges selektieren kann ich schon ganz gut, aber die zukünfitgen Generationen von Lesern dieses Threads haben ja dann auch was davon.
Selektionen verwende ich nur äußerst selten, meist kommt man ohne Selektion aus.
Richtig und sinnvoll. In diesem Fall geht es allerdings darum dem Anwender eine optische Orientierung innerhalb der Tabelle zu geben und da erscheint mir zwar das Markieren des betroffenen Zellbereichs am sinnvollsten. Im Falle dass aber der Bereich vom Anwender nicht ausreichend definiert wurde [Anzahl Zeilen] möchte ich nur die betroffenen 'Spalten' markieren. Das könnte ich zwar auch, wie vorgeschlagen, auf ein Range beschränken, da aber die Gesamtzahl der betroffenen Zeilen nicht ewig fix sein muß dachte ich einfach an die ganzen betroffenen Spalten, was auch mit ausrücken soll, dass der Anwender ungenau gearbeitet hat.
Ganze Spalten mit ca. 1,048 MIllionen Zeilen zu markieren kann zu erheblichen Performance-Einbußen
führen, zumal sich dies bei jeder weiteren markierten Spalte addiert.
Das entspricht nur teilweise meinen Erfahrungen. Beim interaktiven Markieren von Spalten bemerke ich keine nennenswerten Performanceeinbußen, beim Markieren aller Zellen in einer/mehrerer Spalten kommt es meiner Erfahrung nach [zumindest teilweise] zu extremen Timeouts/Hängern.
Mir scheint das Markieren einzelner Zellen ist verabeitungsintensiver implementiert als das Markieren ganzer Spalten. Ich rede natürlich nicht von Zugriffen auf die betroffenen Zellen des selektierten Ranges, sondern nur von der reinen Markierung zwecks Hervorhebung.
Aber ich mag da auch falsch liegen, da noch nicht allzu erfahren mit LibreOffice.

Gruß. Womolbo.
LibreOffice Portable 6.3.5.2 (x86), Windows 7

Benutzeravatar
womolbo
*
Beiträge: 11
Registriert: So, 12.04.2020 12:43

Re: Mehrere Spalten markieren [Calc]

Beitrag von womolbo »

@Stephan:
Auch dir vielen Dank für die kompetente und auch inspiriende Hilfe.
Wie oben schon beschrieben kann ich mit 'normalen' Ranges schon ganz umgehen aber addRangeAddress() kannte ich bisher noch nicht.
Das ist womöglich ganz interessant für mich. Das schaue ich mir nachher mal an.
Und die Variante mit VBA-Code zu arbeiten kannte ich zwar im Prinzip, hatte sie aber nicht recht im Bewußtsein. Dabei kann das immer mal hilfreich sein. Manchmal leidet man an Fantasielosigkeit.

Meine eigentliche Aufgabenstellung konnte ich schon vor der Fragestellung befriedigend lösen und nun durch euere Hilfe erst recht.
Die Frage war aber eher grundsätzlicher Natur und ist für mich immer noch offen. Aber dazu siehe nächstes Posting.

Gruß. Womolbo.
Zuletzt geändert von womolbo am Sa, 23.05.2020 12:39, insgesamt 1-mal geändert.
LibreOffice Portable 6.3.5.2 (x86), Windows 7

Benutzeravatar
womolbo
*
Beiträge: 11
Registriert: So, 12.04.2020 12:43

Re: Mehrere Spalten markieren [Calc]

Beitrag von womolbo »

Nochamls Danke für die tollen Antworten, aber für meine Problemstellung ist es letzlich relativ unerhebelich ob ich die ganze Spalte[n] oder ein Range darunter markiere. Ich will weniger ein konkretes Problem lösen, als viel mehr besser verstehen.
Es ging mir mehr darum die Objekte von LibreOffice kennenzulernen.
Wenn es schon ein Objekt für Spalten gibt und auch eine Methode um Spalten [man beachte die Mehrzahl] zu selektieren, dann verwirrt es mich dass nur eine Spalte möglich sein soll?!

Und diese Frage würde ich tatsächlich auch gerne noch klären und zwar unabhängig der Sinnhaftigkeit einer solchen Vorgehensweise.

Ist meine Annahme falsch, daß es eine Methode gibt um mehr oder weniger direkt Spalten zu selektieren/markieren, oder stehe ich auf der Leitung und sehe nicht wie?
LibreOffice Portable 6.3.5.2 (x86), Windows 7

Benutzeravatar
Faol
****
Beiträge: 180
Registriert: Di, 26.01.2016 21:18

Re: Mehrere Spalten markieren [Calc]

Beitrag von Faol »

Hallo Womolbo,
Womolbo hat geschrieben: Das entspricht nur teilweise meinen Erfahrungen. Beim interaktiven Markieren von Spalten bemerke ich keine nennenswerten Performanceeinbußen, beim Markieren aller Zellen in einer/mehrerer Spalten kommt es meiner Erfahrung nach [zumindest teilweise] zu extremen Timeouts/Hängern.

Zum Thema Performance:
Nun ja, ob man nun die gesamte Spalte markiert oder einen Bereich, welcher wahrscheinlich
immer groß genug sein wird, kommt letztendlich aus das Gleiche hinaus.
Es sei denn, die markierten Bereiche sind u.U. mit z.B. vielen Matrixformeln befüllt und der Rechner
auf dem diese Tabelle ausgeführt wird ist etwas schwachbrüstig (zu wenig Arbeitsspeicher, etc) ist.

Ich weiß nicht wie die interne Verarbeitung des Basic-Interpreters arbeitet.

Aus meiner Sicht, ist aber nur eine Annahme, gilt folgendes:
Jede Zelle ist ein Objekt mit Eigenschaften, Methoden, Interfaces, etc. ist.

Eine Zelle besteht aus 126 Eigenschaften, mal abgesehen von den Structs.
Dies bedeutet bei 100 ausgewählten Zellen 126*100= 12.600 Eigenschaften
Bei einer komplett ausgewählten Spalte sind dies:
126 * 1.048.576 (Zeilen) =132.120.576 Eigenschaften
ca. 130 Millionen Eigenschaften + Methoden + Interfaces, usw. + diverser Matrixformeln oder anderes.
Das muss ein kleiner Rechner erst einmal verkraften!

In diesem Fall ist weniger mehr.
Sprich: Weniger Markierungen = weniger Rechenleistung wird benötigt.
Womolbo hat geschrieben: Im Falle dass aber der Bereich vom Anwender nicht ausreichend definiert wurde [Anzahl Zeilen] möchte ich nur die betroffenen 'Spalten' markieren.

Letztendlich reicht es statt 1 Millionen Zeilen auszuwählen, sich auf z.B. 80.000 Zeilen zu beschränken.
Dies dürften in den allermeisten Fällen mehr als genug sein.
Womolbo hat geschrieben: dann verwirrt es mich dass nur eine Spalte möglich sein soll?!

Dies ist eine reine Definitionsache!
Löse Dich von dem Gedanken Zeile und Spalte und denke in Ranges (Zellbereiche).
Ob nun nur eine Zelle ein Range-Objekt ist oder es ist eine ganze Spalte/ Zeile.
Beide ist per API erfassbar:

Code: Alles auswählen

.getCellRangeByName
Hierbei kann man zwar nicht die VBA-typische Syntax (C:F) verwenden, da der Interpreter dieses nicht kennt, aber man kann den gewünschten Zellbereich definieren:

Code: Alles auswählen

.getCellRangeByName(C1:F1048576)
Dies entspricht letztendlich (C:F), oder?

Gleiches gilt für die numerische Syntax, wobei nBottom = 1048575 ist.
1048575 und NICHT 1048576. weil die Zählung der Zeilen bei 0 beginnt.

Code: Alles auswählen

‘ oSheet.getCellRangeByPosition ( [in] long nLeft, [in] long nTop, [in] long nRight, [in] long nBottom )
oSheet.getCellRangeByPosition(2,0,5,1048575)
Also ist alles eine reine Definitionsache.

Code: Alles auswählen

Spalten(C:F)
oder

Code: Alles auswählen

Range(C1:F1048576)
ist gleich!
Gruß
Faol

Tipp des Tages:
Heute schon an eine Sicherungskopie gedacht?


⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒
Win.10 Prof. (x64) • AOO 4.1.6 • LibO 6.4.4.2 (x64)
⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐

Antworten