Rahmen um Zelle :?:

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

mike6
*****
Beiträge: 479
Registriert: Sa, 06.03.2004 13:58

Rahmen um Zelle :?:

Beitrag von mike6 »

Hallo,

ich möchte eine zuvor markierte Zelle ( oder Zellbereich ) mit
einem roten Rahmen versehen.

Leider bekomme ich das nur über einen zuvor deffinierten Bereich hin:



oZellBereich = ThisComponent.Sheets(0).getCellRangeByname( "B2:D4" )


Wie schreibe ich das Makro um, dass nur der zuvor markierte Bereich
gemeint ist.

mfg

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

Beitrag von Stephan »

Code: Alles auswählen

Sub rahmen_setzen()
bereich = ThisComponent.getCurrentSelection()
if bereich.supportsService("com.sun.star.sheet.SheetCell" ) _
OR bereich.supportsService("com.sun.star.sheet.SheetCellRange" ) _
OR bereich.supportsService("com.sun.star.sheet.SheetCellRanges") Then
	rahmenlinie = CreateUnoStruct("com.sun.star.table.BorderLine")
	With rahmenlinie
		.Color = RGB( 255, 0, 0 )
		.OuterLineWidth = 100
	End With
	rahmen = createUnoStruct("com.sun.star.table.TableBorder")
	With rahmen
		.TopLine = rahmenlinie
		.IsTopLineValid = True
		.BottomLine = rahmenlinie
		.IsBottomLineValid = True
		.LeftLine = rahmenlinie
		.IsLeftLineValid = True
		.RightLine = rahmenlinie
		.IsRightLineValid = True
	End With
	bereich.TableBorder = rahmen
End If
End Sub

Gruß
Stephan
mike6
*****
Beiträge: 479
Registriert: Sa, 06.03.2004 13:58

Beitrag von mike6 »

:D - :D - :D


Danke. Funktioniert bestens.

mfg
mike6
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

Hallo Stephan,

ich möchte mehrere Zellbereiche mit Rahmen versehen und habe Dein
Makro wie folgt umgeschrieben:

Code: Alles auswählen

Sub rahmen_setzen()
oZellBereich = ThisComponent.Sheets(0).getCellRangeByname( "D4:D8" ) 'Erster Zellbereich
oZellbereich.supportsService("com.sun.star.sheet.SheetCell")
   rahmenlinie = CreateUnoStruct("com.sun.star.table.BorderLine")
   With rahmenlinie
      .Color = RGB( 255, 0, 0 )
      .OuterLineWidth = 100
   End With
   rahmen = createUnoStruct("com.sun.star.table.TableBorder")
   With rahmen
      .TopLine = rahmenlinie
      .IsTopLineValid = True
      .BottomLine = rahmenlinie
      .IsBottomLineValid = True
      .LeftLine = rahmenlinie
      .IsLeftLineValid = True
      .RightLine = rahmenlinie
      .IsRightLineValid = True
   End With
   oZellbereich.TableBorder = rahmen
oZellBereich = ThisComponent.Sheets(0).getCellRangeByname( "J5:J16" ) 'Zweiter Zellbereich
oZellbereich.supportsService("com.sun.star.sheet.SheetCell")
   rahmenlinie = CreateUnoStruct("com.sun.star.table.BorderLine")
   With rahmenlinie
      .Color = RGB( 255, 0, 0 )
      .OuterLineWidth = 100
   End With
   rahmen = createUnoStruct("com.sun.star.table.TableBorder")
   With rahmen
      .TopLine = rahmenlinie
      .IsTopLineValid = True
      .BottomLine = rahmenlinie
      .IsBottomLineValid = True
      .LeftLine = rahmenlinie
      .IsLeftLineValid = True
      .RightLine = rahmenlinie
      .IsRightLineValid = True
   End With
   oZellbereich.TableBorder = rahmen
End Sub
Geht das vieleicht ein wenig kürzer?
Das ganze erscheint mir etwas klobig.

Im voraus vielen Dank.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hei Jürgen,
Geht das vieleicht ein wenig kürzer?
Das ganze erscheint mir etwas klobig.
Das ist schon OK. Da die Blöcke redundant sind, kanst du natürlich mit einer Schleife arbeiten, und Rahmen und Linie außerhalb einmal definieren:

Code: Alles auswählen

Sub rahmen_setzen() 
    dim aBereiche()
    aBereiche = array("D4:D8", "J5:J16") 'alle Bereiche
    REM Linie und Rahmen definieren
    rahmenlinie = CreateUnoStruct("com.sun.star.table.BorderLine")
    With rahmenlinie
      .Color = RGB( 255, 0, 0 )
      .OuterLineWidth = 100
    End With
    rahmen = createUnoStruct("com.sun.star.table.TableBorder")
    With rahmen
      .TopLine = rahmenlinie
      .IsTopLineValid = True
      .BottomLine = rahmenlinie
      .IsBottomLineValid = True
      .LeftLine = rahmenlinie
      .IsLeftLineValid = True
      .RightLine = rahmenlinie
      .IsRightLineValid = True
    End With
    for i = 0 to uBound(aBereiche())   'Schleife über alle Bereiche
        oZellBereich = ThisComponent.Sheets(  0).getCellRangeByname( aBereiche(i) ) 'der jeweilige Zellbereich
       REM oZellbereich.supportsService("com.sun.star.sheet.SheetCell")
       oZellbereich.TableBorder = rahmen 
    next
end Sub
Brauchst du noch mehr Bereiche, so erweitere einfach den Bereichsarray :-)
Was allerdings deine "supportsService" Zeile soll, ist mir schleierhaft. entweder du scheibst eine Bedingung (wie Stefan) oder du lässt sie weg. So hat sie keine Wirkung!

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

Hallo Toxitom,

erst mal Dankeschön für die Antwort.

Habe leider nicht soviel Zeit mich mit Programmierung auseinanderzusetzen.
Bislang habe ich mir immer Makrofragmente aus diesem Forum zu einem Makro zusammengestell.
Leider weiss ich nicht immer genau wofür was genau ist. :oops:
Werde mir jetzt aber mal das Buch über Basicprogrammierung für OOo zulegen. :idea:

Edit: Hab da noch zwei Fragen. Ist es ohne großen Aufwand möglich,
dass in dem definierten Bereich
alle einzelnen Zellen den farbigen Rahmen haben
und wie kann ich den Rahmen zurücksetzen?

Schöne Grüße

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Jürgen,

na ja, vielleicht solltest du dir doch ein Buch zu OOo Basic zulegen ;-) (z.B. siehe unten).

Wenn du jede Zelle mit einem Rahmen versehen willst, benötigst du kein TableBorder-Objekt, sondern für jeden Strich ein "BorderLine-Objekt". Das kannst du zusätzlich oder ausschliesslich nutzen. Oder - hier vielleicht einfacher - du fügst jede Zelle als einzelne Adresse im Array auf :-)

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

Hi Toxitom,

Werbung an:

Tari Tara
das Buch ist da.
Und das schon nach 2 Tagen per Onlinebestellung (Versandkostenfrei) :D

Echt klasse der Schmöker. Habe direkt mehrer Dinge gefunden die ich
noch gesucht habe. :lol:

Die Investition hat sich gelohnt.

Werbung aus

Schöne Grüße

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Antworten