von lupolupp1 » Di, 26.08.2008 22:33
Hallo Hawe,
du hast vollkommen recht, dass das funktioniert. Ist auch von der Programmierung her wesentlich einfacher und kürzer (habe ich leider schon öfter im Vergleich VBA/OOBasic festgestellt), allerdings arbeitet der Code auch wesentlich langsamer.
Ich wollte ja gerade, um die lange Berechnungsdauer zu verkürzen, Arrays einsetzen, anstatt die Zellen jedesmal direkt anzusprechen.
Ich habe aber zwischenzeitlich noch eine weitere Lösung gefunden, die auch wesentlich schneller rechnet.
Fülle in einem Calc-Tabellenblatt den Bereich A1:D5001 mit irgendwelchen Zahlen und lasse jeweils die beiden Codes drüber laufen. Die OOBasic-Variante ist zwar komplizierter und auch vom Code her wesentlich länger, dafür aber auch wesentlich schneller.
Schön wäre es natürlich, wenn es eine ähnlich einfache Funktion wie in VBA auch zukünftig in OOBasic geben würde, die dann auch genauso schnell arbeitet wie meine jetzige OOBasic-Variante. Hier die Frage an die Entwickler: ist so etwas umsetzbar und wird es so etwas mal geben?
Viele Grüße
Lupo
VBA-Variante
Code: Alles auswählen
option VBASupport 1
Sub schnell()
Dim Ausgabe(1 to 5000,1 to 3)
yEin= Range("A1:D7500")
For y=1 to 5000
for x=1 to 3 step 2
Ausgabe(y,x)=yEin(y,x)*2
next
next
Range("F1:H5000")=Ausgabe
msgbox("fertig")
Reine OOBasic-Variante
Code: Alles auswählen
Sub schnell()
dim Ausgabe(5000)
dim f(5000)
dim g(5000)
dim h(5000)
oRange = ThisComponent.Sheets().getByIndex(0).getCellRangeByName("A1:D7500")
yEin()= oRange.getDataArray()
for y=0 to 5000 'zunächst alle "virtuellen Zellen" mit "" füllen, ansonsten erscheint der Fehler "Objektvariable nicht belegt",
'Anzahl der Durchläufe muss mit der Zellenanzahl des Ausgabebereiches übereinstimmen
f(y)="":g(y)="":h(y)=""
next
'Mit folgendem Code werden die Spalten A und C jeweils verdoppelt (einfach um irgendetwas zu rechnen)
For y=0 to 5000
ZwischenwertyEin = yein(y) ' Hier wird die Zeile der entsprechenden abzufragenden Zelle angegeben
For x=1 to 3 step 2
xEin=ZwischenwertyEin(x)
Ergebnis=xEin*2
select case x
Case 1
f(y)=Ergebnis
Case 3
h(y)=Ergebnis
end select
next
next
'Ausgabe der Ergebnisse
For y=0 to 5000
Ausgabe(y)=Array(f(y),g(y),h(y))
next
oRange = ThisComponent.Sheets().getByIndex(0).getCellRangeByName("F1:H5001")'Definition des Ausgabebereiches
oRange.setDataArray(Ausgabe())'Übertrag der im Array zwischengespeicherten Ergebnisse an den Ausgabebereich im Tabellenblatt
msgbox("fertig")
End Sub
hawe hat geschrieben:Also soweit ich im Debugger sehen kann gibt RANGE a ein original Array über
Dim a( 1 to 9, 1 to 2)
zurück. VBASupport schaltet ein paar VBA-Objekte zu. OOBasic ist davon nicht betroffen. Was genau unterstützt wird musst Du googeln oder ausprobieren. Es ist schon interessant, dass man über den VBASupport einige Haken und Ösen von OOBasic übertünchen kann.
Gruß HW
Hans W. Hofmann
Hallo Hawe,
du hast vollkommen recht, dass das funktioniert. Ist auch von der Programmierung her wesentlich einfacher und kürzer (habe ich leider schon öfter im Vergleich VBA/OOBasic festgestellt), allerdings arbeitet der Code auch wesentlich langsamer.
Ich wollte ja gerade, um die lange Berechnungsdauer zu verkürzen, Arrays einsetzen, anstatt die Zellen jedesmal direkt anzusprechen.
Ich habe aber zwischenzeitlich noch eine weitere Lösung gefunden, die auch wesentlich schneller rechnet.
Fülle in einem Calc-Tabellenblatt den Bereich A1:D5001 mit irgendwelchen Zahlen und lasse jeweils die beiden Codes drüber laufen. Die OOBasic-Variante ist zwar komplizierter und auch vom Code her wesentlich länger, dafür aber auch wesentlich schneller.
Schön wäre es natürlich, wenn es eine ähnlich einfache Funktion wie in VBA auch zukünftig in OOBasic geben würde, die dann auch genauso schnell arbeitet wie meine jetzige OOBasic-Variante. Hier die Frage an die Entwickler: ist so etwas umsetzbar und wird es so etwas mal geben?
Viele Grüße
Lupo
VBA-Variante
[code]option VBASupport 1
Sub schnell()
Dim Ausgabe(1 to 5000,1 to 3)
yEin= Range("A1:D7500")
For y=1 to 5000
for x=1 to 3 step 2
Ausgabe(y,x)=yEin(y,x)*2
next
next
Range("F1:H5000")=Ausgabe
msgbox("fertig")[/code]
Reine OOBasic-Variante
[code]Sub schnell()
dim Ausgabe(5000)
dim f(5000)
dim g(5000)
dim h(5000)
oRange = ThisComponent.Sheets().getByIndex(0).getCellRangeByName("A1:D7500")
yEin()= oRange.getDataArray()
for y=0 to 5000 'zunächst alle "virtuellen Zellen" mit "" füllen, ansonsten erscheint der Fehler "Objektvariable nicht belegt",
'Anzahl der Durchläufe muss mit der Zellenanzahl des Ausgabebereiches übereinstimmen
f(y)="":g(y)="":h(y)=""
next
'Mit folgendem Code werden die Spalten A und C jeweils verdoppelt (einfach um irgendetwas zu rechnen)
For y=0 to 5000
ZwischenwertyEin = yein(y) ' Hier wird die Zeile der entsprechenden abzufragenden Zelle angegeben
For x=1 to 3 step 2
xEin=ZwischenwertyEin(x)
Ergebnis=xEin*2
select case x
Case 1
f(y)=Ergebnis
Case 3
h(y)=Ergebnis
end select
next
next
'Ausgabe der Ergebnisse
For y=0 to 5000
Ausgabe(y)=Array(f(y),g(y),h(y))
next
oRange = ThisComponent.Sheets().getByIndex(0).getCellRangeByName("F1:H5001")'Definition des Ausgabebereiches
oRange.setDataArray(Ausgabe())'Übertrag der im Array zwischengespeicherten Ergebnisse an den Ausgabebereich im Tabellenblatt
msgbox("fertig")
End Sub[/code]
[quote="hawe"]Also soweit ich im Debugger sehen kann gibt RANGE a ein original Array über
Dim a( 1 to 9, 1 to 2)
zurück. VBASupport schaltet ein paar VBA-Objekte zu. OOBasic ist davon nicht betroffen. Was genau unterstützt wird musst Du googeln oder ausprobieren. Es ist schon interessant, dass man über den VBASupport einige Haken und Ösen von OOBasic übertünchen kann. :-)
Gruß HW
Hans W. Hofmann[/quote]