Druckbereich variabel

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

Moderator: Moderatoren

aqua
**
Beiträge: 34
Registriert: Do, 23.07.2015 07:25

Druckbereich variabel

Beitrag von aqua »

Guten Tag

ich habe ein kleines Anliegen,
ist es möglich den Druckbereich in einem Calc Dokument variabel zu machen?
Also z.b. wenn in Tabelle1 in Zeile A1 eine 1 steht, dann soll der Druckbereich in Tabelle2 von A1 bis G50 gehen. Steht doch eine 2, dann soll der Druckbereich A1:G60 sein. Bei 3 A1:G66.

Freue mich auf Antworten :D
aqua
**
Beiträge: 34
Registriert: Do, 23.07.2015 07:25

Re: Druckbereich variabel

Beitrag von aqua »

Hallo
muss nochmal auf dieses Thema zurückkommen.
Hab mir jetzt mal ein Makro aufgezeichnet, das den Druckbereich ändert. Da es ja mehrere Bereiche geben soll, hab ich das Makro kopiert und die entsprechenden Zeilen geändert.
Ich möchte das ganze mit If Else machen, und da ist mein Problem grade... gibt es einen Befehl der folgendes aussagt ?

"IF A17 nicht leer Then", also wenn in A17 etwas steht soll der das und das machen.

Code: Alles auswählen

sub Druckbereich
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 ----------------------------------------------------------------------
rem dispatcher.executeDispatch(document, ".uno:EditPrintArea", "", 0, Array())

'Wenn A20 nicht leer dann Bereich4
dim Bereich4(2) as new com.sun.star.beans.PropertyValue
Bereich4(0).Name = "PrintArea"
Bereich4(0).Value = "$A$1:$G$92"
Bereich4(1).Name = "PrintRepeatRow"
Bereich4(1).Value = ""
Bereich4(2).Name = "PrintRepeatCol"
Bereich4(2).Value = ""
dispatcher.executeDispatch(document, ".uno:ChangePrintArea", "", 0, Bereich4())

'Wenn A19 nicht leer dann Bereich3
dim Bereich3(2) as new com.sun.star.beans.PropertyValue
Bereich3(0).Name = "PrintArea"
Bereich3(0).Value = "$A$1:$G$92"
Bereich3(1).Name = "PrintRepeatRow"
Bereich3(1).Value = ""
Bereich3(2).Name = "PrintRepeatCol"
Bereich3(2).Value = ""
dispatcher.executeDispatch(document, ".uno:ChangePrintArea", "", 0, Bereich3())

'Wenn A18 nicht leer dann Bereich2
dim Bereich2(2) as new com.sun.star.beans.PropertyValue
Bereich2(0).Name = "PrintArea"
Bereich2(0).Value = "$A$1:$G$79"
Bereich2(1).Name = "PrintRepeatRow"
Bereich2(1).Value = ""
Bereich2(2).Name = "PrintRepeatCol"
Bereich2(2).Value = ""
dispatcher.executeDispatch(document, ".uno:ChangePrintArea", "", 0, Bereich2())

'Wenn A17 nicht leer dann Bereich1
dim Bereich1(2) as new com.sun.star.beans.PropertyValue
Bereich1(0).Name = "PrintArea"
Bereich1(0).Value = "$A$1:$G$66"
Bereich1(1).Name = "PrintRepeatRow"
Bereich1(1).Value = ""
Bereich1(2).Name = "PrintRepeatCol"
Bereich1(2).Value = ""
dispatcher.executeDispatch(document, ".uno:ChangePrintArea", "", 0, Bereich1())


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

Re: Druckbereich variabel

Beitrag von Stephan »

"IF A17 nicht leer Then", also wenn in A17 etwas steht soll der das und das machen.
z.B.:

Code: Alles auswählen

tcs = ThisComponent.Sheets().getByName("Tabelle1")
If tcs.getCellRangeByName("A17").FormulaLocal = "" Then
   'mach was
End If
Grß
Stephan
aqua
**
Beiträge: 34
Registriert: Do, 23.07.2015 07:25

Re: Druckbereich variabel

Beitrag von aqua »

Danke erstmal.
Aber scheinbar schein ich doch zu doof dazu zu sein.
Es passiert irgendwie nichts....

Code: Alles auswählen

sub Druckbereich
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 ----------------------------------------------------------------------
rem dispatcher.executeDispatch(document, ".uno:EditPrintArea", "", 0, Array())


tcs = ThisComponent.Sheets().getByName("Kanäle")

If tcs.getCellRangeByName("A20").FormulaLocal = "" Then
  'Wenn A20 nicht leer dann Bereich4
  dim Bereich4(2) as new com.sun.star.beans.PropertyValue
  Bereich4(0).Name = "PrintArea"
  Bereich4(0).Value = "$A$1:$G$105"
  Bereich4(1).Name = "PrintRepeatRow"
  Bereich4(1).Value = ""
  Bereich4(2).Name = "PrintRepeatCol"
  Bereich4(2).Value = ""
  dispatcher.executeDispatch(document, ".uno:ChangePrintArea", "", 0, Bereich4())
end if

If tcs.getCellRangeByName("A19").FormulaLocal = "" Then
  'Wenn A19 nicht leer dann Bereich3
  dim Bereich3(2) as new com.sun.star.beans.PropertyValue
  Bereich3(0).Name = "PrintArea"
  Bereich3(0).Value = "$A$1:$G$92"
  Bereich3(1).Name = "PrintRepeatRow"
  Bereich3(1).Value = ""
  Bereich3(2).Name = "PrintRepeatCol"
  Bereich3(2).Value = ""
  dispatcher.executeDispatch(document, ".uno:ChangePrintArea", "", 0, Bereich3())
end if

If tcs.getCellRangeByName("A18").FormulaLocal = "" Then
  'Wenn A18 nicht leer dann Bereich2
  dim Bereich2(2) as new com.sun.star.beans.PropertyValue
  Bereich2(0).Name = "PrintArea"
  Bereich2(0).Value = "$A$1:$G$79"
  Bereich2(1).Name = "PrintRepeatRow"
  Bereich2(1).Value = ""
  Bereich2(2).Name = "PrintRepeatCol"
  Bereich2(2).Value = ""
  dispatcher.executeDispatch(document, ".uno:ChangePrintArea", "", 0, Bereich2())
end if

If tcs.getCellRangeByName("A17").FormulaLocal = "" Then
  'Wenn A17 nicht leer dann Bereich2
  dim Bereich1(2) as new com.sun.star.beans.PropertyValue
  Bereich1(0).Name = "PrintArea"
  Bereich1(0).Value = "$A$1:$G$66"
  Bereich1(1).Name = "PrintRepeatRow"
  Bereich1(1).Value = ""
  Bereich1(2).Name = "PrintRepeatCol"
  Bereich1(2).Value = ""
  dispatcher.executeDispatch(document, ".uno:ChangePrintArea", "", 0, Bereich1())
end if

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

Re: Druckbereich variabel

Beitrag von Stephan »

naja, ich habe es unbeabsichtigt falsch herum geschrieben (sorry), aber das muss doch zu erkennen sein, da es dabei nicht um ein OpenOffice-Programmierungsproblem sondern nur um logische Ausdrücke geht.

Richtig ist also entweder:

Code: Alles auswählen

tcs = ThisComponent.Sheets().getByName("Tabelle1")
If NOT(tcs.getCellRangeByName("A17").FormulaLocal = "") Then
   'mach was
End If
oder z.B. auch:

Code: Alles auswählen

tcs = ThisComponent.Sheets().getByName("Tabelle1")
If tcs.getCellRangeByName("A17").FormulaLocal = "" Then

   Else   
      'mach was
End If
Gruß
Stephan
aqua
**
Beiträge: 34
Registriert: Do, 23.07.2015 07:25

Re: Druckbereich variabel

Beitrag von aqua »

Ok danke.
Jetzt wird wenigstens der Bereich schonmal verändert...
Nur wenn zb in A17 und A18 etwas steht, dann nimmt er den zweiten Bereich, was auch ok wäre. Wenn aber jetzt nur in A17 etwas steht dann sollte er den ersten Bereich nehmen, nimmt aber auch da den zweiten. Wenn ich das mit 1-4 Bereiche mache, nimmt er immer den der im Programm alles letztens aufgeführt ist, ist ja auch ok, wird ja noch oben nach unten abgearbeitet.
Nur wenn beim ersten IF NOT THEN die Bedingung nicht erfüllt ist, müsste er doch einfach zur nächsten Abfrage gehen ohne etwas zu machen oder??

Code: Alles auswählen

sub Druckbereich
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 ----------------------------------------------------------------------
rem dispatcher.executeDispatch(document, ".uno:EditPrintArea", "", 0, Array())


tcs = ThisComponent.Sheets().getByName("Kanäle")



If NOT(tcs.getCellRangeByName("A17").FormulaLocal = "") Then
  'Wenn A17 nicht leer dann Bereich1
  dim Bereich1(2) as new com.sun.star.beans.PropertyValue
  Bereich1(0).Name = "PrintArea"
  Bereich1(0).Value = "$A$1:$G$66"
  Bereich1(1).Name = "PrintRepeatRow"
  Bereich1(1).Value = ""
  Bereich1(2).Name = "PrintRepeatCol"
  Bereich1(2).Value = ""
  dispatcher.executeDispatch(document, ".uno:ChangePrintArea", "", 0, Bereich1())
 end if
 
 
If NOT(tcs.getCellRangeByName("A18").FormulaLocal = "") Then
  'Wenn A18 nicht leer dann Bereich2
  dim Bereich2(2) as new com.sun.star.beans.PropertyValue
  Bereich2(0).Name = "PrintArea"
  Bereich2(0).Value = "$A$1:$G$79"
  Bereich2(1).Name = "PrintRepeatRow"
  Bereich2(1).Value = ""
  Bereich2(2).Name = "PrintRepeatCol"
  Bereich2(2).Value = ""
  dispatcher.executeDispatch(document, ".uno:ChangePrintArea", "", 0, Bereich2())
end if



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

Re: Druckbereich variabel

Beitrag von Stephan »

Nur wenn zb in A17 und A18 etwas steht, dann nimmt er den zweiten Bereich
Nein, er nimmt beide Bereiche.

Das dabei die erste Aktion durch die zweite Aktion quasi 'überschrieben' wird ändert daran nichts.
Wenn aber jetzt nur in A17 etwas steht dann sollte er den ersten Bereich nehmen

Code: Alles auswählen

tcs = ThisComponent.Sheets().getByName("Tabelle1")
If NOT(tcs.getCellRangeByName("A17").FormulaLocal = "") AND tcs.getCellRangeByName("A18").FormulaLocal = "" Then
      'mach was
   ElseIf NOT(tcs.getCellRangeByName("A18").FormulaLocal = "") Then
      'mach was
End If
Nur wenn beim ersten IF NOT THEN die Bedingung nicht erfüllt ist, müsste er doch einfach zur nächsten Abfrage gehen ohne etwas zu machen

Code: Alles auswählen

tcs = ThisComponent.Sheets().getByName("Tabelle1")
If NOT(tcs.getCellRangeByName("A17").FormulaLocal = "") Then
      'mach was
   ElseIf NOT(tcs.getCellRangeByName("A18").FormulaLocal = "") Then
      'mach was
End If
oder??
ein Programm macht das was im Code steht und zwischen:

Code: Alles auswählen

If Not(<Bedingung 1>) Then

End If

If Not(<Bedingung 2>) Then

End If
und:

Code: Alles auswählen

If NOT(<Bedingung 1>) Then
      'mach was
   ElseIf NOT(<Bedingung 2>) Then
      'mach was
End If
besteht nun einmal ein logischer Unterschied in der Aussage.



Gruß
Stephan
aqua
**
Beiträge: 34
Registriert: Do, 23.07.2015 07:25

Re: Druckbereich variabel

Beitrag von aqua »

Mit zwei Bereiche funktioniert das schon mal so

Code: Alles auswählen

tcs = ThisComponent.Sheets().getByName("Tabelle1")
If NOT(tcs.getCellRangeByName("A17").FormulaLocal = "") AND tcs.getCellRangeByName("A18").FormulaLocal = "" Then
      'mach was
   ElseIf NOT(tcs.getCellRangeByName("A18").FormulaLocal = "") Then
      'mach was
End If
Hatte das nun versucht mit 3 bzw mehreren Bereichen versucht zu erweitern, nur hab ich dann wieder das Problem das mir irgendwann eine Aktion die andere Aktion überschreibt.

wenn A17=1 und A18 und A19 und A20 usw =0 dann
'mach das
wenn A18 und A17 =1 und a19 und A20 =0 dann
'mach das
wenn A19 undA18 und A17 =1 und A20 =0 dann
'mach das

1= steht irgendwas drin
0= leer

so hätte ich das gerne....
aqua
**
Beiträge: 34
Registriert: Do, 23.07.2015 07:25

Re: Druckbereich variabel

Beitrag von aqua »

Hallo
muss ich nochmal kurz nerven
hab das jetzt mal so versucht, müsste doch eigentlich so funktionieren oder? aber irgendwie scheint da doch noch ein Fehler zu sein....

Code: Alles auswählen

tcs = ThisComponent.Sheets().getByName("Kanäle")

If tcs.getCellRangeByName("I17").FormulaLocal = "1" and tcs.getCellRangeByName("I18").FormulaLocal = "0" Then
      'mach was
  elseif tcs.getCellRangeByName("I18").FormulaLocal = "1" and tcs.getCellRangeByName("I19").FormulaLocal = "0" Then
     'mach was
  elseif tcs.getCellRangeByName("I19").FormulaLocal = "1" and tcs.getCellRangeByName("I20").FormulaLocal = "0" Then
    'mach was
end if
end sub
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Druckbereich variabel

Beitrag von balu »

Hallo aqua,

so, dann wollen wir mal Frisööör spielen, und gehen zum Haarespalten.
1= steht irgendwas drin
Ja was steht denn dadrin, Text, oder Wert(Zahl)?

0= leer
Wenn 0 in der Zelle steht, dann ist sie nicht leer.
Und wenn nix drin steht, sie ist also leer, dann ist das nicht gleich 0.

Und wenn Du meinst das diese Haarspalterei blödsinnig ist, dann bist Du aufm falschen Dampfer.


Code: Alles auswählen

if tcs.getCellRangeByName("I17").FormulaLocal = "1" and tcs.getCellRangeByName("I18").FormulaLocal = "0" Then
Warum setzt Du die 0 und 1 in doppelte Anführungszeichen " "?



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Karolus
********
Beiträge: 7521
Registriert: Mo, 02.01.2006 19:48

Re: Druckbereich variabel

Beitrag von Karolus »

balu hat geschrieben:

Code: Alles auswählen

if tcs.getCellRangeByName("I17").FormulaLocal = "1" and tcs.getCellRangeByName("I18").FormulaLocal = "0" Then
Warum setzt Du die 0 und 1 in doppelte Anführungszeichen " "?
Warum nicht? ..FormulaLocal liefert immer einen String und keinen Zahlwert, in python müsste man für einen erfolgreichen Test in Anführungszeichen setzen. Schöner wäre in dem Fall aber:

Code: Alles auswählen

if tcs.getCellRangeByName("I17:I118").FormulaArray == (('1',),('0',)):
in Basic wäre es dann wieder hässlich:

Code: Alles auswählen

if tcs.getCellRangeByName("I17:I118").FormulaArray = array(array("1"), array("0")) then
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
aqua
**
Beiträge: 34
Registriert: Do, 23.07.2015 07:25

Re: Druckbereich variabel

Beitrag von aqua »

balu hat geschrieben:

Code: Alles auswählen

if tcs.getCellRangeByName("I17").FormulaLocal = "1" and tcs.getCellRangeByName("I18").FormulaLocal = "0" Then
Warum setzt Du die 0 und 1 in doppelte Anführungszeichen " "?
Weil ich das jetzt so gemacht hab das entweder 0 oder 1 in der Zelle steht.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Druckbereich variabel

Beitrag von Stephan »

muss ich nochmal kurz nerven
Du nervst nicht, nur ich hatte darauf verzichtet mich zu Wort zu melden, weil DEine erste Teilbedingung:
wenn A17=1 und A18 und A19 und A20 usw =0 dann
'mach das
wegen des "usw" nicht so einfach abzuhandeln ist wie die anderen zwei Teilbedingungen (denn ohne Einschränkung reicht diese ja quasi bis Zelle A1048576)



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

Re: Druckbereich variabel

Beitrag von Stephan »

Weil ich das jetzt so gemacht hab das entweder 0 oder 1 in der Zelle steht.
dann must Du diese Information aber auch mitteilen, denn geschrieben hattest Du:
1= steht irgendwas drin
0= leer
und es ist schlichtweg ein Unterschied zwischen 'irgendwas' und einer Zahl, weil:

Eine Zahl würde man prüfen mit .Value (statt .FormulaLocal).

Gleichzeitig war .FormulaLocal meine etwas 'hemdsärmlige' Variante für die korrrektere Variante:

Code: Alles auswählen

If NOT(tcs.getCellRangeByName("A17").getType = 0) Then
(.getType liefert 0 wenn die Zelle wirklich leer ist (1 für Zahlenwert, 2 für Text, 3 für Formel), siehe auch:
https://www.openoffice.org/api/docs/com ... tType.html)



Gruß
Stephan
aqua
**
Beiträge: 34
Registriert: Do, 23.07.2015 07:25

Re: Druckbereich variabel

Beitrag von aqua »

Stephan hat geschrieben:
1= steht irgendwas drin
0= leer
und es ist schlichtweg ein Unterschied zwischen 'irgendwas' und einer Zahl, weil:
Das weiß ich das da ein Unterschied drin besteht, die Überlegung es mit 1 und 0 zu machen kam auch erst heute morgen. Dachte es wäre einfacher mit den zwei Ziffer
Stephan hat geschrieben:
wenn A17=1 und A18 und A19 und A20 usw =0 dann
'mach das
wegen des "usw" nicht so einfach abzuhandeln ist wie die anderen zwei Teilbedingungen (denn ohne Einschränkung reicht diese ja quasi bis Zelle A1048576)
also im Prinzip will ich 8 Druckbereiche machen, das würde dann so aussehen wenn
wenn A17=1 und A18 und A19 und A20.....und A24=0
'mach das

Wollte das aber erstmal nur 3-4 Bereiche testen bzw funktionstüchtig machen und dann später auf 8 erweitern.

Weiß nicht ob eine Variante mit Case besser oder einfacher wäre?
Antworten