Aktualisieren von definierten Namen (Bereichen)

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

HKönig
*
Beiträge: 12
Registriert: Mi, 10.06.2015 16:35

Aktualisieren von definierten Namen (Bereichen)

Beitrag von HKönig »

Liebe Leute,

ich habe folgendes Problem: Ich habe unter EINFÜGEN/NAMEN mehrere Bereiche festgelegt. So z.B. auch "Loeschen_T1". Diese Bereiche sind bis zu einer Ende/Summenzeile definiert. Über einen Dialog "Neuer Teilnehmer" füge ich dann einen neuen Datensatz in das Calc-Sheet ein. Dadurch verschiebt sich die Ende/Summenzeile, wodurch ich auch dort die entsprechenden Formeln um die Bereichsvergrößerung erweitere. Soweit ist alles gut.
Nun habe ich auch eben diese Bereichs-Namen definiert, die bis zu dieser Ende/Summenzeile reichen (dienen eigentlich nur zum schnellen Löschen bestimmter Datenbereiche). Nun möchte ich aber, dass auch diese Bereiche an den erweiterten Zellenbereich angepasst werden.
Nur das schaffe ich offenbar nicht. Was mache ich da falsch?

Der Code sieht dazu folgendermaßen aus:

Code: Alles auswählen

sub chgCellRanges(LastRow)
'Definierte ZellBereiche an neue Größe anpassen
  dim oRanges, oCellRange, oRefCells, oRefAdr as object
  dim iEndRow as long
  dim sAdr as string
  
  oRanges    = oDocTN.namedRanges
  oCellRange = oRanges.getByName("Loeschen_T1")
  oRefCells  = oCellRange.referredCells
  sAdr       = rString(oRefCells.absoluteName,"$") + LastRow
  oRefCells.setPropertyValue("AbsoluteName",sAdr)
  oRefAdr    = oRefCells.rangeAddress
  iEndRow    = oRefAdr.EndRow
  oRefAdr.EndRow = LastRow
end sub

function rString(pStr as string, sFind as string)
  dim iPos as integer
  
  for iPos = len(pStr) to 0 step -1
    if mid(pStr,iPos,1) = "$" then
      rString = left(pStr,iPos)
      exit function
    end if      
  next iPos
end function
rString() manipuliert die Adresse, sodass aus z.B. bei LastRow=214 aus $TN.$N$6:$AI$213 dann $TN.$N$6:$AI$214 wird, die ich in AbsoluteName dann einsetze, und dazu auch noch EndRow anpasse.

Aber wenn ich dann den Namen (im Beispiel "Loeschen_T1") wieder aufrufe, steht immer noch das Alte drinnen!? Der Bereich ist unverändert.

Viele Grüße
HKönig
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Aktualisieren von definierten Namen (Bereichen)

Beitrag von F3K Total »

Hallo,
warum brauchst du überhaupt ein Makro? Mit folgender Einstellung passt Calc die Bereiche selber an:
ref.png
ref.png (18.81 KiB) 4405 mal betrachtet
Gruß R
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Aktualisieren von definierten Namen (Bereichen)

Beitrag von Toxitom »

Hallo HKönig,

falls Du es dennoch per Makro machen möchtest:

Der Code ist viel einfacher:

Code: Alles auswählen

sub chgCellRanges(LastRow)
'Definierte ZellBereiche an neue Größe anpassen
  dim oRanges, oCellRange, oRefCells, oRefAdr as object
  dim iEndRow as long
  dim sAdr as string
 
  oRanges    = oDocTN.namedRanges
  oCellRange = oRanges.getByName("Loeschen_T1")   'liefert das Objekt des Benannten Bereiches
  
  oCellRange.content = rString(oCellRange.Content,"$") + LastRow  'content liefert und setzt den Inhalt (Bereich) als String
  
  ' fertig.
  
  'oRefCells  = oCellRange.referredCells
 ' sAdr       = rString(oRefCells.absoluteName,"$") + LastRow
 ' oRefCells.setPropertyValue("AbsoluteName",sAdr)
 ' oRefAdr    = oRefCells.rangeAddress
  'iEndRow    = oRefAdr.EndRow
 ' oRefAdr.EndRow = LastRow
end sub
Alle anderen Objekte wie bspw. absoluteName oder referredCells werden intern berechnet und angepasst. Darum musst Du Dich gar nicht kümmern;)

Noch ein genereller Tipp:
Wenn Du ein Objekt aus einem Objekt extrahierst (bei Dir im Beispiel die referredCells) und innerhalb des extrahierten Objektes Eigenschaften veränderst (wie bei Dir die EndRow), dann musst Du das geänderte Objekt auch wieder zurückschreiben - das passiert nicht automatisch.

In dem Fall also:

Code: Alles auswählen

...
oRefCells  = oCellRange.referredCells
REM nun folgt die Manipulation des extrahierten Objektes 
...
oCellRange.referredCells = oRefCells   'Rückschreiben des Objektes
...
In deinem Fall hattest Du sogar zweimal ein Objekt extrahiert (2 Stufen) also müsstest Du es auch zweimal zurück schreiben. Spätestens da hättest Du eine Fehlermeldung erhalten - Objekt schreibgeschützt;)

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
HKönig
*
Beiträge: 12
Registriert: Mi, 10.06.2015 16:35

Re: Aktualisieren von definierten Namen (Bereichen)

Beitrag von HKönig »

Ja, besten Dank. Es ist ja wirklich einfach, und tut was es soll. Mir fehlt einfach noch der richtige Durchblick. Ich war mal auf einer Seite, da wurden die Zusammenhänge der Klassen grafisch dargestellt. Finde das aber nicht mehr!

Viele Grüße
Helmut
Karolus
********
Beiträge: 7438
Registriert: Mo, 02.01.2006 19:48

Re: Aktualisieren von definierten Namen (Bereichen)

Beitrag von Karolus »

Hallo
HKönig hat geschrieben:Ja, besten Dank. Es ist ja wirklich einfach, und tut was es soll. Mir fehlt einfach noch der richtige Durchblick. Ich war mal auf einer Seite, da wurden die Zusammenhänge der Klassen grafisch dargestellt. Finde das aber nicht mehr!

Viele Grüße
Helmut
Meinst du zufällig http://api.libreoffice.org/docs/idl/ref ... anges.html
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Antworten