🙏 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] Nur markierte Zellen bearbeiten

Alles zur Programmierung im LibreOffice.
Antworten
Statistiker
Beiträge: 29
Registriert: Mi 7. Okt 2020, 16:47
Wohnort: Westsachsen

[Gelöst] Nur markierte Zellen bearbeiten

Beitrag von Statistiker » Fr 2. Mai 2025, 16:46

Hallo

bisher hatte ich ein Makro gefunden und genutzt, bei dem man im markierten Bereich die einzelnen Zellen bearbeiten konnte, also z.B. multiplizieren oder dividieren. Dies galt aber nur für einen zusammenhängenden Bereich. Sobald ich die Zellen als nicht zusammenhängenden Bereich maskierte (Strg+Cursor) gab es bei der Ausführung des Makros eine Fehlermeldung und das Makro stieg aus.
Wie bekomme ich es nun hin, dass ich nur die markierten Zellen als nicht zusammenhängende Bereich bearbeiten kann. Gefunden habe ich bisher nur Scripts, bei denen im Makro der Bereich angegeben ist, z.B. ...RangeByName("A1:A8","C3:C7")?

Danke vorab
Zuletzt geändert von Statistiker am Do 8. Mai 2025, 09:06, insgesamt 1-mal geändert.
Warum ist ein Kanaldeckel rund? Damit er nicht in den Kanal fallen kann..
LO 24.2.6.2 + Windows 11 Home 24H2

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

Re: Nur markierte Zellen bearbeiten

Beitrag von mikele » Fr 2. Mai 2025, 20:02

Hallo,
eine Mehrfachauswahl ist praktisch ein Array von einzelnen ranges, das du per Schleife durchlaufen kannst. Einfacher wäre es, wenn du uns an deinem Makro teilhaben lässt ...
Gruß,
mikele

Statistiker
Beiträge: 29
Registriert: Mi 7. Okt 2020, 16:47
Wohnort: Westsachsen

Re: Nur markierte Zellen bearbeiten

Beitrag von Statistiker » Sa 3. Mai 2025, 11:57

Ja gerne, hier die gewünschte Teilhabe:

Code: Alles auswählen

Sub MultiplyWithFactor
Dim oDoc as Object
Dim oSheet as Object
Dim oCurSelection as Object
Dim mDataArraj as Variant
Dim nColCnt as Long
ReDim dMultiplier as Double
dim i as Long, j as Long
On Error resume next

oDoc=ThisComponent
oSheet = oDoc.CurrentController.ActiveSheet
oCurSelection = oDoc.getCurrentSelection()

 dMultiplier =100 ' anpassen
 mDataArraj = oCurSelection.DataArray
 nColCnt=oCurSelection.Columns.Count

 for i = lBound(mDataArraj()) to uBound(mDataArraj())
  For j=0 to nColCnt -1 
   mDataArraj(i)(j) = mDataArraj(i)(j) * dMultiplier
  next j
 next i
 oCurSelection.DataArray = mDataArraj
end Sub
Solange der markierte Bereich zusammen hängend ist arbeitet das Makro, auch wenn Leerzellen bzw. Zellen mit Text dazwischen (also innerhalb des Bereichs) sind. Sobald mehr als ein Bereich markiert ist, kommt die Fehlermeldung.
Warum ist ein Kanaldeckel rund? Damit er nicht in den Kanal fallen kann..
LO 24.2.6.2 + Windows 11 Home 24H2

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

Re: Nur markierte Zellen bearbeiten

Beitrag von mikele » Sa 3. Mai 2025, 16:30

Hallo,
zunächst: für diese Funktionalität ist gar kein Makro nötig.
Schreibe den Faktor (hier: 100) in eine leere Zelle und kopiere sie. Dann markierst du alle gewünschten Zellen und nun ->Bearbeiten->Inhalte einfügen->Inhalte einfügen... (oder Shift+Strg+V) Hier aktivierst du die Option "Multiplizieren" und fertig.
Dein Makro ergänzt:

Code: Alles auswählen

Sub MultiplyWithFactor
	Dim oDoc as Object
	Dim oSheet as Object
	Dim oCurSelection as Object
	Dim mDataArraj as Variant
	Dim nColCnt as Long
	ReDim dMultiplier as Double
	dim i as Long, j as Long
	On Error resume next
	
	oDoc=ThisComponent
	oCurSelection = oDoc.getCurrentSelection()
	
	dMultiplier =100 ' anpassen

	If oCurSelection.supportsService("com.sun.star.sheet.SheetCellRanges") Then
	
		For k=0 To oCurSelection.Count-1
			mDataArraj = oCurSelection(k).DataArray
			For i =0 To uBound(mDataArraj)
				For j=0 To ubound(mDataArraj(i))
					mDataArraj(i)(j) = mDataArraj(i)(j) * dMultiplier
				Next j
			Next i
			oCurSelection(k).DataArray = mDataArraj
		Next k
	Else
		mDataArraj = oCurSelection.DataArray
		For i =0 To uBound(mDataArraj)
			For j=0 To ubound(mDataArraj(i))
				mDataArraj(i)(j) = mDataArraj(i)(j) * dMultiplier
			Next j
		Next i
		oCurSelection.DataArray = mDataArraj
	End If
End Sub
Gruß,
mikele

Statistiker
Beiträge: 29
Registriert: Mi 7. Okt 2020, 16:47
Wohnort: Westsachsen

Re: Nur markierte Zellen bearbeiten

Beitrag von Statistiker » Sa 3. Mai 2025, 18:06

Hallo,
Tolle Arbeit. Herzlichsten Dank für die Mühe. Ja, Du magst Recht haben, das es auch ohne Makros mit ein bisschen Fleißarbeit geht. Aber ich muss sehr häufig Zellen mit den gleichen Wert multiplizieren bzw. dividieren (MwSt, Hektar in km² und umgekehrt, usw.) und da ist mit eine vorgefertigte Lösung schon lieber und schneller.
Nochmals Dank und ein schönes Wochenende!
Micha
Warum ist ein Kanaldeckel rund? Damit er nicht in den Kanal fallen kann..
LO 24.2.6.2 + Windows 11 Home 24H2

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

Re: Nur markierte Zellen bearbeiten

Beitrag von mikele » So 4. Mai 2025, 20:57

Hallo,
hier mal noch eine andere Variante, die den Weg über "Inhalte einfügen..." nachgeht:

Code: Alles auswählen

sub auswahl_multiplizieren

	oDoc=ThisComponent
	oCtrl=oDoc.CurrentController
	'vorhanden Auswahl merken
	oCurSel=oDoc.CurrentSelection
	'eine unbenutzte Zelle temporär für den Faktor nutzen und auswählen
	oTab=oCtrl.ActiveSheet
	oleer=oTab.queryEmptyCells
	oZelle = oleer(0).getcellbyposition(0,0)
	oZelle.Value=100
	oCtrl.select(oZelle)
	oSel=oDoc.CurrentSelection
	'Zwischenablae initialisieren
	oClip = CreateUnoService("com.sun.star.datatransfer.clipboard.SystemClipboard")
	'Überträgt die Auswahl in die Zwischenablage
	oContents = oClip.setContents(oCtrl.getTransferable, Null)
	
	'ursprüngliche Auswahl wieder herstellen
	oCtrl.select(oCurSel)
	
	'Dispatcher initialisieren
	document   = oCtrl.Frame
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
	
	dim args(5) as new com.sun.star.beans.PropertyValue
	'Werte einfügen
	args(0).Name = "Flags"
	args(0).Value = "V"
	'Operation 1...Addition 2... Subtraktion 3... Multiplikation 4...Division
	args(1).Name = "FormulaCommand"
	args(1).Value = 3
	args(2).Name = "SkipEmptyCells"
	args(2).Value = false
	args(3).Name = "Transpose"
	args(3).Value = false
	args(4).Name = "AsLink"
	args(4).Value = false
	args(5).Name = "MoveMode"
	args(5).Value = 4
	
	dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args)
	
	'temporäre Zelle löschen
	oZelle.Clearcontents(1)
end sub
Damit werden alle ausgewählten Zellen in einem Rutsch mit dem Faktor multipliziert.
Gruß,
mikele

Statistiker
Beiträge: 29
Registriert: Mi 7. Okt 2020, 16:47
Wohnort: Westsachsen

Re: Nur markierte Zellen bearbeiten

Beitrag von Statistiker » Mi 7. Mai 2025, 18:28

Hallo,
verspäteten Dank für die alternative Lösung. Als Anwender spüre ich da keinen Unterschied, vielleicht gibt es bei größeren "Wertmengen" einen Zeitunterschied? Habe inzwischen den Multiplier variabel gemacht durch die Verwendung einer Inputbox, also zur Faktoreneingabe. Beste Grüße
Micha
Warum ist ein Kanaldeckel rund? Damit er nicht in den Kanal fallen kann..
LO 24.2.6.2 + Windows 11 Home 24H2


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