Hallo Winfried,
ok machen wir es konkreter:
Sub Filtern
oDatei = Thiscomponent
Dim ii%, ih%, iz%, iZeile%, ib as integer
Dim SortProps(2) As new com.sun.star.beans.PropertyValue
Dim SortFeld(1) As new com.sun.star.table.TableSortField
Dim s4$, sLinie$, s1 as string
s1 = "Hinrichtung"
SortFeld(0).Field = 1
SortFeld(0).IsAscending = True
SortFeld(0).FieldType = com.sun.star.util.SortFieldType.NUMERIC
SortFeld(1).Field = 3
SortFeld(1).IsAscending = True
SortFeld(1).FieldType = com.sun.star.util.SortFieldType.NUMERIC
SortProps(0).Name = "SortFields"
SortProps(0).Value = SortFeld()
SortProps(1).Name = "SortColumns"
SortProps(1).Value = False
SortProps(2).Name = "ContainsHeader"
SortProps(2).Value = false
oBlatt = oDatei.sheets().getByName(s1)
oZelle = oBlatt.getCellByPosition(1,1)
ii= oZelle.value + 2
oBereich = oBlatt.getCellRangeByName("A3:Q"+ii)
oBereich.Sort(SortProps())
kopieren(3, 500, "Muster", "I", "I", s1, "3")
iZeile = 2
' do
ii = izeile
sLinie = Bereich (izeile, s1)
s4 = oDatei.sheets().getByName(s1).getCellByPosition(8, ii).string +
"H"
if odatei.Sheets().hasByName(s4) Then
oBlatt = oDatei.sheets().getByName(s4)
ib = oBlatt.getCellByPosition(1,1).getCellAddress.sheet
oDatei.Sheets.removebyname(s4)
oDatei.Sheets.CopyByName("Muster",s4,ib)
else
oDatei.Sheets.CopyByName("Muster",s4,100)
oBlatt = oDatei.sheets().getByName(s4)
ib = oBlatt.getCellByPosition(1,1).getCellAddress.sheet
end if
kopieren(ii, iZeile, s1, "A", "K", s4, "3")
odatei.store()
verteilung
dia (ib, 1, s4)
dia (ib, 2, s4)
dia (ib, 3, s4)
dia (ib, 4, s4)
' Loop until sLinie = ""
end Sub
function Bereich(id%, s1 as string) as string
Dim iLinie as integer
oBlatt = thiscomponent.sheets().getByName(s1)
iLinie = oBlatt.getCellByPosition(1, id).value
Do
id = id + 1
Loop until oBlatt.getCellByPosition(1, id).value <> iLinie
Bereich = oBlatt.getCellByPosition(8, (id+1)).string
end function
Sub kopieren(ii%, iZeile%, s1$, s2$, s3$, s4$, sz$)
oBlatt = thiscomponent.sheets().getByName(s1)
S3 = (s2 + (ii+1) + ":" + s3 + iZeile)
' msgbox s3
oBereich = oBlatt.getCellRangeByName(s3)
' s4 = oBlatt.getCellByPosition(8, ii).string + s4
' msgbox s4
' msgbox s2+sz
oBlatt = thiscomponent.sheets().getByName(s4)
ozelle = oblatt.getcellRangebyname(s2+sz)
oBlatt.copyRange(ozelle.getCellAddress, oBereich.getRangeAddress)
end sub
Sub Dia (ib%, ii%, s4$)
dim fl as new com.sun.star.awt.Rectangle
dim RangeAddress(3) As New com.sun.star.table.CellRangeAddress
dim RangeAddress1(0) As New com.sun.star.table.CellRangeAddress
dim alle as object, x as object
oBlatt = ThisComponent.Sheets(ib)
alle = oBlatt.Charts
RangeAddress(0).Sheet= ib
RangeAddress(0).StartColumn = 15
RangeAddress(0).EndColumn = 15
RangeAddress(1).Sheet = ib
RangeAddress(2).Sheet = ib
RangeAddress(3).Sheet = ib
fl.Width = 12000
if ii=1 or ii=2 then
fl.Y = 6000
fl.Height = 8500
RangeAddress(0).StartRow = 3
RangeAddress(0).EndRow = 12
RangeAddress(1).StartRow = 3
RangeAddress(1).EndRow = 12
RangeAddress(2).StartRow = 3
RangeAddress(2).EndRow = 12
RangeAddress(3).StartRow = 3
RangeAddress(3).EndRow = 12
end if
if ii=1 or ii=3 then
fl.X = 56000
RangeAddress(1).StartColumn = 20
RangeAddress(1).EndColumn = 20
RangeAddress(2).StartColumn = 22
RangeAddress(2).EndColumn = 22
RangeAddress(3).StartColumn = 24
RangeAddress(3).EndColumn = 24
end if
if ii=2 or ii=4 then
fl.X = 68500
RangeAddress(1).StartColumn = 21
RangeAddress(1).EndColumn = 21
RangeAddress(2).StartColumn = 23
RangeAddress(2).EndColumn = 23
RangeAddress(3).StartColumn = 25
RangeAddress(3).EndColumn = 25
end if
if ii=3 or ii=4 then
fl.Y = 20000
fl.Height = 12500
RangeAddress(0).StartRow = 33
RangeAddress(0).EndRow = 73
RangeAddress(1).StartRow = 33
RangeAddress(1).EndRow = 73
RangeAddress(2).StartRow = 33
RangeAddress(2).EndRow = 73
RangeAddress(3).StartRow = 33
RangeAddress(3).EndRow = 73
end if
alle.removeByname("test"+s4+ii)
alle.addNewByName("test"+s4+ii, fl, RangeAddress(), True, True)
x = alle.getByName("test"+s4+ii).embeddedObject
x.Diagram = x.createInstance("com.sun.star.chart.LineDiagram")
End Sub
sub Verteilung
Dim oZelle2 as object, oZelle3 as object, oZelle4 as object
Dim aa(2) as integer
dim ii%, ij%, ik as integer
dim ergebnis#, zwischen as double
dim zeit as date
zeit = time()
ergebnis = 2000
oDatei = Thiscomponent
odatei.LockControllers
oBlatt = odatei.sheets(25)
oZelle2 = oBlatt.getCellByPosition(28, 8)
oZelle3 = oBlatt.getCellByPosition(29, 8)
oZelle4 = oBlatt.getCellByPosition(29, 6)
oZelle = oBlatt.getCellByPosition(26, 2)
for ii = 1 to 3
select case ii
case 1
oZelle4.value = 90
case 2
ozelle4.value = 95
case 3
ozelle4.value = 99
end select
msgbox ii
for ij = 1 to 20
for ik = ij+1 to 40
oZelle2.value = ij
oZelle3.value = ik
zwischen = oZelle.value
if ergebnis>zwischen then
ergebnis = zwischen
aa(0) = ij
aa(1) = ik
aa(2) = ii
end if
next ik
next ij
next ii
ozelle2.value = aa(0)
ozelle3.value = aa(1)
select case aa(2)
case 1
oZelle4.value = 90
case 2
ozelle4.value = 95
case 3
ozelle4.value = 99
end select
oDatei.UnlockControllers
end Sub
Die letzte Prozedur heißt Verteilung und macht nichts anderes als
systematisch Werte werte in drei Zellen zu schreiben und in der 4. Zelle
das Ergebnis zu vergleichen. Sollte ein besseres erzielt werden, wird
dies und die Parametern im Array gespeichert.
Das ausführen der Funktion alleine bedarf keiner 30 Sekunden.
Wird hingegen die Prozedur wie im Beispiel Filtern aufgerufen, so dauert
die Angelegenheit geschätzte 10 Minuten.
Die Systemauslastung durch den Prozess Staroffice.bin liegt in beiden
Fällen bei 99%
Dieses Verhalten kann ich auch an anderen Stellen beobachten. Meine
Vermutung ist daher das noch irgendwelche Dinge im Speicher liegen, oder
sich sonst irgendwo rumtummeln die eigentlich nicht benötigt sind. Die
würde ich natürlich gerne vor Ausführung der Prozedur rauswerfen.
Ebenfalls schlecht ist wenn die Autosicherung zuschlägt. Dann werden nur
noch leere Diagramme eingefügt, anstelle von welchen mit Inhalt. Auch
das würde ich gerne für die Laufzeit des Makros unterbinden, wenn es
dort Möglichkeiten gibt. Die Autoberechnung kann ich leider nicht
abschalten, da sonst die Makros keine Rückgabewerte bekommen. Vielleicht
kann ich es zeitweise deaktivieren.
Viele Grüße
Jan
Winfried Rohr schrieb:
Hallo Jan:
Wie kann ich umgehen, das so lange für Rechenzeit benötigt wird,
für Funktionen die eigentlich ganz schnell laufen könnten.
Auf eine so allgemein gestellte Frage kann ich Dir nur die
Standardantworten zu Beschleunigung von Makros geben:
* bearbeiten im Hintergrund ( Frame auf HIDDEN setzen )
* ausschalten der AutoBerechnung ( AutomaticCalculation OFF )
* arbeiten mit Bereichen anstelle einzelner Zellen ( RANGE,
DATAARRAY )
Viel Erfolg!
Winfried
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@de.openoffice.org
For additional commands, e-mail: users-h...@de.openoffice.org