Wie heißt ein Makro für "wenn A <> B dann C=C+1&q

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Wie heißt ein Makro für "wenn A <> B dann C=C+1&q

Beitrag von erikafuchs »

Hallo zusammen,

ich bin Mathelehrer und habe ein Calc Datei gebastelt, in der meine Schüler alle möglichen Aufgaben aus der Mathematik üben können. In Excel funktioniert das schon ganz gut. Ich möchte jetzt aber in der Schule langsam auf Open Office umstellen und habe allen Schülern empfohlen dieses Programmpaket zu installieren. Jetzt sind schon meine Fähigkeiten in der Makroprogrammierung für VBA recht schwacch, in StarBasic sind sie noch nicht existent. Da ich jetzt nicht "StarBasic leichtgemacht in 40 Tagen" durcharbeiten möchte, suche ich jemanden, der mir beim ersten Schritt hilft und obenstehender Frage beantworten kann. Meistens sind meine Tabellenseiten so aufgebaut, dass z.B. in den Spalte A bis C Aufgaben stehen, in der Spalte D ein Fragezeichen steht, dort muss der Schüler das richtige Ergebnis eingeben, in Spalte E steht (natürlich verdeckt) die richtige Lösung. In Spalte F werden die richtigen Lösungen gezählt und in Spalte G sollen mit Hilfe eines Makros die Falscheingaben gezählt werden - das kann ich jetzt nicht. Diese Falscheingaben müssen natürlich stehen bleiben wenn der Schüler die Eingabe verbessert (Ob sein Ergebnis stimmt oder nicht, wird ihm durch ein Einfärbung des Ergebnisfeldes signalisiert).

Also wer kann mir sagen wie ein Makro heißt das die Eingabe in z.B. D3:D10 mit den Eintragungen in E4:E10 vergleicht und in G4:G10 einen Zähler um Eins hochsetzt wenn D(x) <> E(x).

Meine Schüler und ich wären euch sehr dankbar

Gruß Pit

(Problem findet sich schon mal weiter unten in der Themenliste)
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Also wer kann mir sagen wie ein Makro heißt das die Eingabe in z.B. D3:D10 mit den Eintragungen in E4:E10 vergleicht und in G4:G10 einen Zähler um Eins hochsetzt wenn D(x) <> E(x).
das hier würde es tun:

Code: Alles auswählen

Sub Main
blatt = ThisComponent.currentcontroller.activeSheet.Name
x = ThisComponent.Sheets().getByName(blatt)
For i = 2 To 9
	If x.getCellByPosition(3,i).Value <> x.getCellByPosition(4,i).Value Then
			x.getCellByPosition(6,i).Value = x.getCellByPosition(6,i-1).Value+1
		Else
			x.getCellByPosition(6,i).Value = x.getCellByPosition(6,i-1).Value
	End If
Next i
End Sub
eigentlich ist ein Makro garnicht nötig, da es auch reicht in G3 zu schreiben:

Code: Alles auswählen

=WENN(D3=E3;G2;G2+1)
und bis G10 runterzuziehen.


Nötig wäre aber etwas Überlegung denn was soll denn:
in Spalte E steht (natürlich verdeckt)
bewirken - praktisch doch garnichts, da jeder Schüler, auch mit Null Ahnung von Mathematik, jederzeit in eine beliebige Spalte in Zeile 3 schreiben kann:
und das runterziehen bis Zeile 10 und somit das Ergebnis kennt.
Oder was übersehe ich?



Gruß
Stephan
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Beitrag von erikafuchs »

Lieber Stephan,

vielen Dank erstmal - da hätte ich schon mal ein Grundgerüst. Da ich ziemlich viele verschiedene Tabellen habe und der Aufbau der Aufgaben nicht immer gleich ist, ist die For ... next Schleife nicht so komfortabel. Ich wollte eigentlich alle Zellen schützen und nur in Ergebnisfeldern Eingaben erlauben - wie heißt den das Makro, wenn man es immer auf die aktive Zelle anwendet und dann mit der Zelle rechts daneben vergleicht und in die übernächste einträgt?

Dein Vorschlag "=WENN(D3=E3;G2;G2+1)" habe ich schon ausprobiert, leider kann man mit einer Formel nicht in eine Zelle schreiben. Außerdem würde der Wert zurückgesetzt, wenn der Schüler sein Ergebnis verbessert, der Zähler soll aber alle Falscheingaben zählen.

Um das richtige Ergebnis auf einer geschützten Tabelle auszulesen müsste man wissen wo es steht - erstens sind meine Schüler nicht so fit, zweitens wollen sie ja selbst ihre Fähigkeiten verbessern und drittens gibt es sicher auch da noch eine Möglichkeit wie man diesen Trick verhindert

Grüße
Pit
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

wie heißt den das Makro, wenn man es immer auf die aktive Zelle anwendet und dann mit der Zelle rechts daneben vergleicht und in die übernächste einträgt?
...
der Zähler soll aber alle Falscheingaben zählen.

Code: Alles auswählen

Sub Main
akt =  ThisComponent.getCurrentSelection
If akt.supportsService("com.sun.star.sheet.SheetCell") then
	blatt = akt.SpreadSheet.Name
	zeile = akt.getCellAddress.Row
	spalte = akt.getCellAddress.Column
	If akt.Value <> ThisComponent.Sheets().GetByName(blatt).getCellByPosition(spalte + 1, zeile).Value Then
		ThisComponent.Sheets().GetByName(blatt).getCellByPosition(spalte + 3, zeile).Value = _
			ThisComponent.Sheets().GetByName(blatt).getCellByPosition(spalte + 3, zeile).Value + 1
	End If
End if
End Sub



Gruß
Stephan
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Beitrag von erikafuchs »

Danke!

Das dauert jetzt sicher etwas, bis ich weiß, wie man das einbaut - dann melde ich mich wieder!

Grüße
Pit
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Beitrag von erikafuchs »

So, da bin ich wieder!

Ich hatte ja gesagt, dass ich parallel auch an einer Excel Version bastele - das ich für mich erstmal einfacher. Die funktioniert auch schon ganz gut. Im Endeffekt will ich aber eine Calc Version. Lieber Stefan, ich habe jetzt mal deine Version ausprobiert - dieses Makro überprüft jetzt aber immer nur wenn es aufgerufen wird die jeweiligen Eintragungen in den einzelnen Zellen. Das Makro muss aber so aufgebaut sein, dass es immer im Hintergrund läuft und bei Eingabe eines Ergebnisses in eine dafür vorgesehene Zelle jeweils in Funktion tritt. Kann mir da jemand weiterhelfen?

Grüße
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Das Makro muss aber so aufgebaut sein, dass es immer im Hintergrund läuft und bei Eingabe eines Ergebnisses in eine dafür vorgesehene Zelle jeweils in Funktion tritt.


Dann mußt Du den Code um einen sog. Listener ergänzen. Insgesamt gibt das:

Code: Alles auswählen

Global oListener As Object
Global ocell as object

Sub addlistener
ocell=thiscomponent.sheets().GetByName("Tabelle1").getcellrangebyname("D1:D10")
oListener = CreateUnoListener( "MyApp_", "com.sun.star.util.XModifyListener" )
ocell.addmodifylistener(olistener)
End Sub

Sub Remove_Listener
On Error Resume Next
ocell.removemodifyListener(oListener)
End Sub


Sub MyApp_Modified(oEvent)
Main()
End Sub

Sub Main 
akt =  ThisComponent.getCurrentSelection 
If akt.supportsService("com.sun.star.sheet.SheetCell") then 
   blatt = akt.SpreadSheet.Name 
   zeile = akt.getCellAddress.Row 
   spalte = akt.getCellAddress.Column 
   If akt.Value <> ThisComponent.Sheets().GetByName(blatt).getCellByPosition(spalte + 1, zeile).Value Then 
      ThisComponent.Sheets().GetByName(blatt).getCellByPosition(spalte + 3, zeile).Value =_
      ThisComponent.Sheets().GetByName(blatt).getCellByPosition(spalte + 3, zeile).Value + 1 
   End If 
End if 
End Sub

Damit das Ganze funktioniert mußt Du diese Zeile:

Code: Alles auswählen

ocell=thiscomponent.sheets().GetByName("Tabelle1").getcellrangebyname("D1:D10")
so anpassen das der Name des zu betrachtenden Tabellenblattes (statt "Tabelle1") drinsteht und der Zellbereich indem die Eingaben kontrolliert werden sollen (statt D1:D10)


Danach starte Sub addlistener und dann läuft in Folge alles wie gewünscht automatisch.

Wenn es automatisch sein soll gehe zu Extras-Anpassen Register Ereignisse und weise dem Ereignis "Dokument öffnen" das Makro Sub addlistener zu und dem Ereignis "Dokument schliessen" das Makro Sub Remove_Listener



Gruß
Stephan
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Beitrag von erikafuchs »

Lieber Stephan,

vielen Dank für die Mühe erstmal! Das sieht doch schon ganz gut aus, leider sieht das aber auch ziemlich anders aus als VBA.

Ich lerne ja lieber eine Programmsprache am praktische Objekt als mit Buch ab Kapitel 1 ("Hallo" am Bildschirm ausgeben). Leider benötigt man da immer jemanden der einem über die Hürden hilft. So bringe ich das noch nicht zum Laufen. Wo muss das Makro denn hin? Ich habe mehrere Tabellenblätter ("Übersicht", "5_Sj", "6_Sj" ... ). Wenn ich die Makrobearbeitung öffne habe ich jetzt: "Diese Arbeitsmappe", "Modul1", "Tabelle1", "Tabelle2" ... Wenn ich das Makro in "Diese Arbeitsmappe" packe, mag Calc das "Global" nicht und das "+" das den Wert in der Rechenfehlerzählspalte raufsetzen soll ist für Calc ein "unerwartetes Zeichen".

... ich fürchte, meine Fragen zeigen, dass ich noch ein totaler Anfänger bin. Sagt Ihr jetzt ich solle doch bei Kapitel 1 ("Hallo" ausdrucken) anfangen? Na, ja, die Makros in VBA habe ich aber auch hinbekommen.

Ich will gleich mal sagen wie es dann noch weitergeht:

Die verschiedenen Tabellenblätter sind recht ähnlich, nur die Eingabefelder und Zählfelder liegen an verschiedenen Stellen. Ich brauche aber noch eine Seite auf der nach bestimmten Regeln eine Menge Zufallszahlen erzeugt werden damit die Schüler immer verschiedene Zahlen zum Rechnen haben. Dann brauche ich noch einen Startknopf, der die Zufallszahlen erzeugt und den Namen des Schülers/der Schülerin sowie Datum und Uhrezeit auf dem Übersichtsblatt einträgt.

Mit meinem Excel Programm können die Schüler in der Schule ja schon arbeiten, ich hätte jetzt aber gerne, dass sie zu Hause mit Calc arbeiten können. Außerdem will ich eigentlich langsam dafür sorgen, dass wir in der Schule langsam von MS auf OO umstellen.

Helft Ihr mir da weiter? Ich gebe das Programm dann auch gerne weiter, ich denke, das kann vielen Schülern helfen.

Noch was: Auf den Makroseiten (wie heißen die eigentlich) steht jeweils oben "Option VBASupport 1" und "Sub Tabelle1", ich nehme an, das kommt daher, dass ich die Arbeitsmappe aus Excel importiert habe, soll ich das löschen?

Grüße
Pit
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Beitrag von erikafuchs »

Da bin ich nochmal,

zwei Sachen habe ich zum Laufen bekommen:

das "global" ging nicht, weil darüber noch ein sub Befehl stehen geblieben ist und das + geht jetzt, wenn ich den Unterstrich aus der untenstehenden Zeile entferne und eine Zeile daraus mache

ThisComponent.Sheets().GetByName(blatt).getCellByPosition(spalte + 3, zeile).Value = _ ThisComponent.Sheets().GetByName(blatt).getCellByPosition(spalte + 3, zeile).Value + 1

Aber jetzt noch mal meine Frage: Ich habe ja mehrere Tabellenblätter mit verschiedenen Bereichen, muss ich jetzt die Routine "addlistener" (mit der angepassten Angabe der Zellbereiche), sowie die Routinen "MyApp_Modified(oEvent)" und "Main" jeweils angepasst in alle Tabellenblätter kopieren oder muss ich die für die ganze Arbeitsmappe festlegen?

Grüße
Pit
Antworten