🙏 Bitte helfen Sie uns das LibreOffice Forum zu erhalten. 🙏
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.

🍀 Wir hoffen auf Ihre Unterstützung - vielen Dank!🍀

❤️ 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.
natal
Beiträge: 120
Registriert: So 8. Mär 2020, 20:03

Re: variable Zellenzahl ermitteln

Beitrag von natal » Mo 21. Dez 2020, 17:38

Hallo
Meine Vorstellung ist folgende:

Ich habe eine Spalte A, deren erste Zelle mit Inhalt (z.B.) Zelle A11 ist.
Wieviele belegte Zellen es in Spalte A gibt, weis ich nicht und möchte ich auch nicht z.B. mit einer Formel wie =max(A11:A50000) oder einer anderen Formel ermitteln.

Spalte B sollte leer sein d. h. es sollten auch keine Inhalte mit copy&paste eingefügt sein und auch nicht eingefügt werden.

Das Makroprogramm sollte zuerst in Zelle B11 (entsprechend der Zelle A11) den Inhalt 1 schreiben, danach in Zelle B12 den Inhalt 2 u.s.w. bis in Spalte A die letzte gefüllte Zelle (z.B. A4567) erreicht ist und in Zelle B4567 der Inhalt 4567 steht.
Danach müßte das Makroprogramm selbstständig stoppen.
.

Zu meinen Problemen mit den Macros, die ich von Euch bekommen habe.
Was mache ich mit z.B. dem Makro von craig, wie benütze ich es?
Das Gleiche trifft auch auf das Macro von nitja zu.
Beim Makro von nitja z.B. sehe ich nur eine lange Zahlenreihe, in der hinter jeder Zelle die gleiche Formel steckt.
Im Calculator finde ich unter Extras<Makros<Makros bearbeiten ein Fenster „Meine Makros & Dialoge.Standard in das ich das Makro (glaube ich) eingeben sollte.
Nur wie?

Gruß
natal

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

Re: variable Zellenzahl ermitteln

Beitrag von craig » Mo 21. Dez 2020, 18:45

Hallo Natal,

damit Makros in Office ausgeführt werden, musst Du u.U.
den Sicherheitsmodus anpassen.
Standardmäßig steht dieser auf "HOCH", daran sind aber ein paar
Voraussetzungen gebunden, damit mein Makro in diesem Modus startet.

Deshalb empfehle ich Dir ersteinmal die einfache Variante mit Modus = "MITTEL".

  1. Menü Extras → Optionen
  2. LibreOffice → Sicherheit
  3. Button "Makrosicherheit"
  4. Im anschließenden Fenster die Sicherheit auf "MITTEL" stellen.
  5. Office neustarten


Jetzt mein Dokument öffnen und die SicherheitsabfraGE MIT "JA" beantworten, also Makros sollen ausgeführt werden.

Jetzt fehlt noch ein Schritt:
Damit der CommandButton im Tabellenblatt funktioniert, muss ggf. der Formular-Entwurfsmodus ausgeschaltet werden.
Dazu:

Menü Ansicht → Symbolleisten → "Formularentwurf"

In dieser Symbolleiste befindet sich folgendes Symbol:
Formular Entwurfsmodus.jpg
Formular Entwurfsmodus.jpg (1.22 KiB) 3263 mal betrachtet
Damit läßt sich der Entwurfsmodus ein-/ausschalten.
Ausgeschaltet bedeutet, die Schaltfläche ist aktiv und führt das
zugewiesene Ereignis, in diesem Fall das Makro aus.

-----------------------------------------------------
Menü Extras → Makros → Makros bearbeiten...

Nun muss Du wissen, dass der Makrocode in ein Modul geschrieben wird. Ein Modulblatt kann mehrere Makros/ Sub-Routinen und Funktionen beinhalten.

Die Hierachie ist so aufgebaut:
  1. Meine Makros & Dialoge
    Darunter kann man sogenannte Bibliotheken, quasi Ordner anlegen und in diese Bibliotheken werden die eigenen Makros und Funktionen gespeichert.
    Das speichern funktioniert an dieser Stelle automatisch in dem Augenblick wo Office beendet wird.
    Sie werden im Benutzerprofil im Ordner Basic gespeichert.
  2. LibreOffice Makros & Dialoge
    Hierin befinden sich vorgefertigte Funktionen, welche man in seinen eigenen Makros verwenden kann (fortgeschrittenen Kurs).
    Es wird dringend davon abgeraten hier irgendwelche eigene Makros und/ oder Dialoge abzulegen
  3. Die Standard-Bibliothek
    Dann besitzt jedes Dokument eine Hauptbibliothek namens „Standard“, so auch unter „Meine Makros & Dialoge/ Standard“
Entweder man legt sich „Meine Makros & Dialoge“ und/oder im Dokument eigene Bibliotheken an, die dann zur Aufnahme der eigentlichen Makros dienen, oder man speichert diese in der „Standrad-Bibliothek“, also ganz nach belieben.

Am besten Du öffnest die Basic-IDE und schaltest über Menü Ansicht den Objektkatalog ein, dann kannst meine Beschreibung direkt vergleichen.

Öffne mein Dokument und wechsle in die Basic-IDE.
Bei geöffnetem Objektkatalog siehst Du in der Auflistung mein Dokument mit meinem Makro:
Meßdaten zählen mit Makro.ods → Standard → modDatenzaehler
und die Sub-Routine/ das Makro heißt → Sub [Datenzähler]

Damit Du das Makro in jedem Calc-Dokument nutzen kannst, musst Du es in ein neues Modul, ggf. auch in eine neue Bibliothek unter „Meine Makros & Dialoge“ kopieren.

Öffne aus dem Objektkatalog heraus wie folgt:
Meine Makros & Dialoge/Standard/Module1

Ersetze die an sich leere Routine durch den Code aus meinem Dokument.

Ersetze dies:

Code: Alles auswählen

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

Sub Main

End Sub
durch:

Code: Alles auswählen

REM  *****  BASIC  *****
Option Explicit

REM Messdaten zählen
Sub [Datenzähler]
Dim oDoc as Object
Dim oSheet as Object
Dim oRange1 as Object
Dim oRange2 as Object

Dim mDaten() as Variant

Dim nCnt1 as Long, nCnt2 as Long, nCnt3 as Long
Dim nConst as Long

	' Referenz: aktuelles Dokument
    oDoc = ThisComponent
			' Referenz: erstes Tabellenblatt Index = 0
			' oSheet = oDoc.Sheets(0)
				'ODER SO:
					' Referenz: Tabellenblatt | den Blattnamen bitte anpassen
				    oSheet = oDoc.Sheets().getByName("Tabelle1")
		' Referenz: Zellbereich A2:B5000 | ggf. anpassen
        oRange1 = oSheet.getCellRangeByName("A2:B5000")
			   	    
			' Referenz: Zellbereich B2:B5000 | ggf. anpassen lezte Zeile 
			' muss mit der vorherigen Referenz übereinstimmen; also beide 5000
	        oRange2= oSheet.getCellRangeByName("B2:B5000")

	' Inhalt von SPALTE B löschen. 
	' addieren der Zellinhaltstypen, die 
	' gelöscht werden sollen
	nConst = com.sun.star.sheet.CellFlags.STRING + _
		com.sun.star.sheet.CellFlags.VALUE' + _
'		com.sun.star.sheet.CellFlags.FORMULA
	' löschen über com.sun.star.sheet.XSheetOperation
	oRange2.clearContents( nConst )

' Statusmeldung 1
Msgbox "In Spalte B wurden Zähler gelöscht!",48,"Löschaktion beendet"


			' Referenz: Array dimensionieren und mit Daten aus Zellbereich (Spalte A und B) befüllen
			' Warum Spalte B? B ist zwar zuvor gelöscht worden, aber nur so kann der gesamte
			' Datenbereich in das Array übernnommen werden
    	    mDaten()=oRange1.getDataArray()

' Datenzähler initialisieren
nCnt3=1
		' Schleife von Untergrenze bis Obergrenze des Arrays
		For nCnt1=0 to UBound(mDaten())

			' Das Array spiegelt den Zellbereich A2:Bxxx wieder.
			' mDaten(Zeilen)(Spalten)
			' mDaten(nCnt1)(0) ist bei ersten Durchgang mDaten(0)(0)
			' und entspricht Zeile1 des Zellbereichs und Spalte A des Zellbereichs
			' Also ist beim ersten Duchrgang die Frage:
			' WENN mDaten(0)(0) = LEER, DANN
			If mDaten(nCnt1)(0) = "" then
				' Wenn LEER, DANN mache nichts
			Else ' SONST
				' WENN mDaten(0)(0) = NICHT LEER, DANN
				' schreibe in Spalte B des Array den aktuellen Datenzählerwert.
				' Beim ersten Durchlauf steht dieser auf 1
				mDaten(nCnt1)(1)= nCnt3 
					' Zähnler inkrementieren/ hochzählen
					nCnt3=nCnt3+1
			End If
		Next nCnt1
		
		' den kompletten Arrayinhalt in Zellbereich schreiben
		oRange1.setDataArray(mDaten())
' Statusmeldung 2
Msgbox "Die Zählung ist abgeschlossen." & chr(10) &  _ 
		"In Spalte A befinden sich " & nCnt3 & " Messdaten" & chr(10) &  _ 
					"________________________________________"  & chr(10) &  _ 
					"Leere Zellen in Spalte A wurden nicht mitgezählt.",32,"Programmende"
End Sub
In den Code habe ich Kommentare geschrieben, welche bei der Abarbeitung des Makros ddurch den Basic-Interpreter ignoriert werden.
Bei Kommentaren muss entweder ein Hochkomma oder ein REM gefolgt von eine Leerschritt gesetzt werden, beides findest Du in meinem Code.

Lese diese Kommentare, danach kannst Du selbst die ersten Änderungen am Code vornehmen.

http://wiki.documentfoundation.org/imag ... ng_V41.pdf
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 » Mo 21. Dez 2020, 18:59

natal hat geschrieben:
Mo 21. Dez 2020, 17:38

Beim Makro von nitja z.B. sehe ich nur eine lange Zahlenreihe, in der hinter jeder Zelle die gleiche Formel steckt.
Im Calculator finde ich unter Extras<Makros<Makros bearbeiten ein Fenster „Meine Makros & Dialoge.Standard in das ich das Makro (glaube ich) eingeben sollte.
Die "Zahlenreihe" in Spalte A ist ein Ersatz, ein Beispiel für Deine möglichen Messdaten (zwischen 0 und 200). Hat mit dem Makro nichts zu tun.
Das Makro ist weder in "Meine Makros & Dialoge" noch in "LibreOffice Makros & Dialoge", sondern im Dokument selbst. Das wird Dir auch in "Extras→Makro…" angeboten. Von dort, also von der basic-IDE, kannst Du es dann auch starten und den Effekt sehen.
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 » Do 24. Dez 2020, 15:34

Meßprogramm.ods
(12.27 KiB) 160-mal heruntergeladen
Hallo craig
Danke für Deine ausführliche Anleitung, denn damit konnte ich meine etwas vereinfacht beschriebene Aufgabe lösen und auch teilweise verstehen.
Ich habe anschließend versucht eine etwas geänderte Situation selber zu lösen, war aber nicht erfogreich.
Bei dieser abgewandelten Ausgangslage habe ich zwischen der Spalte A “Meßdaten“ und der neuen Spalte C “Datenzähler“ eine Leerspalte B eingefügt.

Soweit ich Dein Macro “modDatenzaehler“ verstehe, müßte ich nur in den Zeilen
oRange1 = oSheet.getCellRangeByName("A2:C5000")
oRange2= oSheet.getCellRangeByName("C2:C5000")

Änderungen vornehmen.

Habe ich auch gemacht aber mit keinem Erfolg.

Meine tatsächliche Ausgangslage sieht folgendermaßen aus (siehe Anhang):
* Spalte A & B müßte ich mit einem Macro füllen
der Inhalt von Zelle B2 wird vom Meßprogramm geliefert, der Inhalt von B3 ergibt sich
aus der Formel =$B$2+C3 und B4 wäre =$B$2+C4 u.s.w.
* Spalte C & D wird vom Meßprogramm übernommen

Jetzt wieder die gleiche Frage, wie mache ich das?
Könnt Ihr mir dabei auch noch helfen?

Vielen Dank im Voraus
natal

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

Re: variable Zellenzahl ermitteln

Beitrag von nitja » Do 24. Dez 2020, 22:33

natals messprogramm.neu.ods
(17.21 KiB) 182-mal heruntergeladen
Hier siehst Du, wo die Makros (innerhalb der .ods-Datei) gespeichert sind:
Bildschirmfoto von 2020-12-24 22-24-51.png
Bildschirmfoto von 2020-12-24 22-24-51.png (75.97 KiB) 2934 mal betrachtet

Code: Alles auswählen

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

option explicit

Sub fill
	dim oRange as object, n as integer, i as integer, sa() as string
	with thiscomponent.sheets(0)
		n = .columns(3).computeFunction(com.sun.star.sheet.GeneralFunction.COUNTNUMS)
		redim sa(n,1) as string
		for i=0 to n-2
			sa(i,0) = "=ROW()-1"
			sa(i,1) = "=$B$2+C" & (i+3)
		next i
		.getCellRangeByName("A2").value = 1
		oRange = .getCellRangeByPosition(0,2,1,n+2)
		oRange.setFormulaArray(sa)
	end with
End Sub

Sub reset	
	dim oRangeAddress as object, n as integer
	with thiscomponent.sheets(0)
		n = .columns(3).computeFunction(com.sun.star.sheet.GeneralFunction.COUNTNUMS)
		oRangeAddress = .getCellRangeByPosition(0,2,1,n).getRangeAddress
		.removeRange(oRangeAddress, com.sun.star.sheet.CellDeleteMode.UP)
	end with
End Sub
Und hier siehst Du die Schaltflächen, mit denen die Makros gestartet werden können …
(Löschen ist zum Testen, stellt (fast) den Ursprungszustand her):
Bildschirmfoto von 2020-12-24 22-28-02.png
Bildschirmfoto von 2020-12-24 22-28-02.png (15.62 KiB) 2934 mal betrachtet
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 » Fr 25. Dez 2020, 18:24

Hallo nitja
Danke für Deine Antwort.
Ein Meßdurchlauf kann in meinem Fall bis zu 45000 Einzelmeßwerte liefern.
Mit dem Makro von Dir kann ich aber nur ca. 32000 Meßwerte verarbeiten, danach stoppt das Makro und es kommt die Meldung “Unzulässiger Wert oder Datentyp. Überlauf“.
Ob das nur ein Problem meines PC's ist, weis ich nicht.
Für die Verarbeitung von den 32000 Meßwerten braucht das Makro ca. 2,5 Minuten.
Gibt es eine andere Makroversion, die diese Einschränkungen nicht hat?

Und noch eine Frage.
Für die Auswertung eines Meßdurchlaufs habe ich mir eine Vorlage, die auch verschiedene Zwischenergebnisse errechnet, erstellt.
Besteht die Möglichkeit, dass beim Vorlagenstart automatisch auch ein Makro (ohne zusätzliche manuelle Eingaben) gestartet wird?

Gruß
natal

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

Re: variable Zellenzahl ermitteln

Beitrag von nitja » Fr 25. Dez 2020, 19:34

natal hat geschrieben:
Fr 25. Dez 2020, 18:24
… Mit dem Makro von Dir kann ich aber nur ca. 32000 Meßwerte verarbeiten, …
Ok, hab ich nicht dran gedacht. → Datentyp long statt integer.
natal hat geschrieben:
Fr 25. Dez 2020, 18:24
Für die Verarbeitung von den 32000 Meßwerten braucht das Makro ca. 2,5 Minuten.
Gibt es eine andere Makroversion, die diese Einschränkungen nicht hat?
Ja, kann ich leicht und relativ schnell machen: Berechnungen im Makro, statt via Formel in den Zellen. (Dachte, dass diese Version Dir leichter verständlich ist, wusste aber, dass es nicht die schnellste ist.)
natal hat geschrieben:
Fr 25. Dez 2020, 18:24
Besteht die Möglichkeit, dass beim Vorlagenstart automatisch auch ein Makro (ohne zusätzliche manuelle Eingaben) gestartet wird?
Ja, Details folgen mit dem neuen Makro.

<OT> Wohnst Du in Wien? Da wäre ich z.Z. lieber, wenn halt die Seuche nicht wäre. </OT>
Zuletzt geändert von nitja am Sa 26. Dez 2020, 13:11, 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

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

Re: variable Zellenzahl ermitteln

Beitrag von nitja » Fr 25. Dez 2020, 20:47

Hier erstmal die Version 2 für das "Messprogramm" mit dem angepassten Makro:
natals messprogramm.v2.ods
(14.82 KiB) 198-mal heruntergeladen
Im Prinzip alles (ausführen & testen) wie gehabt.
Teste an dem erst mal Bereich & Geschwindigkeit.
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 » Sa 26. Dez 2020, 11:18

Hallo,

und hier meine Variante:
Meßprogramm neu Makro_v1.ods
(17.38 KiB) 191-mal heruntergeladen
  1. Die Daten aus dem Zellbereich A2:D50000 werden in einem Array gespeichert.
    Dieser Vorgang dient auch der Dimensionierung des Array's
  2. Der Wert aus Zelle B2 wird in einer separaten Variablen zwischengespeichert.
  3. Der Zellbereich A2:C50000 wird gelöscht.
    Wenn auch Spalte D gelöscht werden soll, dann in Zeile 60 den Zellbereich ändern

    Code: Alles auswählen

    oSheet.getCellRangeByName("A2:D50000").clearContents( nConst )
  4. Jetzt werden die Arrayfelder per Schleife auf den jeweiligen Inhalt geprüft und berechnet.
    Weiter Beschreibungen in den Kommentaren.
  5. Der gesamte Array-Inhalt wird nun an einem Stück in den Zellbereich A2:D50000 zurückgeschrieben.
  6. Der Zellbereich B2:C50000 wird per Formatcode formatiert und so auf HH:MM:SS gesetzt.
  7. In Zelle H2 wird das Gesamtergebnis der Zählung geschrieben.
Das Arbeiten mit Array's bringt einen großen Geschwindigkeits-
vorteil im Gegensatz zu direkten Zelloperartionen mit sich.
Alle Berecnungen und Zuweisungen finden im Arbeitsspeicher statt.

Ich wünsche frohe Weihnachten!
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, 16:31

craig hat geschrieben:
Sa 26. Dez 2020, 11:18
Die Daten aus dem Zellbereich A2:D50000 werden in einem Array gespeichert.
Dieser Vorgang dient auch der Dimensionierung des Array's
Bin gespannt, wie sich das bei natals anstehendem Geschwindigkeitstest auswirkt. Die Spalte C, soweit sie gefüllt ist, per getArray auszulesen wirkt jedenfalls sinnvoll. Inwiefern sich die Geschwindigkeit der Dimensionierung bei dem Verfahren in Vergleich zu meinem ändert, kann ich nicht abschätzen. Um so spannender, was natals nächster Test ergibt.
LO 24.2.0.3 (X86_64) auf Linux 6.6.26-1-MANJARO, gnome 45.4, (gtk 4) gtk3 für LO


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