RE: [Basic] getCellRangeByName & Teilbereich ausschließen

2020-06-27 Diskussionsfäden Jörg Schmidt
Hallo, 

> -Original Message-
> From: Wolfgang Jäth [mailto:jawo.ml.hams...@arcor.de] 
> Sent: Saturday, June 27, 2020 1:12 PM
> To: users-de@openoffice.apache.org
> Subject: Re: [Basic] getCellRangeByName & Teilbereich ausschließen

> > Ich kann Dir hingegen nicht sagen, wie Du von "M2:X13" den 
> Bereich "M2:O4" quasi abziehst, weil es zwar die Methode 
> .removeRangeAddress gibt, aber es bei mir zu einem Fehler 
> führt wenn ich versuche von einem CellRange-Objekt ein (quasi 
> beinhaltetes) CellRange-Objekt 'abzuziehen' - augenscheinlich 
> wird ein passendes CellRange*s*-Objekt erwartet.
> 
> Über die Funktion bin ich auch gestolpert, aber wenn ich die
> Beschreibung dazu richtig verstanden habe, entfernt das die Zellen
> direkt aus dem Tabellenblatt, so wie "Bearbeiten => Zeilen löschen =>
> (*) Zellen nach oben verschieben".

Nein, denn eine RangeAdresse ist kein Zellobjekt.

Ich hatte es ohnehin extra ausprobiert und schrieb deshalb "passendes(!) 
CellRange*s*-Objekt", denn z.B. liefern folgende Makros im Ergebnis die gleiche 
Selektion:

Sub Main1
Dim x(0)
bereiche = ThisComponent.CreateInstance("com.sun.star.sheet.SheetCellRanges")
blatt = ThisComponent.CurrentController.ActiveSheet
x(0) = "P2:X13"
bereiche.addRangeAddress(blatt.getCellRangeByName(x(0)).getRangeAddress(), 
False)
ThisComponent.CurrentController.Select(bereiche)
End Sub

Sub Main2
Dim x(1)
bereiche = ThisComponent.CreateInstance("com.sun.star.sheet.SheetCellRanges")
blatt = ThisComponent.CurrentController.ActiveSheet
x(0) = "P2:X13"
x(1) = "M5:O13"
For i = LBOUND(x()) To UBOUND(x())

bereiche.addRangeAddress(blatt.getCellRangeByName(x(i)).getRangeAddress(), 
False)
Next i
bereiche.removeRangeAddress(blatt.getCellRangeByName(x(1)).getRangeAddress(), 
False)
ThisComponent.CurrentController.Select(bereiche)
End Sub




Gruß
Jörg



-
To unsubscribe, e-mail: users-de-unsubscr...@openoffice.apache.org
For additional commands, e-mail: users-de-h...@openoffice.apache.org



Re: [Basic] getCellRangeByName & Teilbereich ausschließen

2020-06-27 Diskussionsfäden Wolfgang Jäth
Am 27.06.2020 um 10:20 schrieb Jörg Schmidt:
> 
> z.B. ginge:
> 
> Dim x(1)
> bereiche = ThisComponent.CreateInstance("com.sun.star.sheet.SheetCellRanges")
> blatt = ThisComponent.CurrentController.ActiveSheet
> x(0) = "P2:X13"
> x(1) = "M5:O13"
> For i = LBOUND(x()) To UBOUND(x())
>   
> bereiche.addRangeAddress(blatt.getCellRangeByName(x(i)).getRangeAddress(), 
> False)
> Next i
> bereiche.clearContents(com.sun.star.sheet.CellFlags.VALUE + 
> com.sun.star.sheet.CellFlags.STRING)

Ja, das ginge vermutlich. Die Frage hat sich aber inzwischen etwas
überholt (wollte ich gerade schreiben, da hab ich diene Antwort
gesehen). Von dem "clearContents" bin ich wieder ab gekommen.
Stattdessen Greife ich jetzt folgendermaßen auf den Bereich zu:

| aCellrange = oSheet.getCellRangeByName ("M2:X13")
| aLeft = aCellrange.getCellRangeByPosition (3, 0, 11,  2)
| aTop = aCellrange.getCellRangeByPosition  (0, 3,  2, 11)
| aData = aCellrange.getCellRangeByPosition (3, 3, 11, 11)

Die einzelnen Unterarrays (aLeft usw.) lösch ich halt jeweils separat
über FOR-Schleifen. Diese "Technik" brauch ich später sowieso wieder,
beim Befüllen. Aber auf diese Weise kann ich direkt in diesen
Unterarrays arbeiten, ohne lästiges hin- und herkopieren der Daten, v.
a. ohne die jeweiligen Indizes umständlich umzurechnen zu müssen, usw.
Das vereinfacht mir die Arbeit ungemein, und ich spar mir auach noch das
urnsprünglich geplante Arbeits-Array.

Trotzdem danke.

> Ich kann Dir hingegen nicht sagen, wie Du von "M2:X13" den Bereich "M2:O4" 
> quasi abziehst, weil es zwar die Methode .removeRangeAddress gibt, aber es 
> bei mir zu einem Fehler führt wenn ich versuche von einem CellRange-Objekt 
> ein (quasi beinhaltetes) CellRange-Objekt 'abzuziehen' - augenscheinlich wird 
> ein passendes CellRange*s*-Objekt erwartet.

Über die Funktion bin ich auch gestolpert, aber wenn ich die
Beschreibung dazu richtig verstanden habe, entfernt das die Zellen
direkt aus dem Tabellenblatt, so wie "Bearbeiten => Zeilen löschen =>
(*) Zellen nach oben verschieben".

>> [1] ist etwas tricky, denn zuerst darf man nur STRG drücken, dann die
>> Maustaste, dann SHIFT, und dann kan man mit der Maus 
>> markieren (nur wers
>> nachvollziehen möchte)
> 
> Du kannst den gewünschten Selektionsmodus auch in der Statusleiste per 
> Mausklick umschalten (an der Stelle wo per Default "STD" steht)

Möglich; mir reicht es aber, wenn ich *eine* Methode kenne, die einfach
ist (Stichwort motorisches Gedächtnis) und funktioniert. Das reicht mir. :-)

Wenn ich da zu viel rumklicke, und mir so die Konfig "unkontrolliert"
(weil im Eifer des Gefechtes nicht darauf achtend) verändere, riskier
ich nur, dass nachher wieder mal gar nix mehr geht. Ich bin da ein etwas
gebranntes Kind (hab seinerzeit lang genug mit Suchen/Ersetzen und RegEx
oder nicht RegEx rum gemacht; seitdem hab ich mir angewöhnt, peinlich
darauf zu achten, vor Verlassen des Fensters grundsätzlich immer RegEx
wieder zu deaktivieren :-/).

Wolfgang
-- 
Donald Trump ist ein großer Visionär, der seiner Zeit weit voraus ist:
Er verbreitet schon jetzt den Slogan "make America great again", obwohl
dieser erst in der Ära /nach/ ihm seine volle Bedeutung entfalten wird.


-
To unsubscribe, e-mail: users-de-unsubscr...@openoffice.apache.org
For additional commands, e-mail: users-de-h...@openoffice.apache.org



RE: [Basic] getCellRangeByName & Teilbereich ausschließen

2020-06-27 Diskussionsfäden Jörg Schmidt
Hallo,

> -Original Message-
> From: Wolfgang Jäth [mailto:jawo.ml.hams...@arcor.de] 
> Sent: Friday, June 26, 2020 6:56 PM
> To: users-de@openoffice.apache.org
> Subject: [Basic] getCellRangeByName & Teilbereich ausschließen
> 
> Hi,
> 
> ich hab folgendes Problemche: In einem Makro möchte ich einen 
> bestimmten
> Zellbereich löschen, davon jedoch ein paar Zellen innerhalb dieses
> Bereiches ausnehmen. Bislang hab ich folgendes:
> 
> | Dim oSheet, oCellRange As Object
> | oSheet = thisComponent.getCurrentController.getActiveSheet
> | oCellRange = oSheet.getCellRangeByName ("M2:X13")
> | oCell.clearContents (com.sun.star.sheet.CellFlags.VALUE +
> com.sun.star.sheet.CellFlags.STRING)
> 
> Das klappt soweit auch, nur dass ich halt gerne den Inhalt 
> des Bereichs
> M2:O4 (statische Informationen) stehen lassen möchte.
> 
> Bei der direkten Bedienung kann ich ja auch den Bereich M2:X13 mit der
> Maus mmarkieren, und dann mit gedrückter Tastenkombination STRG-SHIFT
> [1] den Bereich M2:O4 wieder aus der Markierung heraus 
> nehmen. Genau so
> was stelle ich mir vor, nur im Makro. Geht das, bzw. kann mir jemand
> sagen, wie?

z.B. ginge:

Dim x(1)
bereiche = ThisComponent.CreateInstance("com.sun.star.sheet.SheetCellRanges")
blatt = ThisComponent.CurrentController.ActiveSheet
x(0) = "P2:X13"
x(1) = "M5:O13"
For i = LBOUND(x()) To UBOUND(x())

bereiche.addRangeAddress(blatt.getCellRangeByName(x(i)).getRangeAddress(), 
False)
Next i
bereiche.clearContents(com.sun.star.sheet.CellFlags.VALUE + 
com.sun.star.sheet.CellFlags.STRING)

Ich kann Dir hingegen nicht sagen, wie Du von "M2:X13" den Bereich "M2:O4" 
quasi abziehst, weil es zwar die Methode .removeRangeAddress gibt, aber es bei 
mir zu einem Fehler führt wenn ich versuche von einem CellRange-Objekt ein 
(quasi beinhaltetes) CellRange-Objekt 'abzuziehen' - augenscheinlich wird ein 
passendes CellRange*s*-Objekt erwartet.

> Als allerletzter Ausweg könnte ich mir zwar ne Lösung vorstellen, bei
> der ich den auszusparenden Bereich vorher kopiere, und nachher wieder
> einfüge,

in jedem Falle geht doch:

alle = Array("P2:X13", "M5:O13")
oSheet = thisComponent.getCurrentController.getActiveSheet
For i = 0 To 1
  oCellRange = oSheet.getCellRangeByName(alle(i))
  oCellRange.clearContents (com.sun.star.sheet.CellFlags.VALUE + 
com.sun.star.sheet.CellFlags.STRING)
Next i

schreib es so, dann ist es schön kompakt:

alle = Array("P2:X13", "M5:O13")
tcas = ThisComponent.CurrentController.ActiveSheet
For i = 0 To 1
  tcas.getCellRangeByName(alle(i)).clearContents(5)
Next i

> [1] ist etwas tricky, denn zuerst darf man nur STRG drücken, dann die
> Maustaste, dann SHIFT, und dann kan man mit der Maus 
> markieren (nur wers
> nachvollziehen möchte)

Du kannst den gewünschten Selektionsmodus auch in der Statusleiste per 
Mausklick umschalten (an der Stelle wo per Default "STD" steht)


Gruß
Jörg



-
To unsubscribe, e-mail: users-de-unsubscr...@openoffice.apache.org
For additional commands, e-mail: users-de-h...@openoffice.apache.org



[Basic] getCellRangeByName & Teilbereich ausschließen

2020-06-26 Diskussionsfäden Wolfgang Jäth
Hi,

ich hab folgendes Problemche: In einem Makro möchte ich einen bestimmten
Zellbereich löschen, davon jedoch ein paar Zellen innerhalb dieses
Bereiches ausnehmen. Bislang hab ich folgendes:

| Dim oSheet, oCellRange As Object
| oSheet = thisComponent.getCurrentController.getActiveSheet
| oCellRange = oSheet.getCellRangeByName ("M2:X13")
| oCell.clearContents (com.sun.star.sheet.CellFlags.VALUE +
com.sun.star.sheet.CellFlags.STRING)

Das klappt soweit auch, nur dass ich halt gerne den Inhalt des Bereichs
M2:O4 (statische Informationen) stehen lassen möchte.

Bei der direkten Bedienung kann ich ja auch den Bereich M2:X13 mit der
Maus mmarkieren, und dann mit gedrückter Tastenkombination STRG-SHIFT
[1] den Bereich M2:O4 wieder aus der Markierung heraus nehmen. Genau so
was stelle ich mir vor, nur im Makro. Geht das, bzw. kann mir jemand
sagen, wie? Im Web hab ich leider nix diesbezüglich gefunden; mir fehlt
dazu wohl das richtige Stichwort. :-(

Als allerletzter Ausweg könnte ich mir zwar ne Lösung vorstellen, bei
der ich den auszusparenden Bereich vorher kopiere, und nachher wieder
einfüge, aber das wäre für meinen Geschmack ein bisschen arg durchs Knie
ins Auge. :-/

[1] ist etwas tricky, denn zuerst darf man nur STRG drücken, dann die
Maustaste, dann SHIFT, und dann kan man mit der Maus markieren (nur wers
nachvollziehen möchte)

Wolfgang
-- 
Donald Trump ist ein großer Visionär, der seiner Zeit weit voraus ist:
Er verbreitet schon jetzt den Slogan "make America great again", obwohl
dieser erst in der Ära /nach/ ihm seine volle Bedeutung entfalten wird.


-
To unsubscribe, e-mail: users-de-unsubscr...@openoffice.apache.org
For additional commands, e-mail: users-de-h...@openoffice.apache.org