VBA-Makro funktioniert in Libreofficecalc nicht richtig

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

Moderator: Moderatoren

puschi
Beiträge: 7
Registriert: So, 09.10.2016 15:07

VBA-Makro funktioniert in Libreofficecalc nicht richtig

Beitrag von puschi »

Hallo liebe Forumsmitglieder,
ich habe ein VBA Makro und möchte dies in Libreoffice calc laufen lassen.
Folgende Idee liegt vor:
In der Zelle A1=Hund, wenn in der Zelle D1=Hund steht soll der Wert wauwau iausgegeben werden.

Im normalen Fall erscheint in dem angesprochenen Feld #NULL!
Wenn ich dann aber den Makro-Code aufrufe und nur eine Leerzeile hinzufüge und anschließend das Makro speicher, dann wird die Funktion korrekt durchgeführt.
Als Fehlermeldung erhalte ich, dass ( in dieser ZeileI f a= x Then tier = "wauwau") das Argument nit optional ist.

Kann mir hier jemand helfen?

Code: Alles auswählen

REM  *****  BASIC  *****
Option VBASupport 1
Function tier(x) as string 
a = Range("a1")  
b = Range("a2") 
If a= x Then tier = "wauwau"
If b =x Then tier = "miau"
End Function
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: VBA-Makro funktioniert in Libreofficecalc nicht richtig

Beitrag von Toxitom »

Hey Puschi,

VBA ist ne MS Sprache und VBA Makros laufen unter MS Office - Bei Dir halt Excel.

LibreOffice hat ne eigene Markrosprache: LibreOffice Basic zum Beispiel. Das Objektmodell ist grundlegend anders als bei MS. Insofern..... wenn Du ein Makro unter LibreOffice laufen lassen möchtest, musst Du Dich schon mit dem UNO-Objektmodell beschäftigen.

Auch wenn LibreOffice rudimentäre direkte Unterstützung für VBA Makros bietet - so ist dies dennoch einfach nur ne "Zwischenschicht". Vergiss es einfach.

Und ja: Wenn Du eine Funktion mit einem Parameter aufrufst (in Deinem Fall x) - dann muss der auch übergeben werden. Schließlich nutzt Du ihn ja auch;)
Wie rufst Du denn die Funktion auf?

VG Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
puschi
Beiträge: 7
Registriert: So, 09.10.2016 15:07

Re: VBA-Makro funktioniert in Libreofficecalc nicht richtig

Beitrag von puschi »

Hallo toxitom,
ich habe schon ein paar VBA Makros für Libroffice calc umgeschrieben. Das ging immer irgendwie, aber nun ist da der Wurm drin.
In dem Tabellenblatt steht in einer Zelle =tier(D3) (In der Zelle D3 soll zum beispiel wauwau auftauchen)
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: VBA-Makro funktioniert in Libreofficecalc nicht richtig

Beitrag von Toxitom »

Hallo Puschi,

wenn in einer Zelle das Makro aufgerufen werden soll (in deinem Fall =TIER(D3) ) - dann kann das Makro nur in die aktuelle Zelle schreiben. Also müsste in D3 Dein Tier schon stehen - und in der aktullen Zelle würde "wauwau" auftauchen.,

Dein Makro müsste so ähnlich aussehen:

Code: Alles auswählen

function Tier(x as string)
  tier = ""   'allgemeine Rückgabe
  a = thisComponent.sheets(0).getCellrangeByName("a1").string   'Steht "Hund" drin
  b = thisComponent.sheets(0).getCellrangeByName("a2").string   'steht "Katze" drin
  If a = x Then tier = "wauwau"
  If b = x Then tier = "miau"

end function
Wobei A1 und A2 die Bezugspunkte stehen würden, die Zelle selbst dann aber auf eine Eingabezelle Bezug nehmen muss. Also Z.B. Eingabezelle ist C1 - deine Formel steht dann in D1: =TIER(C1)

Schreibst Du jetzt in die Zelle C1 : Hund - so erscheint "Wauwau" in D1, schreibst Du "Katze" rein, so erscheint "miau".

Insgesamt aber ziemlich "umständlich";))

VG Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
puschi
Beiträge: 7
Registriert: So, 09.10.2016 15:07

Re: VBA-Makro funktioniert in Libreofficecalc nicht richtig

Beitrag von puschi »

Hallo toxitom,
ich habe dein Makro eben ausprobiert und es läuft super.
Mein eigendliches Makro sieht natürlich etwas anders aus. Mein eigendliches Problem lag in der allgemeinen Deklaration(?? Ich glaube der Begriff ist richtig) von a und b.
Jetzt werde ich versuchen diese Idee auf das eigendliche Makro anzuwenden. Ich melde anschließend, ob das funktioniert hat.
Auf jeden Fall danke ich dir für deine schnelle Hilfe.
LG puschi
puschi
Beiträge: 7
Registriert: So, 09.10.2016 15:07

Re: VBA-Makro funktioniert in Libreofficecalc nicht richtig

Beitrag von puschi »

Ich dachte, dass ich das so hinbekomme. Das ist trotz mehrer Versuche nicht so.
Deswegen noch einmal das eigendliche Makro. Das Makro soll Schulnoten berechnen.

In den Zellen p4-aa2 stehen Zahlen
Eine Punktezahl (z.B in der Zelle F1) liegt innerhalb eines Punkteintervalls, dann soll vv=(F1) (in der Zelle G1) den Wert "1+" liefern

Code: Alles auswählen

Function vv(x) As String  ' as string: Text-Format
                                    
a = Range("p4") '100%
b = Range("t8") '92%
c = Range("t9") '80%
d = Range("t10") '65%
e = Range("t11") '50%
f = Range("t12") '25%
g = Range("t13") '0%

y = Range("aa2") ' Grenze bei Noten


If a + y >= x And x >= a - y Then vv = "1+"
If a - y > x And x >= b + y Then vv = "1"
If b + y > x And x >= b Then vv = "1-"

If b > x And x >= b - y Then vv = "2+"
If b - y > x And x >= c + y Then vv = "2"
If c + y > x And x >= c Then vv = "2-"

If c > x And x >= c - y Then vv = "3+"
If c - y > x And x >= d + y Then vv = "3"
If d + y > x And x >= d Then vv = "3-"

If d > x And x >= d - y Then vv = "4+"
If d - y > x And x >= e + y Then vv = "4"
If e + y > x And x >= e Then vv = "4-"

If e > x And x >= e - y Then vv = "5+"
If e - y > x And x >= f + y Then vv = "5"
If f + y > x And x >= f Then vv = "5-"

If f > x And x >= g Then vv = "6"

End Function

mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: VBA-Makro funktioniert in Libreofficecalc nicht richtig

Beitrag von mikeleb »

Hallo,

muss es denn unbedingt ein Makro sein?
Die Prozentangaben für die Noten sind klar. Wie bestimmt sich das y (Prozent- oder Punktangabe)?
Da die Intervalle für die Noten unterschiedlich sind (8%, 12%, 15%, 25%), kann y doch eigentlich nicht gleich sein?
Gruß,
mikeleb
puschi
Beiträge: 7
Registriert: So, 09.10.2016 15:07

Re: VBA-Makro funktioniert in Libreofficecalc nicht richtig

Beitrag von puschi »

Hallo mikeleb,
der y-Wert ist ein Korrekturwert (kein Prozentwert), der bei allen Notenbereichen gleich ist. Mein Problem ist, dass ich die festen Werte a,..,y nicht festlegen (deklarieren???) kann. Ich habe schon einige Versuche unternommen indem ich das Makro von toxitom verändert habe.

a = thisComponent.sheets(0).getCellrangeByName("a1").string

Ich dachte es reicht die Endung string zuersetzen

P.S.:Ich habe früher das Problem in Excel mit verschachtelten wenndann Beziehungen gelöst. Das war sehr unkonfortabel und teilweise unhandlich.

VG puschi
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: VBA-Makro funktioniert in Libreofficecalc nicht richtig

Beitrag von mikeleb »

Hallo,

soweit verstanden.
Wenn die Daten für die Noten (Prozente, Punktzahlen) in einer Tabelle hinterlegt sind, reduziert sich die Formel auf eine einzige SVerweis()-Funktion. Schau dir mal das Beispiel an (gelbe Felder = Eingaben; rotes Feld = Ergebnis).
Dateianhänge
notenberechnung.ods
(26.59 KiB) 154-mal heruntergeladen
Gruß,
mikeleb
puschi
Beiträge: 7
Registriert: So, 09.10.2016 15:07

Re: VBA-Makro funktioniert in Libreofficecalc nicht richtig

Beitrag von puschi »

Hallo mikeleb,
mit dem SVERWEIS() funktioniert die Zuordnung tadellos. Ich werde dies auch erstmal so umsetzen. Trotzdem interessiert es mich, wie ich das Problem mit einem Makro lösen kann. Man wird durch so etwas ja auch nicht dümmer.
Vielen Dank für die Hilfestellung
puschi

P.S.: Vielleicht gibt es ja noch Hilfe bezüglich des Makros
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: VBA-Makro funktioniert in Libreofficecalc nicht richtig

Beitrag von balu »

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.

Code: Alles auswählen

ZEILE1
ZEILE2
ZEILE3
Und das würde dann in einer Zeile so aussehen.

Code: Alles auswählen

ZEILE1 : ZEILE2 : ZEILE3
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.

Code: Alles auswählen

    oErreichtePunkte = mySheet.getCellRangeByName("B14")
 
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
Dateianhänge
notenberechnung_mit-makro_1.ods
(11.6 KiB) 105-mal heruntergeladen
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
puschi
Beiträge: 7
Registriert: So, 09.10.2016 15:07

Re: VBA-Makro funktioniert in Libreofficecalc nicht richtig

Beitrag von puschi »

Hallo balu,
vielen Dank für deine umfassende und verständliche Antwort. Ich habe mich gleich rangesetzt und ein wenig rumexperementiert. Ich versuche gerade einem Array einem Zellenwert zuzuordnen. Das funktioniert irgendwie gar nicht.
Es soll beispielsweise dem sAry(1,1) der Wert, der in der Zelle A1 steht, zugeordnet werden.

Mit bestem Dank puschi
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: VBA-Makro funktioniert in Libreofficecalc nicht richtig

Beitrag von Stephan »

Es soll beispielsweise dem sAry(1,1) der Wert, der in der Zelle A1 steht, zugeordnet werden.
die Zuweisung unterscheidet sich um Nichts von der Zuweisung an eine 'normale' Variable, die ja Thomas schon genannt hatte, z.B.:

Code: Alles auswählen

a = thisComponent.sheets(0).getCellrangeByName("a1").string
also z.B.:

Code: Alles auswählen

sAry(1,1) = thisComponent.sheets(0).getCellrangeByName("a1").string

Gruß
Stephan
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: VBA-Makro funktioniert in Libreofficecalc nicht richtig

Beitrag von mikeleb »

Hallo,
als benutzerdefinierte Funktion würde ich ihr alle notwendigen Werte als Parameter übergeben (und sie nicht auf dem Tabellenblatt suchen).

Code: Alles auswählen

Function note (g, n1, n2, n3, n4, n5, y,x)
    '
    'g...Gesamtpunktzahl
    'n1,...,n5 Punktzahl für Note 1-5
    'y ... Tendenzbereich
    'x... erreichte Punktzahl
    '                               
	notenbereich()=array(0,n5,n5+y,n4-y,n4,n4+y,n3-y,n3,n3+y,n2-y,n2,n2+y,n1-y,n1,n1+y,g-y)
	noten()=array("6","5-","5","5+","4-","4","4+","3-","3","3+","2-","2","2+","1-","1","1+")

	for i=0 to 15
		if x>=notenbereich(i) then sTmp=noten(i)
	next
	note=sTmp

End Function
Befinden sich die Punktzahlen für 1-5 in einem zusammenhängenden Bereich geht auch folgendes:

Code: Alles auswählen

Function note2 (g, n as array, y,x)
    '
    'g...Gesamtpunktzahl
    'n... Punktzahlen für Note 1-5 (ein Zellbereich)
    'y ... Tendenzbereich
    'x... erreichte Punktzahl
    '                         
	notenbereich()=array(0,n(5,1)-y,n(5,1),n(5,1)+y,n(4,1),n(4,1)+y,n(3,1)-y,n(3,1),n(3,1)+y,n(2,1)-y,n(2,1),n(2,1)+y,n(1,1)-y,n(1,1),n(1,1)+y,g-y)
	noten()=array("6","5-","5","5+","4-","4","4+","3-","3","3+","2-","2","2+","1-","1","1+")

	for i=0 to 15
		if x>=notenbereich(i) then sTmp=noten(i)
	next
	note2=sTmp

End Function
Mit ein bisschen Arbeit lassen sich auch beide Varianten in einer Funktion realisieren.
Nebenbei habe ich bemerkt, dass sich in meinem Beispiel mit g=45 und y=2 die Bereich für die 1+, 1, 1- überschneiden. Was gilt in diesem Fall?
Dateianhänge
notenberechnung_mit_makro.ods
(32.41 KiB) 120-mal heruntergeladen
Gruß,
mikeleb
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: VBA-Makro funktioniert in Libreofficecalc nicht richtig

Beitrag von balu »

Hallo puschi,
vielen Dank für deine umfassende und verständliche Antwort.
Gern geschehn. :-)

Ich habe mich gleich rangesetzt und ein wenig rumexperementiert.
Und so soll es ja auch sein.

Ich muss aber noch auf einen, besser gesagt auf 2 wichtige Punkte genauer eingehen.
Und zwar geht es um die Variablen deklaration des ARRAY.

Code: Alles auswählen

Dim sAry(1 to 3, 1 to 16)
 
1.
Normalerweise beginnt die Zählung in StarBasic immer mit der 0 (NULL), bis auf sehr sehr wenige Ausnahmen die uns jetzt hier aber nicht interessieren.
Die Zählung der Blätter, als Beispiel, fängt auch mit der 0 an. *myDoc.sheets(0)* ist also das erste sichtbare Tabellenblatt welches in einer üblichen leeren Datei den Namen "Tabelle1" trägt.

In einem ARRAY, besonders bei einem eindimensionalem ARRAY fängt die Zählung üblicherweise auch mit 0 an. Das bedeutet, das ein so deklariertes ARRAY

Code: Alles auswählen

Dim sAry(4)
 
5 Elemente aufnehmen kann, also die Elemente 0 bis 4. Und das bedeutet, das die defenition des ARRAY wie folgt aussehen muss.

Code: Alles auswählen

sAry(0) = "Hund"
sAry(1) = "Katze"
...
 
Es sei denn, man deklariert es so das die Zählung bei 1 anfängt.

Code: Alles auswählen

Dim sAry(1 to 5)
 
Und die defenition wäre dann wie folgt.

Code: Alles auswählen

sAry(1) = "Hund"
sAry(2) = "Katze"
...
 

2.
Normalerweise deklariert man ja Variablen so, das sie nur einen bestimmten Typ an Daten aufnehmen können.
Beispiele.

Code: Alles auswählen

Dim oZelle1 as Object
Dim iZahl as Integer
Wenn man den Typ *as ...* weg lässt, dann wird automatisch der Typ VARIANT zugewiesen. Das bedeutet, das die Variable entweder Text, Zahlenwerte oder sonstiges aufnehmen kann.
Und in sehr vielen Fällen sollte man dies tunlichst sein lassen, da dies zu Problem und Fehlern führen kann.

Aber in diesem Falle bei einem ARRAY kann man die automatische Zuweisung ruhig nehmen. Denn das ARRAY enthällt einmal Zahlenwerte, 0 bis 50, und ein anderes male Texte, 5-, 3+ etc.
Und aus diesem Grunde habe ich das ARRAY automatisch als VARIANT deklarieren lassen.

Code: Alles auswählen

Dim sAry(1 to 3, 1 to 16)
 

So, das wars was ich noch sagen wollte, aber aus lauter müdigkeit in meinem vorherigen Beitrag nicht mehr geschafft hatte.

Viel Spaß beim weiteren Lernen und verstehen.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Antworten