Seite 1 von 1

Benötige Hilfe bei Makro-Programmierung für Calc

Verfasst: Di, 12.10.2010 19:29
von Thaver2Theta
Hi,

ich habe einwenig Probleme bei der Erstellung eines Makros für Calc. Ich kann php, javascript, html, css und einbisschen sql. Früher mal hab ich einbisschen in PureBasic programmiert, nur hier in OO fehlt mir doch eine benutzerfreundliche API für StarBasic mit Einführungstutorials, die die grundlegenden Dinge wie Schleifen, Aus-/Einlesen von Daten exemplarisch darstellt.

Folgendes möchte ich realisieren:
Ich habe einen fortlaufenden Kalender in OO Calc erstellt mit Montag, Dienstag ... Sonntag und wieder Montag,Dienstag, usw. ...
Ich möchte mittels Makros, dass die Spaltenbreite der Arbeitstage (Montag bis Freitag) 7cm beträgt und die Wochenendtage (Samstag, Sonntag) nur 3cm breite Spalten haben. Ich möchte einen Kalender erstellen mit 48 Einzel-Blättern im Din A3 auf dem jeweils einer Woche(Mon-Son) zu sehen sind.

Mittels einer do-while Schleife möchte ich gerne, dass jede Zelle von A1 bis Ax durchgelaufen wird und entsprechende Spaltenbreite eingestellt. Wenn die Schleife keinen Wochentag mehr als Zellinhalt als wahre Aussage zur Ausfürhung hat, soll sie abgebrochen werden.

Bisher habe ich das hier:

Code: Alles auswählen

Sub SpaltenBreiteV05
  dim SaSoWidth as integer
  dim MoFrWidth as integer
  dim counterX as integer
  dim counterY as integer
  dim currentCell as String
  SaSoWidth = 3000
  MoFr = 7000
  counterX = 0
  counterY = 0
  currentCell = getCellByPosition(counterY, counterX).String
  do while currentCell  = not ""                                            'also leer kein Zellinhalt
    counterX++
    if currentCell = "Sonntag" then
      ThisComponent.sheets(0).Columns(counterX).Width = SaSoWidth
    else
    hisComponent.sheets(0).Columns(counterX).Width = MoFrWidth    	
    EndIf	
end sub
So sieht die Tabelle in der Vorschau für den Druck aus:
Bild

Re: Benötige Hilfe bei Makro-Programmierung für Calc

Verfasst: Mi, 13.10.2010 10:41
von Karolus
Hallo
Geht es nur um den Ausdruck - dann würde ich mir die erste Seite einrichten und dann in einer for-Schleife 48 mal drucken und jedesmal die Datumswerte um 7 Tage hochzählen.
http://www.dannenhoefer.de/faqstarbasic ... l#Zweig158
http://www.dannenhoefer.de/faqstarbasic ... l#Zweig175

Edit: Oder innerhalb deiner Vorgabe:

Code: Alles auswählen

sub spaltenbreite
with thiscomponent.sheets( 0 )
for i = 0 to 48*7 -1
	if i mod 7 < 5 then
		.columns( i ).Width = 7000
	else
		.columns( i ).Width = 3000
	end if
next i
end with
end sub
Gruß Karo

Re: Benötige Hilfe bei Makro-Programmierung für Calc

Verfasst: Do, 14.10.2010 04:11
von Thaver2Theta
Danke für deine Antwort, jedoch ist das nicht ganz die Lösung die gesucht habe, dennoch war dein Link sehr hilfreich.
Unten sieht man den derzeitigen Code. So weit geht er auch ganz gut, nur soll die DoWhile-Schleife bitte abgebrochen werden wenn die Zelle keinen Inhalt mehr hat, daher dachte ich dass die Bedingung ==> do while CellString <> "" <== ausreichen sollte, jedoch scheint da ein Fehler zu sein, da die Loop-Schleife bis zum OverFlow die Zellen durcharbeitet. Alternativ die Zell am Ende des letzten Wochentages mit dem Inhalt "abort" versehen und dafür die Bedinung do while CellString <> "abort" nehmen bring leider auch nichts.

Ich finde den Fehler leider nicht.

Code: Alles auswählen

Sub SpaltenBreiteV08
	dim SaSoWidth as integer
	dim MoFrWidth as integer
    SaSoWidth = 3000
	MoFrWidth = 7000
	
	dim counterX as integer
	counterX = 0
	dim CellString as String	
	CellString = "faleNtrue"
	
	myDoc = thisComponent
	mySheet = myDoc.sheets(0)
	myCell = mysheet.getCellByPosition(counterX,0)
	
	do while CellString <> "" AND counterX <> 1000
		CellString = mycell.String

		if CellString = "a" then
		mySheet.Columns(counterX).Width = SaSoWidth
		elseif CellString <> "a" then
		mySheet.Columns(counterX).Width = MoFrWidth
		else
		EndIf
		counterX = counterX + 1
    Loop	
end sub
Anmerkung:
Dieses Basic als Programmiersprache ist so häßlich, dass man den Code 3x durchlesen muss bis man ihn versteht weil er auf dem ersten Blick wie ein normaler Buchtext aussieht. Jetzt weiß ich auch warum ich PureBasic nie richtig weiter gelernt habe.

Re: Benötige Hilfe bei Makro-Programmierung für Calc

Verfasst: Do, 14.10.2010 08:39
von Karolus
Hallo
Füge direkt unter der Zeile "do while CellString <> ..." nochmal die Zuweisung ein:

Code: Alles auswählen

myCell = mysheet.getCellByPosition(counterX,0)
Insgesamt wärs etwas hübscher in der Form:

Code: Alles auswählen

Sub SpaltenBreiteV09

   dim SaSoWidth as integer
   dim MoFrWidth as integer
   SaSoWidth = 3000
   MoFrWidth = 7000
   
   dim counterX as integer
   counterX = 0   
   myDoc = thisComponent
   with myDoc.sheets(0)
   
	do until .getCellByPosition(counterX,0).string = ""
		if .getCellByPosition(counterX,0).string = "a" then
			.Columns(counterX).Width = SaSoWidth
		else
			.Columns(counterX).Width = MoFrWidth      
		End If
		counterX = counterX + 1
	Loop
	.getCellByPosition(counterX,0).string = "Ende"
	end with   
end sub
Gruß Karo

Re: Benötige Hilfe bei Makro-Programmierung für Calc

Verfasst: Do, 14.10.2010 15:44
von Thaver2Theta
Danke für eure Hilfe.

Mein Makro funktioniert jetzt. Wenn ich es ausführe, so wird jeder Arbeitstag (Mo,Die,Mi,Do,Fr) die Zellbreite 6.9cm zu gewiesen sowie den Tagen am Wochenende eine Breite von 3cm. Das Makro bricht automatisch ab, wenn kein Wochentag mehr als Zellinhalt gegeben ist (sprich der Kalender zu Ende ist)

Vielleicht gibt es andere, die auch Hilfestellungen bei Makro-Programmierung suchen, daher hier der Basic-Text/Code:

Code: Alles auswählen

Sub SpaltenBreiteV09
	dim SaSoWidth as integer
	dim MoFrWidth as integer
    SaSoWidth = 3000
	MoFrWidth = 6900
	
	dim counterX as integer
	counterX = 0
	dim CellString as String	
	CellString = "faleNtrue"
	
	myDoc = thisComponent
	mySheet = myDoc.sheets(0)
	myCell = mysheet.getCellByPosition(counterX,0)
	CellString = mycell.String
	
	do while CellString <> ""
		
		myCell = mysheet.getCellByPosition(counterX,0)
		CellString = mycell.String
		if CellString = "Samstag" OR  CellString = "Sonntag" then
		mySheet.Columns(counterX).Width = SaSoWidth
		elseif CellString = "Montag" OR CellString = "Dienstag" OR CellString = "Mittwoch" OR CellString = "Donnerstag" OR CellString = "Freitag" then
		mySheet.Columns(counterX).Width = MoFrWidth
		else
		EndIf
		counterX = counterX + 1
    Loop	
end sub
Im PDF-Export werden an die 50 Seiten (je Seite eine Woche mit 7 Tagen) wunderbar ausgedruckt. Hatte erst mit Excel versucht den Kalender zu erstellen, jedoch hatte ich da keine Lust die Zellen in Zoll, PX auf cm um zu rechnen. OO kann vorne rein automatisch mit der Maßeinheit in cm umgehen, was ja auch viel benutzerfreundlich ist. Verstehe nicht, warum MS daraus so eine Schikane macht.

Ehrlich gesagt fällt mir das klassische Menüfürhung im OO calc viel leichter zu bedienen als im MS Office 2007/2010. Das ist doch ein Grund 00 vermehrt zu benutzen.