Druckbereich variabel

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Druckbereich variabel

Re: Druckbereich variabel

von aqua » Di, 22.03.2016 06:34

balu hat geschrieben: Das steht doch im vollen Gegensatz zu der voherigen Aussage: Wenn in A1 entweder eine 1, oder 2 oder aber eine 3 steht.
Oh, das war nicht gar nicht mehr bewußt, dass ich ganz am Anfang irgendwas mit 1,2,3 geschrieben habe, tut mir leid wenn ich dadurch einige verwirrt habe, war nicht mehr meine Absicht.

Danke für die Mühe und die Datei, werd ich mich gleich angucken.

Re: Druckbereich variabel

von balu » Mo, 21.03.2016 23:36

Hallo aqua,

was willst Du denn jetzt nun wirklich? Ich blicke echt nicht mehr durch.
ist es möglich den Druckbereich in einem Calc Dokument variabel zu machen?
Klar ist das möglich.

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.
Darauf lässt sich problemos aufbauen.


Und dann kommst Du mit so etwas um die Ecke.
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
Ich schreib das jetzt mal anders hin.
A17=1, A18=0, A19=0, A20=0
A17=1, A18=1, A19=0, A20=0
A17=1, A18=1, A19=1, A20=0
Das steht doch im vollen Gegensatz zu der voherigen Aussage: Wenn in A1 entweder eine 1, oder 2 oder aber eine 3 steht.

Das Du wenig bis gar keine Ahnung von StarBasic hast, ist für mich nun mehr als eindeutig. Aber das Du die Eingangsproblematik auf einmal in eine ganz andere Richtung verschiebst, ist für mich nicht nachvollziehbar.

Ich habe jetzt so was von die Schnauze gestrichen voll, ..... :lol: das ich dir auf Grund deiner Eingangsfrage und Vorgabe eine Beispieldatei mit folgendem Makro erstellt habe.

Code: Alles auswählen


Sub WandernderDruckbereich
    Dim aWanderDruck(1 to 3) 
    Dim oLeseBlatt as Object, oAktionBlatt as Object
    
    oDok = ThisComponent
    oLeseBlatt = oDok.sheets.getByName("Tabelle1")
    oAktionBlatt = oDok.sheets.getByName("Tabelle2")
    
    aWanderDruck(1) = 5
    aWanderDruck(2) = 10
    aWanderDruck(3) = 15

    oAusleseZelle = oLeseBlatt.getCellRangeByName("A4").value

    if oAusleseZelle >0 and oAusleseZelle <4 then

' Druckbereich A1 bis B??? festlegen. 
'
        oZellRange = oAktionBlatt.getCellRangeByName( "A1:B" & aWanderDruck( oAusleseZelle ))    
        oCursor = oAktionBlatt.createCursorByRange( oZellRange )    
        oAdress = oCursor.RangeAddress    
        Dim aDruckbereich(0)    
            aDruckbereich(0) = oAdress
            oAktionBlatt.setPrintAreas(aDruckbereich()
        Print "Druckbereich angelegt."
                            
    else
        Print "Kein gültiger und zugelassener Wert in der Zelle A4 !"
    end if
End Sub
In der Tabelle1 in Zelle A4 gibst du entweder 1, 2 oder 3 ein. Größer 3 und gleich 0 werden nicht akzeptiert.
Dann auf den Button drücken.



Gruß
balu
Dateianhänge
WandernderDruckbereich.ods
(12.96 KiB) 154-mal heruntergeladen

Re: Druckbereich variabel

von aqua » Mo, 21.03.2016 13:20

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?

Re: Druckbereich variabel

von Stephan » Mo, 21.03.2016 12:21

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

Re: Druckbereich variabel

von Stephan » Mo, 21.03.2016 12:20

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

Re: Druckbereich variabel

von aqua » Mo, 21.03.2016 11:38

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.

Re: Druckbereich variabel

von Karolus » Mo, 21.03.2016 11:29

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

Re: Druckbereich variabel

von balu » Mo, 21.03.2016 11:05

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

Re: Druckbereich variabel

von aqua » Mo, 21.03.2016 10:40

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

Re: Druckbereich variabel

von aqua » Mi, 16.03.2016 13:27

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....

Re: Druckbereich variabel

von Stephan » Mi, 16.03.2016 11:39

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

Re: Druckbereich variabel

von aqua » Mi, 16.03.2016 11:13

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

Re: Druckbereich variabel

von Stephan » Mi, 16.03.2016 10:22

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

Re: Druckbereich variabel

von aqua » Mi, 16.03.2016 06:53

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

Re: Druckbereich variabel

von Stephan » Di, 15.03.2016 13:43

"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

Nach oben