Zellinhalt eines Bereichs ändern

Hallo Gemeinde, brauche wieder mal Hilfe und bedanke mich vorab.
Innerhalb eines markierten Spaltenbreichs soll vor dem Wert (String) jeder Zelle eine fortlaufende Zahl (00, 01, 02, …) eingefügt werden.

  • aus Zelle B355 “Kingsquest” wird “00 Kingsquest”,
  • aus Zelle B356 “Honeypot Diary” wird “01 Honyepot Diary”
  • aus Zelle B357 “Lexington” wird “02 Lexington” usw.

Dies soll nur für den markierten Bereich gelten, der zweistellige Wert (mit vorangestellter Null) soll immer um 1 erhöht werden. In jeder Zeile wird immer nur eine Zelle in der gleichen Spalte bearbeitet. Wie kan man das schnell mit einem Makro lösen ?

Danke erstmal Micha

···········

Hallo,

folgendes Beispiel-Makro kann das machen (wobei ich das niemals so machen würde, sondern mit Hilfs-Spalten und/oder Formeln arbeiten würde).

Sub NummerierungVoranstellen()
 
 Dim oDoc   As Object
 Dim oSheet As Object
 Dim oRange As Object
 Dim oCell  As Object
 
 Dim StartRow    As Long
 Dim StartColumn As Long
 Dim EndRow      As Long
 Dim EndColumn   As Long
 
 Dim i As Long
 Dim j As Long
 
 Dim AktWert As String
 Dim Voran As String

 oDoc=ThisComponent
 oSheet=oDoc.CurrentController.ActiveSheet

 If oDoc.currentSelection.supportsService _
    ("com.sun.star.sheet.SheetCellRange") Then
   oRange=oDoc.currentSelection
 End If
 
 StartCol=oRange.RangeAddress.StartColumn
 EndCol=oRange.RangeAddress.EndColumn
 
 StartRow=oRange.RangeAddress.StartRow
 EndRow=oRange.RangeAddress.EndRow
 
 If StartCol <> EndCol Then
   MsgBox "Nur Zellen in einer einzigen Spalte dürfen ausgewählt sein"
   Exit Sub
 End If 
 
 j=0
 for i =  StartRow to EndRow
   if j < 10 Then
     Voran = "0" & j
   else
     Voran = j 
   end if
  
  Voran = Voran & " "
  
  oCell   = oSheet.getCellByPosition(StartCol,i)
  AktWert = oCell.String
  
  oCell.String = Voran &  AktWert
  j=j+1
  
 next i

End Sub

Anmerkungen

  • Das Makro erfordert, dass nur Zellen in einer einzigen Spalte ausgewählt sind. Sollte diese Bedingung nicht erfüllt sein, wird das Makro mit einer entsprechenden Meldung abgebrochen

  • In dieser Form funktioniert das Makro nur dann, wenn in den ausgewählten Zellen Text steht und es erfolgt auch keine Prüfung oder Fehlerbehandlung (insofern ist das als Prototyp eines Makros zu verstehen und nicht für einen produktiven Einsatz gedacht)

  • Eine Prüfung, ob mehr als 99 Zeilen ausgewählt wurden, erfolgt ebenfalls nicht. Es wird dann mit mehr als 2- stelligen Nummern weiter gemacht.

Getestet mit LibreOffice:

Version: 7.0.6.2; Build ID: 144abb84a525d8e30c9dbbefa69cbbf2d8d4ae3b
CPU threads: 8; OS: Linux 5.3; UI render: GL; VCL: kf5
Locale: de-DE (de_DE.UTF-8); UI: de-DE; Calc: threaded

Vielleicht hilft Dir das weiter.

Hallo Opaque,
… und wie mir das weiterhilft. Es ist genau das, was ich mir gewünscht habe und es läuft ausgezeichnet.
Ja — die Idee mit der Extraspalte ist nicht zu verachten, aber bei 18000 Zeilen und 150 Arbeitsblättern (in mehreren Dateien) ist es doch etwas mühseliger als ein Makro.

  • Ich wähle eh nur eine Spalte aus, die anderen sind ja Zahlen (Werte).
  • Es werden nie mehr als 80 Zeilen
  • Es funktioniert auch bei leeren Zellen bzw. wenn Zahlen drin stehen, der Zellinhalt wird ja als String (AktWert) verarbeitet.

Vielen Dank für die schnelle und kompetente Antwort, vielleicht kann ich mich doch noch dazu durchringen etwas Basic zu lernen

Beste Grüße, vy73

@Statistiker: Wenn du was vernünftiges lernen willst, lerne Python…(siehe meine Antwort)

Wenn in der Selektion nur ein Bereich mit einer Spalte drinsteckt: (in Python)

def number_one_columnSelection(*_):    
    doc = XSCRIPTCONTEXT.getDocument()
    sel = doc.CurrentSelection
    data = sel.FormulaArray
    out = []
    for number, entry in enumerate(data,1):
        out.append((f"{number:02} {entry[0]}",))
    sel.setFormulaArray(out)    

oh, ich sehe gerade du möchtest mit 00 starten, dann kann die for …:-zeile vereinfacht werden:

     for number, entry in enumerate(data):