Seite 1 von 1

[Gelöst] Nur markierte Zellen bearbeiten

Verfasst: Fr 2. Mai 2025, 16:46
von Statistiker
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

Re: Nur markierte Zellen bearbeiten

Verfasst: Fr 2. Mai 2025, 20:02
von mikele
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 ...

Re: Nur markierte Zellen bearbeiten

Verfasst: Sa 3. Mai 2025, 11:57
von Statistiker
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.

Re: Nur markierte Zellen bearbeiten

Verfasst: Sa 3. Mai 2025, 16:30
von mikele
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

Re: Nur markierte Zellen bearbeiten

Verfasst: Sa 3. Mai 2025, 18:06
von Statistiker
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

Re: Nur markierte Zellen bearbeiten

Verfasst: So 4. Mai 2025, 20:57
von mikele
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.

Re: Nur markierte Zellen bearbeiten

Verfasst: Mi 7. Mai 2025, 18:28
von Statistiker
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