Mehrere Bereiche zum Löschen per Makro in Calc auswählen

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

Moderator: Moderatoren

LidiaS
*
Beiträge: 15
Registriert: Do, 28.08.2014 19:14

Mehrere Bereiche zum Löschen per Makro in Calc auswählen

Beitrag von LidiaS »

Guten Morgen Allerseits,

ich möchte den Zellinhalt in mehreren (nicht zusammen hängenden) Bereichen per Makro löschen.

Herr Dannenhöfer sagt:
Man kann auch gleichzeitig mehrere Bereiche auswählen. Dann müssen diese nur mit Komma getrennt eingegeben werden.
getCellRangeByName("A1:B5","C4:D9") ergibt dann den Bereich A1:B5 und C4:D9


Wenn ich dies mache,

Code: Alles auswählen

	myDocument = thisComponent
	mySheet=thiscomponent.getcurrentcontroller.activesheet
	myCell = mySheet.getCellRangeByName("B2:B4","B7:B37","C40:C41")
	inK= com.sun.star.sheet.CellFlags.STRING + com.sun.star.sheet.CellFlags.VALUE
	myCell.clearContents( inK )
dann löscht er mir den Bereich B2:B4 aber nicht die darauf folgenden. Was mache ich falsch? Ist das Anspechen mehrerer Bereiche zum Löschen nicht möglich?

Wäre für Hilfe sehr dankbar.

Lieben Dank und einen guten Start in die Woche
Lidia
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Mehrere Bereiche zum Löschen per Makro in Calc auswählen

Beitrag von komma4 »

LidiaS hat geschrieben:
Dannenhöfer hat geschrieben:Man kann auch gleichzeitig mehrere Bereiche auswählen.
Vielleicht ging das mal.
Mit meiner aktuellen Installation (AOO 4.1.1) zeigt mir MRI den gewählten Bereich

Code: Alles auswählen

   myCell = mySheet.getCellRangeByName("B2:B4","B7:B37","C40:C41")
   MRI mycell
an:

Code: Alles auswählen

AbsoluteName: $Tabelle1.$B$2:$B$4
Du machst also nichts falsch.

Erzeuge eine Funktion zum Löschen eines Bereichs und rufe sie mit den drei Angaben dreimal auf.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
TrueColor
******
Beiträge: 547
Registriert: Do, 11.03.2010 11:23

Re: Mehrere Bereiche zum Löschen per Makro in Calc auswählen

Beitrag von TrueColor »

Huhu,
LidiaS hat geschrieben:Herr Dannenhöfer sagt:
Man kann auch gleichzeitig mehrere Bereiche auswählen. Dann müssen diese nur mit Komma getrennt eingegeben werden.
getCellRangeByName("A1:B5","C4:D9") ergibt dann den Bereich A1:B5 und C4:D9
Hatten wir letztens schon mal. Schau mal hier: viewtopic.php?f=18&t=65796
Da ist auch ein Bsp., wie du's per Schleife lösen kannst.
System:
LibO 6 + LibO 7
LidiaS
*
Beiträge: 15
Registriert: Do, 28.08.2014 19:14

Re: Mehrere Bereiche zum Löschen per Makro in Calc auswählen

Beitrag von LidiaS »

Hallo Allerseits,

vielen Dank an komma4 und TrueColor für die Antworten und die Hinweise. Wie gewohnt wird einem im OOForum schnell und kompetent geholfen :D.

Viele Grüße
Lidia
LidiaS
*
Beiträge: 15
Registriert: Do, 28.08.2014 19:14

Re: Mehrere Bereiche zum Löschen per Makro in Calc auswählen

Beitrag von LidiaS »

Hallo nochmals Allerseits,

ich stelle mal meine Lösung des o.g. Problems rein. Vielleicht ist diese für den einen oder anderen Anfänger (bin ja selber einer :) ) hilfreich.

Grundlage ist TrueColors Hinweis:
Hatten wir letztens schon mal. Schau mal hier: viewtopic.php?f=18&t=65796
Da ist auch ein Bsp., wie du's per Schleife lösen kannst.
Ich habe zwei Varianten erstellt, wobei ich Variante I verwenden werde:

Variante I (Grundlage Code von clag):

Code: Alles auswählen

   myDocument = ThisComponent
   mySheet = ThisComponent.getcurrentcontroller.activesheet
   myCells = Array("B2:B4","B7:B37","C40:C41","C43:I62","C65:C75")
   for i=0 to 4
   inK = 5
   'Alternativ: inK= com.sun.star.sheet.CellFlags.STRING + com.sun.star.sheet.CellFlags.VALUE
   mySheet.getCellRangeByName(myCells(i)).clearContents(inK)
      
   next
Variante II (Grundlage Code von F3K Total):

Code: Alles auswählen

    myDocument = thisComponent
    mySheet=thiscomponent.getcurrentcontroller.activesheet
    myR1= mySheet.getCellRangeByName("B2:B4").RangeAddress
    myR2= mySheet.getCellRangeByName("B7:B37").RangeAddress
    myR3= mySheet.getCellRangeByName("C40:C41").RangeAddress
    myR4= mySheet.getCellRangeByName("C43:I62").RangeAddress
    myR5= mySheet.getCellRangeByName("C65:C75").RangeAddress
    mycellranges = thiscomponent.createInstance("com.sun.star.sheet.SheetCellRanges")
    mycellranges.addRangeAddress(myR1,true)
    mycellranges.addRangeAddress(myR2,true)
    mycellranges.addRangeAddress(myR3,true)
    mycellranges.addRangeAddress(myR4,true)
    mycellranges.addRangeAddress(myR5,true)
    inK = 5
 	mycellranges.clearContents(inK)
Es geht sicherlich immer besser. Aber es funktioniert und die Variante I ist schön kurz :D .

Nochmal vielen Dank für das "auf den Weg bringen".

Viele Grüße
Lidia
Karolus
********
Beiträge: 7533
Registriert: Mo, 02.01.2006 19:48

Re: Mehrere Bereiche zum Löschen per Makro in Calc auswählen

Beitrag von Karolus »

Code: Alles auswählen

doc = thisComponent
sheet = doc.CurrentController.ActiveSheet
...
for each rangename in mycells
    sheet.getCellRangeByName( rangename).clearContents( 5 )
next
...
Variante 2

Code: Alles auswählen

cellranges = doc.createInstance("com.sun.star.sheet.SheetCellRanges")
...
for each rangename in mycells
    cellranges.addRangeAddress(sheet.getCellRangeByName( rangename).RangeAddress, True)
next
...
Lasst doch mal dieses bescheuerte prefix my weg, wenn das an jeden Objectnamen drangeklebt wird verlierts doch auch jegliche semantische Bedeutung
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LidiaS
*
Beiträge: 15
Registriert: Do, 28.08.2014 19:14

Re: Mehrere Bereiche zum Löschen per Makro in Calc auswählen

Beitrag von LidiaS »

Hallo Karolus,

zu Variante I: So?

Code: Alles auswählen

doc = thisComponent
sheet = doc.CurrentController.ActiveSheet
Cells = Array("B2:B4","B7:B37","C40:C41","C43:I62","C65:C75")
for each i in Cells
sheet.getCellRangeByName( i ).clearContents( 5 )
next
Bei Variante II komme ich nicht weiter. Kannst Du bitte den ganzen Code schreiben, damit ich was lerne. Ich glaube mein Ansatz ist falsch. Fasst man die Zellbereiche hier auch noch mal irgendwie zusammen? Stehe auf dem Schlauch und komme nicht runter ...

Code: Alles auswählen

Doc = thisComponent
Sheet=Doc.getcurrentcontroller.activesheet
R1= Sheet.getCellRangeByName("B2:B4").RangeAddress
R2= Sheet.getCellRangeByName("B7:B37").RangeAddress
R3= Sheet.getCellRangeByName("C40:C41").RangeAddress
R4= Sheet.getCellRangeByName("C43:I62").RangeAddress
R5= Sheet.getCellRangeByName("C65:C75").RangeAddress
cellranges = Doc.createInstance("com.sun.star.sheet.SheetCellRanges")
mycells = ?????
for each rangename in mycells
cellranges.addRangeAddress(sheet.getCellRangeByName(rangename).RangeAddress,True).clearContents(5)
next rangename
Vielen Dank und Gruß
Lidia
Karolus
********
Beiträge: 7533
Registriert: Mo, 02.01.2006 19:48

Re: Mehrere Bereiche zum Löschen per Makro in Calc auswählen

Beitrag von Karolus »

Hallo

Var I stimmt so, bis darauf das i eine furchtbare Bezeichnung ist, für etwas das keine ganzahlige Laufvariable ist

Var II

Code: Alles auswählen

doc = thisComponent
sheet = doc.CurrentController.ActiveSheet
Cells = Array("B2:B4","B7:B37","C40:C41","C43:I62","C65:C75")
cellranges = doc.createInstance("com.sun.star.sheet.SheetCellRanges")
for each rangename in Cells
    cellranges.addRangeAddress(sheet.getCellRangeByName(rangename).RangeAddress,True)
next
cellranges.clearContents(5)

Ich will dir nicht zu nahe treten, aber wenn deine Programmierkünste nicht über das copy&paste-Stadium hinausgehen, solltest du dir besser ein anderes Hobby suchen.
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LidiaS
*
Beiträge: 15
Registriert: Do, 28.08.2014 19:14

Re: Mehrere Bereiche zum Löschen per Makro in Calc auswählen

Beitrag von LidiaS »

Hallo Karolus,

Ich habe nicht vor Programmierkünstler zu werden. Und ich würde es begrüßen, wenn Du auf eine persönliche Einschätzung meiner Fähigkeiten auf Grund von ein paar Zeilen Code, verzichten würdest. Arroganz ist ein sehr schlechter Lehrmeister.

Da hier nun ausreichend funktionierende Code-Varianten zur Verfügung stehen, sehe ich das Thema als abgeschlossen an.

Schönen Tag noch.
Lidia
Antworten