Auto fill

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Auto fill

Re: Auto fill

von Karolus » Mi, 27.03.2013 01:20

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

Re: Auto fill

von F3K Total » Di, 26.03.2013 19:32

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

von Karolus » Di, 26.03.2013 14:12

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

von Karolus » Di, 26.03.2013 11:08

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

von Karolus » Di, 26.03.2013 10:54

Hallo

Welche Formeln stehen konkret in O5:Q5 ?

Karolus

Re: Auto fill

von Karolus » Di, 26.03.2013 10:14

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

von F3K Total » Mo, 25.03.2013 21:28

Ersetzte

Code: Alles auswählen

dataarray
durch

Code: Alles auswählen

formulaarray
ü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

Code: Alles auswählen

XRAY aTdata
wärst Du selbst drauf gekommen.
Gruß R

Re: Auto fill

von F3K Total » Mo, 25.03.2013 21:15

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

von F3K Total » Mo, 25.03.2013 20:49

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

von F3K Total » Mo, 25.03.2013 20:17

__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

von F3K Total » Mo, 25.03.2013 18:21

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

Nach oben