🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

gelöst; variable Zellenzahl ermitteln

Alles zur Programmierung im LibreOffice.
craig
* LO-Experte *
Beiträge: 1137
Registriert: Do 21. Apr 2016, 11:42

Re: variable Zellenzahl ermitteln

Beitrag von craig » Sa 26. Dez 2020, 17:07

@nitja,

Das Arbeiten mit Array's ist immer schneller, als das Lesen und Schreiben in den einzelnen Zellen.
Dies ist abhängig vom Rechner, von den Hintergrundanwendungen und den sonstigen parallel
laufenden Programmen.
Wenn das Betriebssystem in einem solchen Fall, während des Lesens und Schreibens
die Daten auf die Festplatte auslagern muss, zeigt sich oft eine solche Performancebremse.

Ausserdem kann es von Vorteil sein, die Bildschirmaktualisierung im Makro auszuschalten,
damit die Grafikkarte auch Ruhe gibt und das System nicht zusätzlich belastet.
Ist das Makro durchgelaufen, dann muss die Aktualisierung selbstverständlich wieder eingeschaltet werden.
Beispiel:
http://www.oooforum.de/viewtopic.php?t=15397

Bei einem Array liest man in der Regel nur einmal von der Platte und man schreibt nur einmal auf die Platte.
Man muss sich auch nicht um die Bildschirmaktualisierung kümmern.

Der Rest läuft im Arbeitsspeicher, es sei denn, man verfügt nur über einen sehr schwachbrüstigen Rechner.
Meinem Rechner habe 16GB RAM spendiert.

-----------------
Nun habe ich einen festen Datenbereich referenziert (A2:D50000),
dies könnte man dahingehend verbessern, in dem man nur den
tatsächlich verwendeten Bereich referenziert.
Also z.B.:
MyRange= [Meine letzte Zelle im Bereich = D4000]

Na, wollen mal sehen was Natal berichtet.

Auf jeden Fall kann er von uns beiden einiges dazu lernen ;)
Gruß

Craig

Nie die Sicherungskopie vergessen!

════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8

nitja
Beiträge: 190
Registriert: Di 20. Okt 2020, 15:55

Re: variable Zellenzahl ermitteln

Beitrag von nitja » Sa 26. Dez 2020, 17:56

craig hat geschrieben:
Sa 26. Dez 2020, 17:07
… Das Arbeiten mit Array's ist immer schneller, als das Lesen und Schreiben in den einzelnen Zellen.
Klar, das mache ich ja für das Schreiben auch. Bin gespannt, wie sich das beim Lesen auswirkt, hab aber keine Lust mir eine Test-Tabelle mit zig-tausend Zeilen dafür zu basteln.

<OT>
Und, im übrigen, was das Lernen hier betrifft: Man lernt an den Fragen anderer manchmal mehr als an den eigenen.
Und, was meine eigenen betrifft:
Du bist derjenige, der mir am meisten weiter geholfen hat, auch wenn die Verständigung manchmal anfangs holprig wirken mochte.
</OT<
LO 24.2.0.3 (X86_64) auf Linux 6.6.26-1-MANJARO, gnome 45.4, (gtk 4) gtk3 für LO

natal
Beiträge: 120
Registriert: So 8. Mär 2020, 20:03

Re: variable Zellenzahl ermitteln

Beitrag von natal » So 27. Dez 2020, 10:40

Meßdurchlauf.ods
(379.62 KiB) 233-mal heruntergeladen
Hallo nitja
Deine neue Variante hat die Rechenzeit von 2,5 min auf ca. 20 sec verkürzt.
Die neue Variante von craig braucht aber nur noch ca. 1-2 Sekunden.
Aber auch die beiden Varianten von Dir sind weiterhin eine Hilfe für mich, denn ich kann sie benützen, um mehr Verständnis zu bekommen.
Bin nicht direkt in Wien zu Hause, ca. 50 km südlich.
Und wo hält Dich Corona fest?

Hallo craig
Deine Variante, die den Arbeitsspeicher im PC zum Rechnen benützt, ist sehr schnell und benötigt nur etwas mehr als 1 Sekunde.
Nur habe ich festgestellt, dass die Daten der Spalte B , die die Uhrzeit wiedergeben, an 2 Stellen nicht richtig sind. Es gibt Abweichungen von 1 bis 2 Sekunden von der tatsächlichen Zeit.
Ich habe einen meiner längeren Meßdurchläufe als Anhang beigefügt.
Wenn Du mit Deinem Makro die beiden Spalten A & B ergänzt, kannst Du die Fehler, die ziemlich regelmäßig im Bereich Zeilenzahl 16102/06 und 23619 bis 23625 auftreten, sehen.
Ich kann mir vorstellen, dass das ein Ergebnis der Umrechnung von HH:MM:SS in eine Dezimalzahl und zurück ist.
In deinem Makro habe ich kleine Änderungen vorgenommen und zwar

* in Zeile 34 von (“A2:D5000“) in (“A4:D50000“),
* in Zeile 38 von (“B2:C5000“) in (“B4:C50000“) und
* in Zeile 110 (“B2:C5000“) in (“B4:C50000“) geändert.
* In Zeile 40 habe ich (“B2“) in (“B4“) geändert.


Den Eintrag in Zelle A4 möchte ich von 0 in 1 ändern.
Welchen Eintrag im Makro muß ich ändern?
Und noch die Frage, ist es möglich Dein Makro innerhalb einer Dokumentenvorlage automatisch zu starten (ohne maneullen Eingriff) ?

Ich wünsche Euch noch einen ruhigen Weihnachtsrestsonntag
natal

craig
* LO-Experte *
Beiträge: 1137
Registriert: Do 21. Apr 2016, 11:42

Re: variable Zellenzahl ermitteln

Beitrag von craig » So 27. Dez 2020, 13:34

Hallo Natal,

Deine Musterdatei enthält kein Makro.

Erbitte Makro, so wie es bei Dir in geänderter Form vorliegt.
Gruß

Craig

Nie die Sicherungskopie vergessen!

════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8

natal
Beiträge: 120
Registriert: So 8. Mär 2020, 20:03

Re: variable Zellenzahl ermitteln

Beitrag von natal » So 27. Dez 2020, 15:46

Hallo craig
Eigentlich weis ich nicht, wie ich einen Macrolink als Link weitergeben kann.
Ich habe mehrere Versuche gemacht und auf einmal ist ein Link, ohne dass ich es verstehe, am Anfang meines letzten Schreibens aufgetaucht (als Meßdurchlauf.ods).
Ich nehme an (oder ich hoffe), dass Du ihn auch siehst.
Aber zur Sicherheit, schicke ich ihn Dir noch als einfache Kopie
Macro.odt
(14.33 KiB) 209-mal heruntergeladen
.
Ich hoffe Du kannst damit etwas anfangen

Gruß

nitja
Beiträge: 190
Registriert: Di 20. Okt 2020, 15:55

Re: variable Zellenzahl ermitteln

Beitrag von nitja » So 27. Dez 2020, 16:29

Hab jetzt mal auch das Einlesen der Zeiten ("Dauer") per array gemacht und, siehe da, braucht auch bei Deinem Beispiel ("Meßdurchlauf") keine 2 Sekunden mehr. Und das auf einem 10 Jahre alten Rechner.

Code: Alles auswählen

REM  *****  BASIC  *****

option explicit

Sub fill
	dim lStart as integer, dtStart as date, n as long, da(), ta() as double, i as long
	lStart = 4
	with thiscomponent.sheets(0)
		.getCellByPosition(0,lStart-1).value = 1		'sollte unnötig sein, wenn die Zelle in der Vorlage gleich mit 1 belegt wurde (womit auch sonst?)
		dtStart = .getCellByPosition(1,lStart-1).value
		n = .columns(3).computeFunction(com.sun.star.sheet.GeneralFunction.COUNTNUMS)-2
		redim da(n,1), ta(n) as double
		ta = .getCellRangeByPosition(2,lStart,2,lStart+n).getDataArray()
		for i=0 to n
			da(i,0) = i+2
			da(i,1) = dtStart+ta(i)(0)
		next i
		.getCellRangeByPosition(0,lStart,1,lStart+n).setFormulaArray(da)
		.getCellRangeByPosition(1,lStart,1,lStart+n).NumberFormat=41
	end with
End Sub

Sub reset	
	dim lStart as integer, oRangeAddress as object, n as long
	lStart = 4
	with thiscomponent.sheets(0)
		n = .columns(3).computeFunction(com.sun.star.sheet.GeneralFunction.COUNTNUMS)-2
		oRangeAddress = .getCellRangeByPosition(0,lStart,1,lStart+n).getRangeAddress
		.removeRange(oRangeAddress, com.sun.star.sheet.CellDeleteMode.UP)
	end with
End Sub
Die Startzeile (lStart) hab ich mal vor den eigentlichen Code gestellt, da sich die in Deinen Beispielen jedes mal geändert hat und so leichter anzupassen ist.

Bleibt der Aufruf ohne "Knöpfenklicken" o. ä., wenn Du einen Messdurchlauf in Deine Vorlage (.ots) füllst und das Ergebnis als .ods-Datei speicherst.
Wie ist da Dein genauer (geplanter?) "work flow"?

<OT> Die Seuche hat mich in München eingesperrt, anstatt mit meinen Kindern im 2. und 6. Bezirk zu feiern. </OT>
LO 24.2.0.3 (X86_64) auf Linux 6.6.26-1-MANJARO, gnome 45.4, (gtk 4) gtk3 für LO

natal
Beiträge: 120
Registriert: So 8. Mär 2020, 20:03

Re: variable Zellenzahl ermitteln

Beitrag von natal » So 27. Dez 2020, 17:52

Die Verarbeitungszeit von diesem Makro liegt jetzt auch im Sekundenbereich.
Nur die Zeiteintragungen in der Spalte B, stimmen nicht (siehe Anhang).
Da müßte ich Dich noch bitten, das zu korrigieren.
Du kommst nicht nach Wien und mein Sohn sitzt in Nürnberg fest.

Gruß
natal
nitja_27.12.20.ods
(535.37 KiB) 209-mal heruntergeladen

nitja
Beiträge: 190
Registriert: Di 20. Okt 2020, 15:55

Re: variable Zellenzahl ermitteln

Beitrag von nitja » So 27. Dez 2020, 18:05

DAS ist eigenartig - hat auf meinem Rechner funktioniert. … wird interessant. ;)

Hier die "Meßdurchlauf"-Datei mit dem Makro:
natals Meßdurchlauf.neu.ods
(988.62 KiB) 180-mal heruntergeladen
Und so startest das Makro aus der IDE:
Bildschirmfoto von 2020-12-27 18-10-37.jpg
Bildschirmfoto von 2020-12-27 18-10-37.jpg (410.83 KiB) 3073 mal betrachtet
Nachtrag - die Tabelle nach Durchlauf des "fill"-Makros:
Bildschirmfoto von 2020-12-27 19-50-42.png
Bildschirmfoto von 2020-12-27 19-50-42.png (976.63 KiB) 3066 mal betrachtet
Zuletzt geändert von nitja am So 27. Dez 2020, 20:05, insgesamt 1-mal geändert.
LO 24.2.0.3 (X86_64) auf Linux 6.6.26-1-MANJARO, gnome 45.4, (gtk 4) gtk3 für LO

craig
* LO-Experte *
Beiträge: 1137
Registriert: Do 21. Apr 2016, 11:42

Re: variable Zellenzahl ermitteln

Beitrag von craig » So 27. Dez 2020, 19:26

Hallo Natal,
1 hat geschrieben:Ich kann mir vorstellen, dass das ein Ergebnis der Umrechnung von HH:MM:SS in eine Dezimalzahl und zurück ist.
In deinem Makro habe ich kleine Änderungen vorgenommen und zwar
Nein daran liegt es nicht, sondern an einem Rundungsfehler, welcher aber in Folge dazuführt, dass die Textanzeige [HH:MM:SS] variiert.
Calc ist nicht in der Lage mit mehr als 20 Nachkommastellen (10^-20) zuarbeiten.
Ich habe den Dezimalwert für die Zeit aus einer Calc-Tabelle kopiert und in die IDE eingefügt, also 20 Nachkommastellen. Die Basic-IDE scheint aber in der Lage zu sein, bis in der Yokto-Bereich (10^-24) genau zu arbeiten.
Habe die Genauigkeit versucht weiter hochzutreiben, bis auf (10^-42). Konnte im Calc-Dokument keine Besserung feststellen.
Yokto scheint die minimalste Größe zu sein, mit der die IDE arbeitet, sicher weiß ich dies nicht.

Code: Alles auswählen

fSekunde1=0.0000115740740740741 ' Dezimalwert für eine Sekunde
Im allgemeinen reicht diese Genauigkeit für Zeitberechnungen vollkommen aus. Bei Dir hat sich nun herausgestellt, dass dieses nicht so ist, deshalb habe ich in der IDE die Genauigkeit erhöht:

Code: Alles auswählen

fSekunde1=0.000011574074074074074074 ' Dezimalwert mit höherer Genauigkeit für eine Sekunde

Code: Alles auswählen

0.	000	011	574	074	074	074	1
0.	000	011	574	074	074	074	074	074
	Milli	Micro	Nano	Piko	Femto	Atto	Zepto	Yokto
Yokto = 10^-24  = 1 quadrillionstel Teil einer Sekunde
Natal hat geschrieben:Den Eintrag in Zelle A4 möchte ich von 0 in 1 ändern.
Welchen Eintrag im Makro muß ich ändern?
Habe ich erledigt.
Der Zähler nCnt3 enthält die Positionsanzahl:

Code: Alles auswählen

mDaten(nCnt1)(0)= nCnt3 + 1				' Spalte A aktuelle Zeile [nCnt1] = [nCNT3] + 1
Damit der Gesamtzähler richtig funktioniert habe ich auch dies geändert werden:

Code: Alles auswählen

oSheet.getCellRangeByName("H2").Value=nCnt3
Natal hat geschrieben:Und noch die Frage, ist es möglich Dein Makro innerhalb einer Dokumentenvorlage automatisch zu starten (ohne maneullen Eingriff) ?
Dazu habe ich hier eine Dokumentvorlage mit geändertem Makro hochgeladen und die Ereignisse angepasst.
In Spalte E und F der Vorlage habe ich Wenn-Funktionen eingetragen, um schnell die Richtigkeit der Zeitergebnisse zu prüfen.
In der Vorlage ist der Zellbereich (A9:C20) extra leer, aus diesem Grunde erscheint im Zellbereich (E9:E21) die Meldung „FALSCH“. Wenn das Makro durchgelaufen ist, erscheint hier wieder "OK"

Weitere Informationen in der Vorlage:
Messprogramm.ots.ods
(1.19 MiB) 184-mal heruntergeladen
Eine Dokumentvorlage läßt sich in diesem Forum nicht hochladen, deshalb:
Nach dem Download musst Du die Datei umbenennen:
Messprogramm.ots.ods
Messprogramm.ots
Gruß

Craig

Nie die Sicherungskopie vergessen!

════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8

natal
Beiträge: 120
Registriert: So 8. Mär 2020, 20:03

Re: variable Zellenzahl ermitteln

Beitrag von natal » So 27. Dez 2020, 20:59

@ nitja
Dieses Mal hat dein Makro einwandfrei funktioniert.
Vielleicht habe ich beim Kopieren einen Fehler gemacht.

Ich habe mir eine Dokumentenvorlage erstellt.
Vor dem Start dieser Vorlage muß ich zuerst die Meßwertdaten, die während eines Meßwertdurchlaufs in einer CSV-Datei abgelegt wurden, in die Spalten C und D (Uhrzeit, Meßwerte) und das Datum in Zelle B4 per c&p eingeben.
Danach werden mit Formeln, die in der Vorlage gespeichert sind z.B. der Max-Wert, der Min-Wert, der Mittelwert, eine prozentuale Verteilung, Häufigkeitsverteilung u.s.w. errrechnet.
Ohne Macro müßen aber schon in der Vorlage in 50000 Zellen der Spalte A und Spalte B (um auch lange Meßdurchläufe zu berücksichtigen) die jeweilige Formel für den Datenzähler und die dazugehörige Uhrzeit des Meßvorganges vorhanden sein.
Mit Macro kann ich diesen Schritt weglassen, denn mit dem Makro werden nur soviele Zellen der Spalten A und B gefüllt, wie Zellen der Spalte D mit Inhalt vorhanden sind.

Das bedeutet, ich müßte innerhalb der Vorlage das Makro so ablegen können, das es nach Eingabe der entsprechenden Werte in Spalte C & D den Inhalt der Spalten A & B automatisch errechnet.

Gerade habe ich die Antwort von craig gesehen.
Ich kann sie aber heute leider nicht mehr beantworten.

Grüße
natal


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten