❤️ Helfen Sie noch heute, unser LibreOffice Forum zu erhalten! ❤️
Unterstützen Sie das LibreOffice-Forum und helfen Sie uns, unser Ziel für 2025 zu erreichen!

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱


❤️ 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. 🤗

Zellen automatisch mit Zwischenwerten ausfüllen

CALC ist die Tabellenkalkulation, die Sie immer wollten.
Pepe5
Beiträge: 9
Registriert: Fr 12. Jan 2018, 14:40

Zwischenwerten automatisch über Makro ausfüllen

Beitrag von Pepe5 » Mo 29. Jan 2018, 18:10

Das mit Formeln fand ich dann doch nicht so ideal. Habe ein Makro gestrickt. Habs hier im Text für alle angefügt für alle, die ungern fremde Dateien mit Makros öffnen. Scheint aber sowieso nicht möglich zu sein, .ods-Dateien die Makros enthalten hochzuladen

Mir ist es ja wichtig, die aktiven Einträge von den berechneten unterscheiden zu können. Um zu verhindern, daß bei den Berechnungen der Zwischenwerte zufällig glatte Ergebnisse heraus kommen, addiere ich zu jedem Zwischenwert 0.00000000000031. Für meinen Zweck stört diese eingebrachte Ungenauigkeit nicht. Es erlaubt aber, per bedingter Formatierung alle aktiven Einträge hervorzuheben.

Was ich dabei kurios finde, daß diese absichtliche Verfälschung der Ergebnisse bei einem glatten Zwischenwert wie z.B. 25 (Spalte B) nicht abgebildet wird. Allerdings wird mit dem addierten Wert „fast“ korrekt weiter gerechnet. Beispiel B5:
Gemäß Makro hätte angezeigt werden müssen: 45,00000000000031
Angezeigt wird zu wenig 45,00000000000030
gerechnet wird mit zu viel 45,000000000000312638803734444
(die Stellen nach dem Komma habe ich über die Subtraktion B5-45 und Kopieren des Ergebnis als Wert in B21 erhalten)

Möglicherweise liegt es daran, wie ich die DIM-Werte deklariert habe. Aber eigentlich sollte das keine Auswirkungen haben. In Spalte C ist dagegen alles korrekt dargestellt und berechnet.
In jedem Fall funktioniert es in einer für meine Zwecke ausreichenden Genauigkeit.


######################
Sub Zwischenwerte()
Dim x As Long, y As Long, a As Long
Dim EintragOben As double, EintragUnten As double
Dim ZwiWert As Double
Dim ZwiSumme As Double
Dim ZwiZell As Long
Dim ZwiIndikator

x = Selection.Rows(1).Row
y = Selection.Rows.Count + x - 1
a = ActiveCell.Column
ColCount = Selection.Columns.Count
'
'ZwiIndikator verhindert fehlende Nachkommastellen
'über Nachkommastellen wird die bedingte Formatierung gesteuert
ZwiIndikator = 0.00000000000031
'
If ColCount > 1 Then
MsgBox "Bitte nur 1 Spalte wählen"
Exit Sub
End If
'
If Selection.Rows.Count = 1 Then
MsgBox "Bitte einen Bereich auswählen"
Exit Sub
End If
'
EintragOben = Cells(x, a)
EintragUnten = Cells(y, a)
ZwiWert = (EintragUnten - EintragOben) / (Selection.Rows.Count - 1) + ZwiIndikator
'

For ZwiZelle = 1 To Selection.Rows.Count - 2
Cells(x + ZwiZelle, a).Select
ActiveCell.Formula = Cells(x + ZwiZelle - 1, a).Value + ZwiWert
Next
End Sub
Dateianhänge
Zwischenwerte_Berechnen.ods.zip
(88.08 KiB) 91-mal heruntergeladen

mikele
* LO-Experte *
Beiträge: 1947
Registriert: Mo 1. Aug 2011, 20:51

Re: Zellen automatisch mit Zwischenwerten ausfüllen

Beitrag von mikele » Mo 29. Jan 2018, 20:44

Hallo,
für die bedingte Formatierung wäre einfacher, die Zellen mit Formeln zu füllen, wenn auch ganz einfachen, wie

Code: Alles auswählen

=25,3
In meinem Beispiel mal eine Makrolösung, die in dem ausgewählten Bereich alle leeren Zellen ausfüllt und dabei auch zwischendurch eingetragene Werte beachtet. Es wird dabei nur die erste Spalte der Auswahl benutzt.

Code: Alles auswählen

Sub Main

	oDoc=Thiscomponent
	oSel=oDoc.CurrentController.Selection
	
	if oSel.supportsservice("com.sun.star.sheet.SheetCellRanges") then
		msgbox "Nur einen zusammenhängenden Bereich markieren!"
	else
		bereiche=osel.queryEmptyCells
		for i=0 to bereiche.count-1
			spalte=bereiche.RangeAddresses(i).StartColumn
			von=bereiche.RangeAddresses(i).StartRow
			if von=0 then von=1
			bis=bereiche.RangeAddresses(i).EndRow
			aformeln()=bereiche.getbyIndex(i).getFormulaArray()
			min=osel.Spreadsheet.getCellByPosition(spalte,von-1).Value
			max=osel.Spreadsheet.getCellByPosition(spalte,bis+1).Value
			n=ubound(aformeln())
			for k=0 to n
				aformeln(k)(0)="=" & str(min+(max-min)/(n+2)*(k+1))
			next
			bereiche.getbyIndex(i).setFormulaArray(aformeln)
		next
	end if
	
End Sub
Dateianhänge
Makro Zwischenwerte_Berechnen.ods
(11.94 KiB) 95-mal heruntergeladen
Gruß,
mikele

Pepe5
Beiträge: 9
Registriert: Fr 12. Jan 2018, 14:40

Re: Zellen automatisch mit Zwischenwerten ausfüllen

Beitrag von Pepe5 » Di 30. Jan 2018, 12:55

Hallo Mikele,

so hat jeder seine Makro-Handschrift. Dein Ansatz ist mehr der elegante. Meine Version können Leute, die Angst vor Makros haben leichter durchschauen. Ich denke nur daran, wie allein der Begriff „Array“ bei manchem Kollegen totale Verwirrung auslöst. Dann noch kombiniert mit Index. Wenn ich mir vorstelle, wie wohl ein Makro aussähe, daß die ganze Geschichte als 3D-Funktion über 50 Tabellenblättern durchrechnet ... das ist keine Aufforderung - war nur so ein Gedankenblitz.

Naja hoffen wir mal, daß der eine oder andere Forum-Nutzer bei Bedarf diesen Thread und seine Lösungen findet.

Ich werde mich jetzt noch auf den Weg machen, etwas über die hinter der Oberfläche ablaufenden Rechen- und Darstellungsmethode sowie Genauigkeit von LibreOffice zu finden.

Gruß
Pepe5


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