Bedingte Formatierung oder kompliziertes Makro.....

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

Moderator: Moderatoren

Paule
****
Beiträge: 113
Registriert: Do, 22.09.2005 16:26
Wohnort: Schleswig

Bedingte Formatierung oder kompliziertes Makro.....

Beitrag von Paule »

Hallo

ich habe ein kleines riesen Problem.
Es geht um eine Liste in der Kosten erfasst werden. Vorhanden sind 5 Kostenfelder pro Monat : sonstige Kosten netto, sonstige Kosten brutto , Nettekosten, Bruttokosten, Gesamtkosten.
Es soll möglich sein in der einer nettoZelle ein Betrag einzusetzen der umgerechnet wird in brutto (logisch). Soweit ganz einfach.
Nun soll es aber auch möglich sein in eine BruttoZelle was einzufügen und die umrechnen -> netto.
Wann brutto oder netto engesetzt wird ist variabel - normale formeln kommen also nicht in Frage.

Mein erster Lösungsansatz war ein Makro.
(hier der code für Januar:

Code: Alles auswählen

sub restrechner
osheet = thiscomponent.sheets.getbyname("Festtelefonie")
for i = 2 to 65535
	
	ozelle = osheet.getcellbyposition(3,i)
		If ozelle.string = "" then
		gosub ende1a else
		
			ozelle1jan = osheet.getcellbyposition(7,i)
			If ozelle1jan.value = 0 then			
			ozelle2jan = osheet.getcellbyposition(8,i)
			svalue = ozelle2jan.value /116*100
			ozelle1jan = osheet.getcellbyposition(7,i)
			ozelle1jan.value = svalue 
			end if			
				
			ozelle3jan = osheet.getcellbyposition(8,i)
			If ozelle3jan.value = 0 then			
			ozelle4jan = osheet.getcellbyposition(7,i)
			svalue = ozelle4jan.value + ((ozelle4jan.value/100)*16)
			ozelle3jan = osheet.getcellbyposition(8,i)
			ozelle3jan.value = svalue 
			end if

			ozelle5jan = osheet.getcellbyposition(9,i)
			If ozelle5jan.value = 0 then			
			ozelle6jan = osheet.getcellbyposition(10,i)
			svalue = ozelle6jan.value /116*100
			ozelle5jan = osheet.getcellbyposition(9,i)
			ozelle5jan.value = svalue 
			end if			
				
			ozelle7jan = osheet.getcellbyposition(10,i)
			If ozelle7jan.value = 0 then			
			ozelle8jan = osheet.getcellbyposition(9,i)
			svalue = ozelle8jan.value + ((ozelle8jan.value/100)*16)
			ozelle7jan = osheet.getcellbyposition(10,i)
			ozelle7jan.value = svalue 
			end if
			

		
		end if
next
ende1a:
end sub
der funktioniert auch, aber es ist immer erforderlich das nach einer eingabe(oder nach allen) das Makro ausgelöst werden muss. <- das soll nun nicht so sein, das Ergebnis muss sofort erscheinen. Jemand ne Idee??


mein Zweiter Lösungsansatz ging über die bedingte formatierung - damit kenn ich mich nicht so gut aus - jedoch habe ich nicht herausgefunden wie ich die bedingte Formatierung mit meiner formel versehe ( schießlich handelt es sich um Formate und nicht Formeln :? )

Ich hatte allerdings vor einiger Zeit hier ein Interessantes Makro / bedingte formatierung gefunden und zwar :

Code: Alles auswählen

Global vSelChangeListener
Global vSelChangeBroadCast
Global altezeile

Sub StartListeningToSelChangeEvents
  Dim sPrefix$
  Dim sService$
  sPrefix = "sel_change_"
  sService = "com.sun.star.view.XSelectionChangeListener"
 
  vSelChangeBroadCast = ThisComponent.getCurrentController
  vSelChangeListener = CreateUnoListener(sPrefix, sService)
  vSelChangeBroadCast.addSelectionChangeListener(vSelChangeListener)
End Sub

Sub StopListeningToSelChangeEvents
  vSelChangeBroadCast.removeSelectionChangeListener(vSelChangeListener)
End Sub

Sub sel_change_selectionChanged(vEvent)
  Dim vCurrentSelection As Object
  
  vCurrentSelection =  vEvent.source
  thiscomponent.sheets(0).getcellbyposition(255,altezeile).string=""
  zeile=thiscomponent.getcurrentselection().getrangeaddress().startrow
  thiscomponent.sheets(0).getcellbyposition(255,zeile).string="X"
  altezeile=zeile

  rem --------hab ich frech drangehängt----------------------------

  osheet = thiscomponent.sheets.getbyname("Festtelefonie")
  ozelle = osheet.getcellbyposition(7,altezeile)
  if ozelle.value = 0 then
  ozelle2 = osheet.getcellbyposition(8,altezeile)
 ozelle.value = ozelle2.value/116  *100
end if			
End Sub

das bewirkt nur eigentlich nur (ohne mein "anhang" :) ) das die am ende der Zeile der angesprochenden Zelle ein X steht. (mit bedingter Formatierung werden die zellen eingefärbt...(super Spielzeug! 8) ).

Mein "drangehängtes" ist nur für 1 Spalte im Januar.
Das klappt jedoch wird es ja dann ausgeführt wenn ich in die zeile klicke und nicht wenn ich diese verlasse.



Danke fürs Kopzerbrechen

Paule
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Paule,

Ein Blick auf den Code "läßt mich schaudern" :wink:

Warum? na ja, eine Schleife über 65535 Zeilen? so viel Rechenaufwanfd für so wenig Effekt?

Aber ok, der Ansatz ist doch schon sehr gut. Du hast das Problem erst einmal gelöst.
aber es ist immer erforderlich das nach einer eingabe(oder nach allen) das Makro ausgelöst werden muss. <- das soll nun nicht so sein, das Ergebnis muss sofort erscheinen. Jemand ne Idee??
Du könntest das über einen Listener lösen, der auf Zelleingaben "hört" und beim Verlassen der Zelle das Makro startet. Der Start des "Listeners" würde enbenfalls über ein Makro geschehen, das mit dem Öffnen des Dokumentes verknüpft ist. Ein solches Beispiel (für einen Listener, der auch Eingaben in Calc-Zellen reagiert) findest du irgendwo im Forum. War schon mal Thema. (P.S.: dein zweites Beispiel ist ja ein Listener - genau so etwas brauchst du...)

Aber: Denk mal über einen anderen Weg nach: Erzeugen einer einfachen Eingabemaske, auslesen der Daten und Eintragen in die entsprechenden Spalten per Makro. Das würde viel Rechenaufwand "sparen", die Makros könnten effektiver laufen und alles wäre viel schicker?
So würde ich es jedenfalls machen.

Ein Beispiel: Lade dir das "Fahrtenbuch" Beispiel von -> hier, das ist gut dokumentiert und zeigt die jeweiligen Zugriffe.

Bedingte Formatierung brivcgt dich nicht weiter - du willst ja keine Formate ändern, oder?

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Paule
****
Beiträge: 113
Registriert: Do, 22.09.2005 16:26
Wohnort: Schleswig

Beitrag von Paule »

hallo thomas

1.
Ein Beispiel: Lade dir das "Fahrtenbuch" Beispiel von -> hier , das ist gut dokumentiert und zeigt die jeweiligen Zugriffe.
hab ich schon lange :D
Ist toll!
Erzeugen einer einfachen Eingabemaske, auslesen der Daten und Eintragen in die entsprechenden Spalten per Makro. Das würde viel Rechenaufwand "sparen", die Makros könnten effektiver laufen und alles wäre viel schicker?
So würde ich es jedenfalls machen.
hab ich auch schon, für neue Einträge und Änderungen. Einen Dialog für die kostenerfassung war auch meine erste Idee, jedoch ist das in diesem Fall umkomfortabel.
eine Schleife über 65535 Zeilen? so viel Rechenaufwanfd für so wenig Effekt?
8) Natürlich 65535 Zeilen man muss möglichkeiten voll ausschöpfen.
Der Rechneraufwand spielt keine Rolle die Schleife wird abgebrochen wenn eine "unbenutzte" Zeile im "Visier" :lol: kommt.
Du könntest das über einen Listener lösen, der auf Zelleingaben "hört" und beim Verlassen der Zelle das Makro startet
Habe ich versucht. geht auch (obriger Code)...*g*wie machen?
Antworten