Seite 1 von 1
Re: Auto fill
Verfasst: Mo, 25.03.2013 18:21
von F3K Total
Vielleicht so:
Code: Alles auswählen
osheet = document.Sheets.getByIndex(sheet.sheet)
' Quellbereich festlegen
QuelleRange= osheet.getCellRangeByName("$O$5:$Q$5")
QuellRangeAddresse = QuelleRange.getRangeAddress
for i = 5 to 50 step 5
Zielcell = oSheet.getCellbyposition(14,i)
ZielCellAdresse = Zielcell.getCellAddress
osheet.copyRange(ZielCellAdresse,QuellRangeAddresse)
next i
Das Ziel ist nur eine Zelle und kein Zellbereich.
Was sollte eigentlich dies hier?
Code: Alles auswählen
sheet1 = document.Sheets.getByIndex(sheet.sheet)
sheet2 = document.Sheets.getByIndex(sheet.sheet)
Demnach ist sheet1 gleich sheet2 darum habe ich sie durch osheet ersetzt
Gruß R
Re: Auto fill
Verfasst: Mo, 25.03.2013 20:17
von F3K Total
__Peter__ hat geschrieben:Auf die Idee bin ich auch schon gekommen ...
Tolle Erkenntnis!
Warum läßt du mich/uns dann daran arbeiten? Das ist extrem uncool von Dir!
__Peter__ hat geschrieben:..., aber bei 100000 Zeilen dauert das zu lange.
Klasse, wieso schreibst Du erst hinterher davon ...
Manomann, mach deinen Scheiß alleine.
R
Re: Auto fill
Verfasst: Mo, 25.03.2013 20:49
von F3K Total
Peter hat geschrieben:Sry, tut mir leid.
OK
ca. 4s für 20000 Zeilen:
Code: Alles auswählen
Sub Set_20000_rows
dim i as long
osheet = thiscomponent.sheets.getbyname("Tabelle1")
oSrange = osheet.getcellrangebyname("O5:Q5")
aSdata = oSrange.DataArray
arow = aSdata(0)
aTRange = osheet.getcellrangebyname("O6:Q100000")
aTdata = aTRange.dataArray
for i = 0 to ubound(aTdata) step 5
aTdata(i) = arow
next i
aTRange.setdataArray(aTdata)
End Sub
Gruß R
Re: Auto fill
Verfasst: Mo, 25.03.2013 21:15
von F3K Total
Code: Alles auswählen
Sub Set_20000_rows
dim i as long
osheet = thiscomponent.sheets.getbyname("Tabelle1")
oSrange = osheet.getcellrangebyname("O5:Q5")
aSdata = oSrange.DataArray '---> Datenarray aus den Zellen O5 bis Q5 auslesen
arow = aSdata(0)' arow ist das Datenarray der 0-ten und einzigsten Zeile und beinhaltet drei Werte (O5,P5,Q5)
aTRange = osheet.getcellrangebyname("O6:Q100000") '---> Zielzellenbereich wählen
aTdata = aTRange.dataArray '--->Datenarray Zielzellen auslesen (ist noch leer)
for i = 0 to ubound(aTdata) step 5 'von 0 bis Anzahl Zeilen des Datenarray der Zielzellen, Schrittweite 5
aTdata(i) = arow' ---> hier passiert es: in i-ter Zeile des Zielzellenarrays die Quellzeilenwerte(arow) setzen
next i
aTRange.setdataArray(aTdata)'---> Daten in Zellen einsetzen
End Sub
So etwa?
Gruß R
Re: Auto fill
Verfasst: Mo, 25.03.2013 21:28
von F3K Total
Ersetzte
durch
überall!
Noch eine Anmerkung:
__Peter__ hat geschrieben:... Hab nun mal mit dem debugger versucht zu verstehen was du
da gemacht hast. Komme auf die schnelle nicht ganz dahinter.
Wenn Du die Hinweise, die du bereits erhalten hast, ernster nehmen würdest, hättest Du bereits Werkzeug dafür.
Karolus hat geschrieben:... ps. Es gibt
Dannenhöfer
pps. und es gibt
Mri
Karolus
Die Verwendung eines Inspection-Tools wie
MRI oder
Xray hilft.
Mit einem
wärst Du selbst drauf gekommen.
Gruß R
Re: Auto fill
Verfasst: Di, 26.03.2013 10:14
von Karolus
Hallo
.getDataArray und .setDataArray 'weiss' nichts von relativen Formeln, daher wieder zurück zur .copyRange Methode:
Code: Alles auswählen
Sub Main
doc = thisComponent
osheet = doc.Sheets.getByIndex(0)
QuelleRange= osheet.getCellRangeByName("O5:Q5")
QuellAddress = QuelleRange.getRangeAddress
targetAddress = oSheet.getCellbyposition(14,5).getCellAddress
for i = 10 to 100000 step 5
targetAddress.Row = i
osheet.copyRange(targetAddress,QuellAddress)
next i
End Sub
! In einer Schleife die
oft durchlaufen wird, sollte man so wenig tun wie irgendwie möglich !
Edit: Das dauert immer noch gut 3 Minuten -
welche Formeln stehen in O5:Q5 ?
Karolus
Re: Auto fill
Verfasst: Di, 26.03.2013 10:54
von Karolus
Hallo
Welche Formeln stehen konkret in O5:Q5 ?
Karolus
Re: Auto fill
Verfasst: Di, 26.03.2013 11:08
von Karolus
Hallo
1. O5:Q5 ist ein Bereich mit drei Zellen, was steht in P5 ?
2. Würde es reichen statt der Formeln direkt ihre Ergebnisse einzutragen ?
Karolus
Re: Auto fill
Verfasst: Di, 26.03.2013 14:12
von Karolus
Hallo
Code: Alles auswählen
context = XSCRIPTCONTEXT
def calculate_relativ():
doc = context.getDocument()
sheet = doc.Sheets.getByIndex(0)
source = sheet.getCellRangeByName("B4:H120000").getDataArray()[::5]
target = sheet.getCellRangeByName("O5:Q120001")
data= list(target.getFormulaArray())
for i, row in enumerate(source):
b, _, _, f, _, h = row
b = b[-4:]
data[ i * 5 ] = (int(b, 16),'', f + h/1000000)
target.setDataArray(tuple(data))
Der (Python)code läuft in < 3 sec durch - ( aber nur falls in allen abgefragten Zellen in Spalte B ein gültiger Hexstring mit minimal 4 Zeichen ist).
Karolus
Re: Auto fill
Verfasst: Di, 26.03.2013 19:32
von F3K Total
Oder du fügst die Formeln per Basic-Makro ein:
Code: Alles auswählen
Sub S_insert_formulas_in_20000_rows
dim i as long
dim n as long
osheet = thiscomponent.sheets.getbyname("Tabelle1")
aTRange = osheet.getcellrangebyname("O6:Q100000")
aTformula = aTRange.formulaArray
for i = 0 to ubound(aTformula) step 5
n = i + 5
arow = aTformula(i)
arow(0) = "=HEXINDEZ(TEIL(B"& n &";LÄNGE(B"& n & ")-8;8))"
arow(2) = "=F" & n & "+H" & n & "/1000000"
aTformula(i) = arow
next i
aTRange.setformulaArray(aTformula)
End Sub
Dauert bei mir (3GB-RAM, 2,2 GHz) etwa 3 Minuten.
Gruß R
Re: Auto fill
Verfasst: Mi, 27.03.2013 01:20
von Karolus
Hallo
Dauert bei mir (3GB-RAM, 2,2 GHz) etwa 3 Minuten.
Das war der Grund für mich statt der Formeln die Werte direkt zu berechnen und dafür Python zu benutzen.
Karolus