Wie heißt ein Makro für "wenn A <> B dann C=C+1&q
Moderator: Moderatoren
-
- ******
- 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
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)
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)
das hier würde es tun: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).
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
Code: Alles auswählen
=WENN(D3=E3;G2;G2+1)
Nötig wäre aber etwas Überlegung denn was soll denn:
bewirken - praktisch doch garnichts, da jeder Schüler, auch mit Null Ahnung von Mathematik, jederzeit in eine beliebige Spalte in Zeile 3 schreiben kann:in Spalte E steht (natürlich verdeckt)
Code: Alles auswählen
=E3
Oder was übersehe ich?
Gruß
Stephan
-
- ******
- Beiträge: 690
- Registriert: Di, 13.02.2007 17:38
- Wohnort: Büttelborn
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
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
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
-
- ******
- Beiträge: 690
- Registriert: Di, 13.02.2007 17:38
- Wohnort: Büttelborn
-
- ******
- Beiträge: 690
- Registriert: Di, 13.02.2007 17:38
- Wohnort: Büttelborn
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
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
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")
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
-
- ******
- Beiträge: 690
- Registriert: Di, 13.02.2007 17:38
- Wohnort: Büttelborn
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
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
-
- ******
- Beiträge: 690
- Registriert: Di, 13.02.2007 17:38
- Wohnort: Büttelborn
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
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