Hallo puschi,
ich persönlich habe da noch so meine defizite mit ARRAY und FUNCTION, aber dennoch habe ich dir mal was auf die schnelle zusammengeschustert.
Trotzdem interessiert es mich, wie ich das Problem mit einem Makro lösen kann.
Nun, in StarBasic gibt es wahrscheinlich mehrere möglichkeiten wie man das lösen kann. Ich habe mich jetzt mal mit einem mehrdimensionalem ARRAY befasst.
Das heißt:
Punkte VON in ein Array, Punkte BIS in ein Array und die Note in ein drittes ARRAY.
Noch nix verstehen tun von was ich da Quatschen tuen täte?
Nun, dann mal eine ganz simple Erklärung.
Ein Array kanst Du dir als eine Spalte, oder Zeile in einem Tabellenblatt vorstellen. Bleiben wir aber bei Spalte, weil das einfacher zu verstehen und im Makro darstellbar ist.
Also in einer Spalte kannst Du ja z.B. von A1 bis A16 irgendetwas eintragen. Nehmen wir mal Zahlenwerte von 0 bis 46 in variabler Reihenfolge. Damit wäre dann ein eindimensionales ARRAY erstellt.
Nehmen wir jetzt als zweites im Zellbereich von B1 bis B16 die nächsten Eintragungen vor, widerum mit steigenden Zahlenwerten, aber diesmal von 11 bis 50. Und damit hätten wir dann jetzt ein zweidimensionales ARRAY.
Jetzt könntest Du im Tabellenblatt in der Zelle D1 einfach sagen
und schon würde dir der Inhalt aus dem zweidimensionalem ARRAY, also aus B5, ausgegeben. Genau so gut könntest Du dir den Inhalt aus A11 in D1 ausgeben lassen.
Das System verstehst Du ja wohl.
Jetzt fügen wir noch eine dritte Dimension in das mehrdimensionale ARRAY hinzu. Und zwar im Zellbereich von C1 bis C16. Und dort tragen wir die Noten ein, also von 6 bis 1+.
Und schon ist das mehrdimensionale ARRAY fertig.
Hhhmm!?
Und was hat das jetzt alles mit einem Makro zu tun? Und wie kann man das in einem Makro anwenden? Wirst Du dich jetzt sicherlich Fragen.
Nun, das ist eigentlich ganz einfach, wenn man es denn weiß.
In StarBasic kann man mehrere Zeilen in einer Zeile zusammenfassen.
Also als simples Beispiel für mehrere Zeilen.
Und das würde dann in einer Zeile so aussehen.
Das Zauberwort heißt DOPPELPUNKT (:). Damit kann man mehrere Zeilen in einer Zeile zusammenfassen.
Aber man sollte damit schon aufpassen, wie und wann man dieses System anwendet. Denn man kann es auch übertreiben, und anschließend den eigenen Code nicht mehr wirklich sehr gut lesen.
Jedoch für uns kommt dieses System wie gerufen, denn man kann wohl ein einfaches eindimensionales ARRAY ja ganz einfach in mehrere Zeilen untereinander schreiben. Bei drei Dimensionen müssten alle ARRAYs untereinanderstehen, was nicht wirklich übersichtlich ist.
Code: Alles auswählen
sAry(1,1) = "0"
sAry(1,2) = "12"
sAry(2,1) = "11"
sAry(2,2) = "13"
sAry(3,1) = "6"
sAry(3,2) = "5-"
Schwer zu lesen und schwer zu verstehen. Oder!?
Und deshalb nehmen wir den DOPPELPUNKT, und erzeugen so optisch gesehen mehrere Spalten nebeneinander. Das würde dann wie folgt aussehen.
Code: Alles auswählen
sAry(1,1) = "0" : sAry(2,1) = "11" : sAry(3,1) = "6"
sAry(1,2) = "12" : sAry(2,2) = "13" : sAry(3,2) = "5-"
Das erinnert schon ehern an den Vergleich mit einem Tabellenblatt.
Spalte A wäre hier die 1.
Spalte B wäre hier die 2.
Und Zeile 1 ist auch hier die 1, usw.
Das ist jetzt tätsächlich ein Code Ausschnit aus der angehängten Datei. Ich habe wohl die Grunddaten von
mikeleb genommen, habe jedoch eine zusätzliche "Spalte" eingefügt die einen Punkt niedriger liegt als die erste "Spalte". Also sAry(2,1) ist niedriger als sAry(1,2).
Du wirst gleich noch verstehen warum ich das so gemacht habe.
Du hattest mit deinem ganzen *IF... THEN* Konstrukt wohl ein gewisses System aufgebaut, welches sich aber nur sehr schwer lesen und verstehen lässt. Zumindest ist das mein eindruck.
Und deshalb habe ich das ganze etwas vereinfacht, was aber nur auf Grund des mehrdimensionalem ARRAY möglich ist. Einen kleinen Eindruck dieses ARRAY habe ich ja grad eben gezeigt. Im Makro ist dieses aber etwas größer, also so.
Code: Alles auswählen
sAry(1,1) = "0" : sAry(2,1) = "11" : sAry(3,1) = "6"
sAry(1,2) = "12" : sAry(2,2) = "13" : sAry(3,2) = "5-"
sAry(1,3) = "14" : sAry(2,3) = "20" : sAry(3,3) = "5"
sAry(1,4) = "21" : sAry(2,4) = "22" : sAry(3,4) = "5+"
sAry(1,5) = "23" : sAry(2,5) = "24" : sAry(3,5) = "4-"
sAry(1,6) = "25" : sAry(2,6) = "27" : sAry(3,6) = "4"
sAry(1,7) = "28" : sAry(2,7) = "29" : sAry(3,7) = "4+"
sAry(1,8) = "30" : sAry(2,8) = "31" : sAry(3,8) = "3-"
sAry(1,9) = "32" : sAry(2,9) = "33" : sAry(3,9) = "3"
sAry(1,10) = "34" : sAry(2,10) = "35" : sAry(3,10) = "3+"
sAry(1,11) = "36" : sAry(2,11) = "37" : sAry(3,11) = "2-"
sAry(1,12) = "38" : sAry(2,12) = "39" : sAry(3,12) = "2"
sAry(1,13) = "40" : sAry(2,13) = "41" : sAry(3,13) = "2+"
sAry(1,14) = "42" : sAry(2,14) = "43" : sAry(3,14) = "1-"
sAry(1,15) = "44" : sAry(2,15) = "45" : sAry(3,15) = "1"
sAry(1,16) = "46" : sAry(2,16) = "50" : sAry(3,16) = "1+"
Aber es bleibt bei 3 "Spalten", jedoch sind es 16 Zeilen.
Um dir das noch mal zu verdeutlichen welche Ähnlichkeit dieser optische Aufbau mit einem Tabellenblatt hat, nehmen wir mal ein Beispiel.
Im Blatt kann man die Zelle B9 auch anders beschreiben.
Sie ist in der 2. Spalte die 9. Zelle.
Und das jetzt auf dieses ARRAY angwendet, eribt das sAry(2,9). Und der Inhalt davon ist die Zahl 33.
Zelle C14 wäre dann dementsprechend in der 3. Spalte die 14. Zelle, also sAry(3,14) mit dem Inhalt 1-.
So und nun kommen wir zu der Notenabfrage.
da ich ja keine FUNCTION erstellt habe, sondern eine SUB, defeniere ich hier erstmal die Zelle die ausgewertet werden soll.
Und nun kommt die eigentliche vergleichsauswertung.
Code: Alles auswählen
for i = 1 to 16
if oErreichtePunkte.VALUE >= sAry(1,i) AND oErreichtePunkte.VALUE <= sAry(2,i) then
mySheet.getCellRangeByName("B16").STRING = sAry(3,i)
end if
next i
Muss ich denn wirklich noch etwas dazu sagen?
Ja, okay, ich tues.
Es werden alle 16 Zeilen in dem ARRAY nacheinander überprüft ob der zu vergleichende Wert aus der Zelle B14 größer (oder gleich Groß) dem ARRAY in der 1. Spalte UND kleiner (oder gleich Groß) dem ARRAY in der 2. Spalte entspricht. Und wenn das der Fall ist, wird in der Zelle B16 der Inhalt aus dem ARRAY der 3. Spalte eingtragen.
Und hier jetzt der gesamte Code vollständig aufgelistet.
Code: Alles auswählen
Sub Main
myDoc = thisComponent
mySheet = myDoc.sheets(0)
Dim sAry(1 to 3, 1 to 16)
sAry(1,1) = "0" : sAry(2,1) = "11" : sAry(3,1) = "6"
sAry(1,2) = "12" : sAry(2,2) = "13" : sAry(3,2) = "5-"
sAry(1,3) = "14" : sAry(2,3) = "20" : sAry(3,3) = "5"
sAry(1,4) = "21" : sAry(2,4) = "22" : sAry(3,4) = "5+"
sAry(1,5) = "23" : sAry(2,5) = "24" : sAry(3,5) = "4-"
sAry(1,6) = "25" : sAry(2,6) = "27" : sAry(3,6) = "4"
sAry(1,7) = "28" : sAry(2,7) = "29" : sAry(3,7) = "4+"
sAry(1,8) = "30" : sAry(2,8) = "31" : sAry(3,8) = "3-"
sAry(1,9) = "32" : sAry(2,9) = "33" : sAry(3,9) = "3"
sAry(1,10) = "34" : sAry(2,10) = "35" : sAry(3,10) = "3+"
sAry(1,11) = "36" : sAry(2,11) = "37" : sAry(3,11) = "2-"
sAry(1,12) = "38" : sAry(2,12) = "39" : sAry(3,12) = "2"
sAry(1,13) = "40" : sAry(2,13) = "41" : sAry(3,13) = "2+"
sAry(1,14) = "42" : sAry(2,14) = "43" : sAry(3,14) = "1-"
sAry(1,15) = "44" : sAry(2,15) = "45" : sAry(3,15) = "1"
sAry(1,16) = "46" : sAry(2,16) = "50" : sAry(3,16) = "1+"
oErreichtePunkte = mySheet.getCellRangeByName("B14")
for i = 1 to 16
if oErreichtePunkte.VALUE >= sAry(1,i) AND oErreichtePunkte.VALUE <= sAry(2,i) then
mySheet.getCellRangeByName("B16").STRING = sAry(3,i)
end if
next i
End Sub
So viel meinerseits. Ich hoffe Du hast meine Worte verstanden, und sie sind dir hilfreich.
Gruß
balu