Per Makro leere Zeile abfragen und danach Text einfügen

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

Moderator: Moderatoren

wellmo
**
Beiträge: 32
Registriert: Di, 13.12.2011 19:21

Per Makro leere Zeile abfragen und danach Text einfügen

Beitrag von wellmo »

Hallo miteinander

Schon seit ein paar Wochen lese und lerne ich viel von euch hier in diesem Forum, nun frisch registriert möchte ich euch Profis schonmal vielmals danken, das ihr euch die Zeit und Geduld nehmt uns Neulingen zu helfen. Eine tolle Sache.

Mein Vorhaben:
Wir erstellen unsere Offerten per OOo-Calc. Damit wir nicht immer alles schreiben müssen, habe ich einen Dialog erstellt mit vielen Checkboxen. Das funktioniert super. Ausser bei der Sparte "Sonstiges", da ich davor eine leere Zeile will (wegen der Darstellung in der Offerte) und ich bekomm es nicht hin das Makro so zu schreiben das es funktioniert.
Bisher habe ich erst die Makros für die Checkboxen "Abholung", Lieferung" und "Stellen" zum testen geschrieben.

Beispiel:
Wenn ich alle Checkboxen im Dialog anklicke, dann wird "Abholung" von "Lieferung" überschrieben und "Lieferung" von "Stellen" wegen der leeren Zeile (Code1).
Bei "Code2" wird zwar nichts überschrieben aber es gibt keine leere Zeile. Ich weiss auch warum, aber nicht wie ich es beheben kann.
Ich hoffe ihr könnt es nachvollziehen.

Code1:

Code: Alles auswählen

Sub Abholung
with thiscomponent.sheets(1)
sheet = ThisComponent.CurrentController.ActiveSheet
for i = 63 to 108  
if .getcellbyposition(1 ,i).string = "Abholung ab Lager" then exit for
if .getcellbyposition(1 ,i).string <> "" then 
end if
if .getcellbyposition(1 ,i).string = "" then  
   .getcellbyposition(1 ,i).string = "Abholung ab Lager"  
exit for
end if
next
textcur=sheet.getcellbyposition(1,i).gettext().createtextcursor()
textcur.gotostart(true)
textcur.CharWeight=com.sun.star.awt.FontWeight.BOLD
if .getcellbyposition(1 ,i).string = "Abholung ab Lager" then
   .getcellbyposition(2 ,i).string = "P"
end if
if .getcellbyposition(1 ,i).string = "Abholung ab Lager" then
   .getcellbyposition(3 ,i).value   = "1"
end if
if .getcellbyposition(1 ,i).string = "Abholung ab Lager" then
   .getcellbyposition(4 ,i).value = "280"
end if
if .getcellbyposition(1 ,i).string = "Abholung ab Lager" then
   .getcellbyposition(1 ,i+1).string = "Auslagerungspauschale."
end if
if .getcellbyposition(1 ,i).string = "Abholung ab Lager" then
   .getcellbyposition(1 ,i+2).string = "Der Kunde holt den Jacuzzi im Lager"
end if
if .getcellbyposition(1 ,i).string = "Abholung ab Lager" then
   .getcellbyposition(1 ,i+3).string = "der Firma xyz GmbH ab."
end if
end with
End Sub

Sub Lieferung
with thiscomponent.sheets(1)
sheet = ThisComponent.CurrentController.ActiveSheet
for i = 63 to 108  
if .getcellbyposition(1 ,i).string = "Lieferung" then exit for
if .getcellbyposition(1 ,i).string <> "" then 
end if   
if .getcellbyposition(1 ,i).string = "" then
   .getcellbyposition(1 ,i).string = "Lieferung" 
exit for 
end if
next
textcur=sheet.getcellbyposition(1,i).gettext().createtextcursor()
textcur.gotostart(true)
textcur.CharWeight=com.sun.star.awt.FontWeight.BOLD
if .getcellbyposition(1 ,i).string = "Lieferung" then
   .getcellbyposition(2 ,i).string = "P"
end if
if .getcellbyposition(1 ,i).string = "Lieferung" then
   .getcellbyposition(3 ,i).value   = "1"
end if
if .getcellbyposition(1 ,i).string = "Lieferung" then
   .getcellbyposition(4 ,i).value = "550"
end if
if .getcellbyposition(1 ,i).string = "Lieferung" then
   .getcellbyposition(1 ,i+1).string = "Anlieferung bis Bordsteinkante."
end if
if .getcellbyposition(1 ,i).string = "Lieferung" then
   .getcellbyposition(1 ,i+2).string = "Der Kunde organisiert die Mittel und"   
end if
if .getcellbyposition(1 ,i+1).string = "Lieferung" then 
   .getcellbyposition(1 ,i+3).string = "Personen um den Jacuzzi abzuladen und "   
end if
if .getcellbyposition(1 ,i+1).string = "Lieferung" then 
   .getcellbyposition(1 ,i+5).string = "aufzustellen."   
end if
end with
End Sub

Sub Stellen
with thiscomponent.sheets(1)
sheet = ThisComponent.CurrentController.ActiveSheet
for i = 63 to 108  
if .getcellbyposition(1 ,i).string = "Liefern und aufstellen" then exit for
if .getcellbyposition(1 ,i).string <> "" then 
end if   
if .getcellbyposition(1 ,i).string = "" then
   .getcellbyposition(1 ,i).string = "Liefern und aufstellen"
exit for 
end if
next
textcur=sheet.getcellbyposition(1,i+1).gettext().createtextcursor()
textcur.gotostart(true)
textcur.CharWeight=com.sun.star.awt.FontWeight.BOLD
if .getcellbyposition(1 ,i).string = "Liefern und aufstellen" then
   .getcellbyposition(2 ,i).string = ""
end if
if .getcellbyposition(1 ,i).string = "Liefern und aufstellen" then
   .getcellbyposition(3 ,i).string   = ""
end if
if .getcellbyposition(1 ,i).string = "Liefern und aufstellen" then
   .getcellbyposition(4 ,i).string = "offen"
end if
if .getcellbyposition(1 ,i).string = "Liefern und aufstellen" then
   .getcellbyposition(1 ,i+1).string = "Der Aufstellort muss besichtigt werden und "
end if
if .getcellbyposition(1 ,i).string = "Liefern und aufstellen" then
   .getcellbyposition(1 ,i+2).string = "wird danach separat offeriert."
end if
end with
End Sub
Code2

Code: Alles auswählen

Sub Abholung
with thiscomponent.sheets(1)
sheet = ThisComponent.CurrentController.ActiveSheet
for i = 63 to 108  
if .getcellbyposition(1 ,i).string = "Abholung ab Lager" then exit for
if .getcellbyposition(1 ,i).string <> "" then 
end if
if .getcellbyposition(1 ,i+1).string = "" then  
   .getcellbyposition(1 ,i+1).string = "Abholung ab Lager"  
exit for
end if
next
textcur=sheet.getcellbyposition(1,i+1).gettext().createtextcursor()
textcur.gotostart(true)
textcur.CharWeight=com.sun.star.awt.FontWeight.BOLD
if .getcellbyposition(1 ,i+1).string = "Abholung ab Lager" then
   .getcellbyposition(2 ,i+1).string = "P"
end if
if .getcellbyposition(1 ,i+1).string = "Abholung ab Lager" then
   .getcellbyposition(3 ,i+1).value   = "1"
end if
if .getcellbyposition(1 ,i+1).string = "Abholung ab Lager" then
   .getcellbyposition(4 ,i+1).value = "280"
end if
if .getcellbyposition(1 ,i+1).string = "Abholung ab Lager" then
   .getcellbyposition(1 ,i+2).string = "Auslagerungspauschale."
end if
if .getcellbyposition(1 ,i+1).string = "Abholung ab Lager" then
   .getcellbyposition(1 ,i+3).string = "Der Kunde holt den Jacuzzi im Lager"
end if
if .getcellbyposition(1 ,i+1).string = "Abholung ab Lager" then
   .getcellbyposition(1 ,i+4).string = "der Firma xyz GmbH ab."
end if
end with
End Sub

Sub Lieferung
with thiscomponent.sheets(1)
sheet = ThisComponent.CurrentController.ActiveSheet
for i = 63 to 108  
if .getcellbyposition(1 ,i).string = "Lieferung" then exit for
if .getcellbyposition(1 ,i).string <> "" then 
end if   
if .getcellbyposition(1 ,i+1).string = "" then
   .getcellbyposition(1 ,i+1).string = "Lieferung" 
exit for 
end if
next
textcur=sheet.getcellbyposition(1,i+1).gettext().createtextcursor()
textcur.gotostart(true)
textcur.CharWeight=com.sun.star.awt.FontWeight.BOLD
if .getcellbyposition(1 ,i+1).string = "Lieferung" then
   .getcellbyposition(2 ,i+1).string = "P"
end if
if .getcellbyposition(1 ,i+1).string = "Lieferung" then
   .getcellbyposition(3 ,i+1).value   = "1"
end if
if .getcellbyposition(1 ,i+1).string = "Lieferung" then
   .getcellbyposition(4 ,i+1).value = "550"
end if
if .getcellbyposition(1 ,i+1).string = "Lieferung" then
   .getcellbyposition(1 ,i+2).string = "Anlieferung bis Bordsteinkante."
end if
if .getcellbyposition(1 ,i+1).string = "Lieferung" then
   .getcellbyposition(1 ,i+3).string = "Der Kunde organisiert die Mittel und"   
end if
if .getcellbyposition(1 ,i+1).string = "Lieferung" then 
   .getcellbyposition(1 ,i+4).string = "Personen um den Jacuzzi abzuladen und "   
end if
if .getcellbyposition(1 ,i+1).string = "Lieferung" then 
   .getcellbyposition(1 ,i+5).string = "aufzustellen."   
end if
end with
End Sub

Sub Stellen
with thiscomponent.sheets(1)
sheet = ThisComponent.CurrentController.ActiveSheet
for i = 63 to 108  
if .getcellbyposition(1 ,i).string = "Liefern und aufstellen" then exit for
if .getcellbyposition(1 ,i).string <> "" then 
end if   
if .getcellbyposition(1 ,i+1).string = "" then
   .getcellbyposition(1 ,i+1).string = "Liefern und aufstellen"
exit for 
end if
next
textcur=sheet.getcellbyposition(1,i+1).gettext().createtextcursor()
textcur.gotostart(true)
textcur.CharWeight=com.sun.star.awt.FontWeight.BOLD
if .getcellbyposition(1 ,i+1).string = "Liefern und aufstellen" then
   .getcellbyposition(2 ,i+1).string = ""
end if
if .getcellbyposition(1 ,i+1).string = "Liefern und aufstellen" then
   .getcellbyposition(3 ,i+1).string   = ""
end if
if .getcellbyposition(1 ,i+1).string = "Liefern und aufstellen" then
   .getcellbyposition(4 ,i+1).string = "offen"
end if
if .getcellbyposition(1 ,i+1).string = "Liefern und aufstellen" then
   .getcellbyposition(1 ,i+2).string = "Der Aufstellort muss besichtigt werden und "
end if
if .getcellbyposition(1 ,i+1).string = "Liefern und aufstellen" then
   .getcellbyposition(1 ,i+3).string = "wird danach separat offeriert."
end if
end with
End Sub

Irgendwie kommt mir der richtige Lösungsweg nicht in den Sinn.
Kann mir wer einen Denkanstoss geben oder evtl auch gleich ein Code-Beispiel? Ich bin für jede Hilfe dankbar.

PS: Ich kann mir vorstellen dass man den Code auch kürzer hinbekommt, ohne so viele "if-then", aber ich bin ehrlich gesagt schon froh das ich das schon so hingebracht habe :)
PSS: Wie kann ich den Code so einfügen wie ihr, das man den schön in Farbe sieht? Ist ja grässlich so als Quote und viel zu lang.

Gruss Dave
Zuletzt geändert von wellmo am Sa, 17.12.2011 12:01, insgesamt 2-mal geändert.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Per Makro leere Zeile abfragen und danach Text einfügen

Beitrag von Stephan »

Du solltest eine Beispieldatei zur Verfügung stellen, das dürfte die Chance auf Hilfe erhöhen. Der jetzige Screenshot z.B. ist nichtsagend, da er außer der Information das es einen Dialog mit Checkboxen gibt keine Info liefert, zumal ja auch nach der Anbindung der Checkboxen nicht gefragt ist.
Außer der ganz allgemeinen Info das der gepostete Code 'irgendwie' mit den Checkboxen 'zusammenarbeitet' gibt es derzeitig keine (mir) verständliche Beziehung zwischen Code und Screenshots.

Das alles ist weniger Kritik als der allgemeine Hinweis das auch Experten bequem sind und die Chance auf Hilfe steigt wenn Du es ihnen bequem machst.
Jeder versteht hier, im Konkreten, das es wohl allgemein um eine Art brief in Calc geht, nur wennn die Leute selber sich erst die Texte in ein Calc-Blatt zusammenkopieren müssen um optisch zu sehen was wo steht ist vielen bereits die Lust vergangen über Code nachzudenken, was ja aber eigentlich Kern der Hilfe wäre.


Ich greife deshalb jetzt nur ein paar allgemeine Dinge heraus:

Code: Alles auswählen

if .getcellbyposition(1 ,i).string <> "" then
end if
dieser Teil tut nichts, da zwar eine Bedingung geprüft wird aber keine Aktion vorgesehen ist

Code: Alles auswählen

textcur=sheet.getcellbyposition(1,i).gettext().createtextcursor()
textcur.gotostart(true)
textcur.CharWeight=com.sun.star.awt.FontWeight.BOLD
tut im Konkreten wohl auch nichts, denn die formatierung bezieht sich hierbei doch praktisch (das "true" bewirkt hier keine Markierung) nur auf das Zeichen vor dem ersten Zeichen (was noch nicht existiert) es dürfte also garnichts sichtbar werden

Code: Alles auswählen

if .getcellbyposition(1 ,i+1).string = "Lieferung" then
.getcellbyposition(3 ,i+1).value = "1"
end if
if .getcellbyposition(1 ,i+1).string = "Lieferung" then
.getcellbyposition(4 ,i+1).value = "550"
end if
if .getcellbyposition(1 ,i+1).string = "Lieferung" then
.getcellbyposition(1 ,i+2).string = "Anlieferung bis Bordsteinkante."
end if
if .getcellbyposition(1 ,i+1).string = "Lieferung" then
.getcellbyposition(1 ,i+3).string = "Der Kunde organisiert die Mittel und"
end if
if .getcellbyposition(1 ,i+1).string = "Lieferung" then
.getcellbyposition(1 ,i+4).string = "Personen um den Jacuzzi abzuladen und "
end if
if .getcellbyposition(1 ,i+1).string = "Lieferung" then
.getcellbyposition(1 ,i+5).string = "aufzustellen."
end if
das lässt sich kürzen auf z.B.:

Code: Alles auswählen

if .getcellbyposition(1 ,i+1).string = "Lieferung" then
  .getcellbyposition(3 ,i+1).value = "1"
  .getcellbyposition(4 ,i+1).value = "550"
  .getcellbyposition(1 ,i+2).string = "Anlieferung bis Bordsteinkante."
  .getcellbyposition(1 ,i+3).string = "Der Kunde organisiert die Mittel und"
  .getcellbyposition(1 ,i+4).string = "Personen um den Jacuzzi abzuladen und "
  .getcellbyposition(1 ,i+5).string = "aufzustellen."
End If
oder auch z.B.:

Code: Alles auswählen

if .getcellbyposition(1 ,i+1).string = "Lieferung" then
  .getcellbyposition(3 ,i+1).value = "1"
  .getcellbyposition(4 ,i+1).value = "550"
  texte() = Array("Anlieferung bis Bordsteinkante.", "Der Kunde organisiert die Mittel und", "Personen um den Jacuzzi abzuladen und ", "aufzustellen.")
  For j = 2 To 5 
    .getcellbyposition(1 ,i+j).string = texte(j-2)
  Next j
End If
Wie kann ich den Code so einfügen wie ihr, das man den schön in Farbe sieht?
Klicke auf "Code" statt "Quote"


Gruß
Stephan
wellmo
**
Beiträge: 32
Registriert: Di, 13.12.2011 19:21

Re: Per Makro leere Zeile abfragen und danach Text einfügen

Beitrag von wellmo »

Hallo Stephan

Folgender Code macht den Text im vorherigen Code fett.

Code: Alles auswählen

textcur=sheet.getcellbyposition(1,i).gettext().createtextcursor()
textcur.gotostart(true)
textcur.CharWeight=com.sun.star.awt.FontWeight.BOLD
da folgendes weiter oben im Code steht

Code: Alles auswählen

sheet = ThisComponent.CurrentController.ActiveSheet
Zumindest bewirkt er das und ich bin froh darum :lol:

Ich habe dir mal das komplette Dokument hochgeladen. Ein paar Sachen wie Logo, Namen und gewisse Preise habe ich einfach mal rausgelöscht.
Bitte erschrecke nicht ab dem ganzen Code-Wirrwarr, das meiste ist aus verschiedenen Threads aus diesem Forum zusammengebastelt und oder bisschen abgeändert.

Das ganze ist noch eine grosse Baustelle da ich mich Schritt für Schritt vorarbeite aber immer mehr Ideen bekomme was noch rein könnte.
Im ersten Sheet einfach auf den Button start drücken, dann im ersten Dialog auf den Button Jacuzzi. Im zweiten Dialog die Checkboxen Abholung und Lieferung anklicken und dann auf den Button Offerte/Auftrag.
Im Anhang tu ich dir ein Bild rein, wie es ab Zeile 63 aussehen sollte.

Ich hoffe ich konnte mir helfen, das du mir helfen kannst ;)

Gruss Dave
Dateianhänge
Bild.JPG
Bild.JPG (78.66 KiB) 1621 mal betrachtet
Offertenvorlage - Kopie.ods
(61.26 KiB) 121-mal heruntergeladen
wellmo
**
Beiträge: 32
Registriert: Di, 13.12.2011 19:21

Re: Per Makro leere Zeile abfragen und danach Text einfügen

Beitrag von wellmo »

OK, nun hatte ich mehr Zeit und wieder einen klar Kopf ;)

Code: Alles auswählen

Sub Stellen
with thiscomponent.sheets(1)
sheet = ThisComponent.CurrentController.ActiveSheet
for i = 63 to 108  
if .getcellbyposition(1 ,i).string = "Liefern und aufstellen" then exit for
if .getcellbyposition(1 ,i).string = "" then
'Hier müsste der Code rein damit das Makro diese Zeile leer lässt und eine Zeile weiter unten weiter macht. 
end if   
if .getcellbyposition(1 ,i).string = "" then
   .getcellbyposition(1 ,i).string = "Liefern und aufstellen"
exit for 
end if
next
.....
.....
Einfacher kann ich es euch glaub nicht machen ;) hoffe einer von euch kann mir helfen.
Gruss Dave
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Per Makro leere Zeile abfragen und danach Text einfügen

Beitrag von DPunch »

Aloha

Ich kann Deinem Anliegen zwar im Gesamtkontext nicht ganz folgen, aber wenn es nur um das Weiterspringen um eine Zeile geht, sollte

Code: Alles auswählen

if .getcellbyposition(1 ,i).string = "" then
  i = i + 1'Hier müsste der Code rein damit das Makro diese Zeile leer lässt und eine Zeile weiter unten weiter macht.
end if   
ausreichen.
Deiner Beispieldatei fehlen leider die Makros, das macht die Sache nicht leichter.
wellmo
**
Beiträge: 32
Registriert: Di, 13.12.2011 19:21

Re: Per Makro leere Zeile abfragen und danach Text einfügen

Beitrag von wellmo »

Hi DPunch

Das i=i+1 war genau das was ich gesucht hatte.

Wenn ich das gleich so einfach erklärt hätte wie die Lösung doch ist....

Danke dir vielmals.

ps: Auch ein Danke an Stephan, der Code sieht doch ein bisschen übersichtlicher aus wenn man ihn so schön kürzen kann.

Gruss Dave
Antworten