Auto fill

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

Moderator: Moderatoren

F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Auto fill

Beitrag 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
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Auto fill

Beitrag 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
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Auto fill

Beitrag 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
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Auto fill

Beitrag 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
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Auto fill

Beitrag von F3K Total »

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
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Auto fill

Beitrag 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
Zuletzt geändert von Karolus am Di, 26.03.2013 10:50, insgesamt 1-mal geändert.
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Auto fill

Beitrag von Karolus »

Hallo

Welche Formeln stehen konkret in O5:Q5 ?

Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Auto fill

Beitrag 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
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Auto fill

Beitrag 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
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Auto fill

Beitrag 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
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Auto fill

Beitrag 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
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Antworten