Seite 1 von 2

Button für +1 bzw. clear erstellen

Verfasst: Mi, 18.06.2008 10:22
von WorstCases
Hallo Leute,

nachdem ich hier im Forum ja schon super viel Hilfe in einem anderen Thread bekommen habe, kann ich es nicht lassen...
Heute beschäftigt mich ein neues Thema:

Ich würde gerne in einer Tabelle 2 Butons erstellen
Einen Button, der mir den Wert eines bestimmten Feldes um +1 erhöht (Zahlenfeld)
Einen Button, der mir den Inhalt eines bestimmten Feldes zurücksetzt auf "0" bzw einfach löscht.

Gibt es dafür in Calc eine Möglichkeit?

Gruß.
WorstCases

Re: Button für +1 bzw. clear erstellen

Verfasst: Mi, 18.06.2008 13:50
von Karolus
Hallo

Du benötigst 2 Schaltflächen (-->Ansicht-->Symbolleiste-->Formularsteuerelemente)
Diese verknüpfst du über -->Rechtsklick-->Kontrollfeld-->Ereignisse-->beim Auslösen
mit jeweils einem der folgenden Makros:

Code: Alles auswählen

Sub plus_eins
'erhöht den Wert von Tabelle1.A1 um 1
thisComponent.sheets().getbyname("Tabelle1").getcellrangebyname("A1").value =_
thisComponent.sheets().getbyname("Tabelle1").getcellrangebyname("A1").value + 1
End Sub

Sub reset
'leert Tabelle1.A1
thisComponent.sheets().getbyname("Tabelle1").getcellrangebyname("A1").string = ""
end sub
im Kapitel "Quelltext übernehmen" gibts Informationen zur Installation der Makros.

Gruß Karo

Re: Button für +1 bzw. clear erstellen

Verfasst: Mi, 18.06.2008 19:13
von WorstCases
Danke für den Tipp - das sieht soweit ja vielversprechend aus.

Aber: Ich möchte diesen "+1" bzw clear-Button gerne für ca. 50+ Felder benutzen. Muss ich da für jeden Button ein eigenes Makro schreiben (wegen dem Feld, dass mit dem Button verändert werden soll)?
Was passiert, wenn das Makro als Position z.B. A1 hat und ich füge zusätzliche Spalten/Reihen davor ein? Ist das Makro und der Button dann funktionsunfähig?
Ach und noch eine Frage zu dem Code bzgl Feld leeren (clear). Angenommen, ich möchte das Feld nicht leeren, sondern auf Null "0" setzen, würde der Code dann so aussehen?

Code: Alles auswählen

Sub Null
'stzt den Wert von Tabelle1.A1 auf Null zurück
thisComponent.sheets().getbyname("Tabelle1").getcellrangebyname("A1").value =""
End Sub
Gruß.
WorstCases

Re: Button für +1 bzw. clear erstellen

Verfasst: Mi, 18.06.2008 21:09
von turtle47
Hi WorstCases,
WorstCases hat geschrieben:Aber: Ich möchte diesen "+1" bzw clear-Button gerne für ca. 50+ Felder benutzen. Muss ich da für jeden Button ein eigenes Makro schreiben (wegen dem Feld, dass mit dem Button verändert werden soll)?
Nicht unbedingt.
WorstCases hat geschrieben:Was passiert, wenn das Makro als Position z.B. A1 hat und ich füge zusätzliche Spalten/Reihen davor ein? Ist das Makro und der Button dann funktionsunfähig?
Ja, aber es bezieht sich immer noch auf die Zelle "A1".

Folgender Code bezieht sich immer auf die Zelle(n) die selektiert ist/sind:

Code: Alles auswählen

Sub plus_eins
	oDoc = ThisComponent
	If Not oDoc.supportsService _
	("com.sun.star.sheet.SpreadsheetDocument" ) then
	MsgBox "Das ist ein kein Calc-Dokument! Die Anwendung kann deshalb nicht ausgeführt werden! " , 16 , "plus_eins"
	Exit Sub
	end if
	if End_Row > 65534 then
	msgbox "Ganze Spalten markieren ist nicht möglich!" & CHR(13) & "Der Vorgeng wird jetzt abgebrochen!",,"plus_eins"
	end if
	oSheet = ThisComponent.CurrentController.getActiveSheet()
	oZell = oDoc.getCurrentSelection()
	oZell.supportsService("com.sun.star.sheet.SheetCellRange")
	oSelect=ThisComponent.CurrentSelection.getRangeAddress
	oSelectColumn=ThisComponent.CurrentSelection.Columns
	oSelectRow=ThisComponent.CurrentSelection.Rows
	CountColumn=oSelectColumn.getCount
	CountRow=oSelectRow.getCount
	Start_Column=oSelect.StartColumn
	End_Column=oSelect.EndColumn
	Start_Row =oSelect.StartRow
	End_Row=oSelect.EndRow
	if End_Row > 65534 then
	msgbox "Ganze Spalten markieren ist nicht möglich!" & CHR(13) &_
	"Der Vorgang wird jetzt abgebrochen!",,"plus_eins"
	exit sub
	end if
	For sp = Start_Column to End_Column
	For ze = Start_Row to End_Row
	oCell = oSheet.getCellByPosition(sp,ze)
	myvalue = oCell.value
	myvalue = myValue +1
	ocell.value = myValue
	next ze
	next sp
	msgbox "Der Vorgang ist abgeschlossen" ,64, "plus_eins"
End Sub
Für den Reset nimm folgenden Code:

Code: Alles auswählen

Sub reset
	oDoc = ThisComponent
	If Not oDoc.supportsService _
	("com.sun.star.sheet.SpreadsheetDocument" ) then
	MsgBox "Das ist ein kein Calc-Dokument! Die Anwendung kann deshalb nicht ausgeführt werden! " , 16 , "plus_eins"
	Exit Sub
	end if
	if End_Row > 65534 then
	msgbox "Ganze Spalten markieren ist nicht möglich!" & CHR(13) & "Der Vorgeng wird jetzt abgebrochen!",,"plus_eins"
	end if
	oSheet = ThisComponent.CurrentController.getActiveSheet()
	oZell = oDoc.getCurrentSelection()
	oZell.supportsService("com.sun.star.sheet.SheetCellRange")
	oSelect=ThisComponent.CurrentSelection.getRangeAddress
	oSelectColumn=ThisComponent.CurrentSelection.Columns
	oSelectRow=ThisComponent.CurrentSelection.Rows
	CountColumn=oSelectColumn.getCount
	CountRow=oSelectRow.getCount
	Start_Column=oSelect.StartColumn
	End_Column=oSelect.EndColumn
	Start_Row =oSelect.StartRow
	End_Row=oSelect.EndRow
	if End_Row > 65534 then
	msgbox "Ganze Spalten markieren ist nicht möglich!" & CHR(13) &_
	"Der Vorgang wird jetzt abgebrochen!",,"plus_eins"
	exit sub
	end if
	For sp = Start_Column to End_Column
	For ze = Start_Row to End_Row
	oCell = oSheet.getCellByPosition(sp,ze)
	ocell.value = 0
	next ze
	next sp
	msgbox "Der Vorgang ist abgeschlossen" ,64, "plus_eins"
End Sub
Ist es das was Du Dir vorstellst?

Jürgn

Re: Button für +1 bzw. clear erstellen

Verfasst: Mi, 18.06.2008 21:46
von WorstCases
@turtle47

Dein Code (der obere) ist interessant, aber nicht genau das, was ich brauche. Den unteren verstehe ich nicht so ganz. Vor allen, weil Du schreibst: Obere Code für selektierte Zellen, unterer Code für den Rest. Was meinst Du mit dem Rest.

Ich habe mal einen Screenshot angefügt, der verdeutlichen soll, was ich vorhabe. Vielleicht kann mir dann jemand einen Tipp eben.
Mein Problem ist, dass ich die Tabelle mit Sicherheit noch oft ändern/erweitern werde. Daher kann ich mit einem Makro, das auf eine spezielle Spalte und Zeile je Button festgelegt ist wenig anfangen. Ich kann ja nicht jedes Mal die Makros für die Buttons umprogrammieren, wenn ich Spalten oder Zeilen zur Tabelle hinzufüge.

Hier mal ein Screenshot meines Vorhabens:
Ich habe die Buttons mit einem Malprogramm nur mal zur Veranschaulichung eingefügt. Das sind (noch) keine Buttons aus Calc!

Re: Button für +1 bzw. clear erstellen

Verfasst: Mi, 18.06.2008 22:12
von turtle47
Hallo WorstCases,
WorstCases hat geschrieben:Was meinst Du mit dem Rest.
Sorry, das sollte Reset heissen. :oops:
WorstCases hat geschrieben:Hier mal ein Screenshot meines Vorhabens:
Ein Bild sagt mehr als tausend Worte bestätigt sich immer wieder. :D

Dazu habe ich mal ein Beispiel erstellt.
Unter Ansicht > Symbolleisten > Formular-Steuerlemente findest Du das
Steuerelement "Drehfeld" was ich hier verwendet habe.
Drehfeld.ods
(9.15 KiB) 1010-mal heruntergeladen
Sind wir damit einen Schritt weiter?

Jürgen

Re: Button für +1 bzw. clear erstellen

Verfasst: Do, 19.06.2008 11:54
von WorstCases
Ja, damit sind wir definitiv einen Schritt weriter.

Kann man das auch so ungefähr realisieren (siehe Bild)?
Die Änderung habe ich nur grafisch gemacht, nicht in Calc. Ich möchte nach Möglichkeit so wenig Platz wie möglich verbrauchen, damit das ganze übersichtlich bleibt.

Ich habe mal versucht, den Code von dem Makro zu verstehen - leider mit mässigem Erfolg. Wie wird jetzt das Drehfeld einem Feld auf dem Tabellenblatt zugeordnet...?

Gruß.
WorstCases

Re: Button für +1 bzw. clear erstellen

Verfasst: Do, 19.06.2008 12:04
von turtle47
Hi WorstCases,

der Makrocode wird in diesem Fall nicht benötigt, kann also entfernt werden.
Der war noch aus den ersten Versuchen in der Tabelle drin.
WorstCases hat geschrieben:Wie wird jetzt das Drehfeld einem Feld auf dem Tabellenblatt zugeordnet...?
In der Formular-Steuerelemente Sybolleiste den Entwurfsmodus zuerst einschalten.
Das ist das Symbol mit dem Dreieck/Lineal/Bleistift.
Dann das Drehfeld auf dem Tabellenblatt markieren und dann Rechtsklick > Kontextmenue > Kontrollfeld > Reiter "Daten"

Dort kannst Du die Verknüpfte Zelle eintragen.


Viel Erfolg.

Jürgen

Re: Button für +1 bzw. clear erstellen

Verfasst: Do, 19.06.2008 12:33
von WorstCases
OK - So weit, so gut. Jetzt habe ich ein Drehfeld, mit dem ich den Wert entweder um "+1" erhöhen bzw um "-1" veringern kann.

Das ich ein großer Schritt ;-).

Ist ein Drehfeld denn die einzige Möglichkeit. Bei dieser Lösung habe ich vier Schaltflächen, benötige aber nur 2 ("+1" und "auf 0").

Gruß. WorstCases

Re: Button für +1 bzw. clear erstellen

Verfasst: Do, 19.06.2008 13:25
von turtle47
1. WorstCases hat geschrieben:Bei dieser Lösung habe ich vier Schaltflächen, benötige aber nur 2 ("+1" und "auf 0").[/q[ote]
2. WorstCases hat geschrieben:Daher kann ich mit einem Makro, das auf eine spezielle Spalte und Zeile je Button festgelegt ist wenig anfangen. Ich kann ja nicht jedes Mal die Makros für die Buttons umprogrammieren, wenn ich Spalten oder Zeilen zur Tabelle hinzufüge.[/[uote]
3. WorstCases hat geschrieben:Muss ich da für jeden Button ein eigenes Makro schreiben (wegen dem Feld, dass mit dem Button verändert werden soll)?[/[uote]
Zu letztem hatte ich Dir schon eine Lösung angeboten:[[uote="turtle47"]Folgender Code bezieht sich immer auf die Zelle(n) die selektiert ist/sind:
Zu Punkt 2 gibt es noch eine andere Möglichkeit. Du gibst den Zellen einen Namen und dann sprichst Du im Code die Zelle über den Namen an. So kannst Du in der Tabelle rumfuhrwerken wie Du willst, also Spalten und Zeilen einfügen oder löschen wie Du willst, der Bezug zu der Zelle ist immer eindeutig über den Namen gegeben.

Code: Alles auswählen

Sub plus_eins_Zelle1
'erhöht den Wert von Tabelle1.A1 um 1
thisComponent.sheets().getbyname("Tabelle1").getcellrangebyname("Zelle1").value =_
thisComponent.sheets().getbyname("Tabelle1").getcellrangebyname("Zelle1").value + 1
End Sub

Sub reset_Zelle1
'leert Tabelle1.A1
thisComponent.sheets().getbyname("Tabelle1").getcellrangebyname("Zelle1").value = 0
end sub[
In Diesem Fall hat die angesprochene Zelle den Namen "Zelle1".
Dafür musst Du aber für jede Zelle zwei eigene Makros erstellen. :lol:

WorstCases, irgendwie musst Du einen Kompromiss finden.

Re: Button für +1 bzw. clear erstellen

Verfasst: Do, 19.06.2008 14:03
von WorstCases
Naja, dann muss ich halt in den sauren Apfel beissen und für jede Zelle zwei Markos erstellen.
Das macht zwar einmal arbeit, finde ich jetzt aber nicht mehr soo tragisch, weil Du mir folgendes gesagt hast:
Du gibst den Zellen einen Namen und dann sprichst Du im Code die Zelle über den Namen an. So kannst Du in der Tabelle rumfuhrwerken wie Du willst, also Spalten und Zeilen einfügen oder löschen wie Du willst, der Bezug zu der Zelle ist immer eindeutig über den Namen gegeben.
Sorry für die vielleicht dumme Frage: Aber wie gebe ich einer Zelle einen festen namen? Konnte diese Möglichkeit (noch) nicht finden...

Re: Button für +1 bzw. clear erstellen

Verfasst: Do, 19.06.2008 14:07
von turtle47
Zelle auswählen und dann Menue > Einfügen > Namen > Festlegen........... :D

Re: Button für +1 bzw. clear erstellen

Verfasst: Do, 19.06.2008 15:44
von WorstCases
Cool! Das funktioniert soweit.

Jetzt ergibt sich aber eine neue Frage:
Wenn ich dann alle Buttons fertig habe, sagen wir auf Tabellenblatt01. Nun möchte ich in Zukunft dieses Blatt einmal kopieren, sagen wir, die Kopie heisst Tabellenblatt2. Dann würden in diesem Blatt ja die Makros auch wieder nicht funktionieren...
Gibt es da auch einen Work-Around, oder muss ich damit leben, dass ich dann ohne größeren Aufwand nur das ursprüngliche-Blatt benutzen kann?

Gruß.
WorstCases

Re: Button für +1 bzw. clear erstellen

Verfasst: Do, 19.06.2008 17:11
von turtle47
In der IDE kannst Du über Menue > Bearbeiten > Suchen&ersetzen.... den Tabellennamen ruckzuck austauschen. :D

Aber das nützt in diesem Fall nichts, wenn das Blatt kopiert ist, dann ist der Zellname "Zelle1" ja noch auf dem Ursprungsblatt.
Zellnamen kann man innerhalb eines Dokuments aber nur einmal vergeben :( was ja auch logisch ist.

Re: Button für +1 bzw. clear erstellen

Verfasst: Do, 19.06.2008 22:24
von WorstCases
Ja, ist logisch. Ich hab beim experimentieren is Dato immer einen gewissen Stand einfach innerhalb des Dokumentes in eine neue Tabelle kopiert. Ab jetzt speichere ich es dann einfach unter einem anden Dateinamen.

Aber ich hänge jetzt im Makro-Manager.
Irgendwie komme ich nicht zurecht. Ich bin in meinem Dokument, Module1 und sehe mein Erstes Makro.
So weit, so gut - siehe Bild.
Allerdings finde ich keinen Weg ein zweites Makro innerhalb dieses Molues zu erstellen. Was mache ich fasch? Es braucht doch nicht jedes Makro ein eigenes Modul, oder?