NamedRanges.addNewByName

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

Moderator: Moderatoren

gschuckar
****
Beiträge: 140
Registriert: Fr, 24.02.2006 14:27

NamedRanges.addNewByName

Beitrag von gschuckar »

Hallo,
ich habe mir ein Buchhaltungstool gebaut. Hier befinden sich unter Anderem ein Sheet mit Namen debitor und ein Sheet mit namen GuV. In debitor gibt es einen benannten Bereich mit dem Namen 'debit_datum'. Während Berechnungen im Sheet GuV wird darauf zugegriffen. den Bereich 'debit_datum' habe ich mit Einfügen->Namen->festlegen ersteltt. das ganze funktioniert.
Jetzt erstelle ich ein makro, mit dem es möglich sein wird, Rechnungsdaten ins Sheet debitor einzutragen. Das funktioniert soweit auch.
Soweit das Sheet mit daten gefüllt ist, soweit soll auch der benannte bereich reichen, will sagen: Wenn in Row 15 der letzte datensatz steht, dann soll 'debit_datum' A2.A15' umfassen. Soweit.
Mit dem folgenden Code erweitere ich den benannten bereich:

Code: Alles auswählen

Private Function setDebitorDatum(oSheet as Object, iRow as Integer) as Boolean
	
	oSheet.getCellByPosition(0,iRow).value= now()
	if oDoc.Namedranges.hasByName("debit_datum") then
		oDoc.Namedranges.removeByName("debit_datum")
		oDoc.Namedranges.addNewByName("debit_datum", _
					"$debitor.$A2:$A" & mdlTools.getLastUsedRow(oSheet)+1, _
						createUnoStruct("com.sun.star.table.CellAddress"),0)
						
	endif
	setDebitordatum = true
end function
Das funktioniert auch. Das problem ist jetzt, im Blatt GuV wird der bereich 'debit_datum' nicht mehr richtig benutzt. Er ist da und hat auch den richtigen Umfang(jetzt A2:A16).
Lösche ich den bereich über Einfügen->name->festlegen und lege ihn dann auf diesem wege wieder an, so wird der bereich auch erkannt. Per Makro nicht.
Was mache ich hier falsch?
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey gschuckar,

hmm, eigentlich machst du gar nichts falsch - jedenfalls nichts, was ich sehen könnte.
Welche Version von OOo nutzt du und welches BS?
In meinen Programmen nutze ich ähnliche Routinen - und da fnktioniert das alles.
Also, OK, es könnte sein, dass du zum Schluss das Calc-sheet neu berechnen lassen musst. Das entfällt bei mir, da ich normalerweise mit Dialogen arbeite - und wenn die geschlossen werden, wird Calc automatisch neu berechnet (beim Fokuserhalt). Andererseites errecihst du das auch, wenn du manuel die Tabelle wechselst - es sei denn, du hast "automatische Neukalkulation" ausgeschaltet ;-)
Den einzigen sonst noch zu erkennenden Unterschied finde ich in der Zeile

Code: Alles auswählen

oDoc.Namedranges.addNewByName("debit_datum", _
               "$debitor.$A2:$A" & mdlTools.getLastUsedRow(oSheet)+1, _
                  createUnoStruct("com.sun.star.table.CellAddress"),0) 
Ich erzeuge den Struct seperat - und weise ihn dann zu, also so:

Code: Alles auswählen

Dim aPos as new com.sun.star.table.CellAddress
oDoc.Namedranges.addNewByName("debit_datum", _
               "$debitor.$A2:$A" & mdlTools.getLastUsedRow(oSheet)+1, _
                  aPos ,0) 
Allerdings sollte das keinen Unterschied ausmachen.
Ach ja, sind deine Tabellen möglicherweise gesperrt? Dann solltest du die Sperre vorher per Makroaufheben und später wieder setzen.

Sorry, mehr weis ich auch nicht.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
gschuckar
****
Beiträge: 140
Registriert: Fr, 24.02.2006 14:27

Beitrag von gschuckar »

Hallo Thomas,
automatische neukalkulation ist eingeschaltet. Die Sheets sind nicht geschützt. Ich benutze LINUX fedor Core 4 und OpenOffice 2.1
Die geschichte funktioniert sowohl bei ungeschützten wie bei geschützten Sheets nicht. Witzig auch: ich habe eine andere Anwendung, in der ich auch dynamisch die benannten bereiche ändere. Auf genau die gleiche Weise. Dort funktioniert es.
Allerdings habe ich in dieser Anwendung(der mit dem Fehler) bis jetzt so ca 110 benannte bereiche. Kann es sein, das es hier Grenzen gibt?
Gruß Gerd
gschuckar
****
Beiträge: 140
Registriert: Fr, 24.02.2006 14:27

NamedRanges.AddNewByname anders gelöst

Beitrag von gschuckar »

Hallo,
ich habe das problem jetzt anders gelöst. Die Anforderung war einen Datenbereich zu schaffen, dessen NamedRange sich bei Einfügen oder Loschen eines Datensatzes in einem Sheet automatisch erweitert oder reduziert. Warum das speziell in dieser Anwendung nicht mit dem obigen Code funktioniert möchte ich jetzt nicht weiterverfolgen. Thomas hat recht, wenn er sagt, das es so eigentlich funktionieren sollte. In einer anderen Anwendung funktioniert das auch, nur hier eben nicht.
Ich mache es jetzt so: Unter Einfügen->Namen-> festlegen lege ich jetzt die Namen, welche dynamische Bereiche abbilden sollen, folgendermassen an:

Code: Alles auswählen

name = indirekt("$Tabellenname.$A$2:$A$"& anzahl2($tabellenname.$A$2:$A$1000)+1)
Wobei "A" für den Spaltennamen hier ein Beispiel ist. ich würde gerne die begrenzung auf in diesem Falle 1000 Zeilen noch irgendwie weg haben wollen. Bei Excel soll das gehen, wenn man "$A:$A" schreibt. geht das in irgendeiner OO version auch so? ich benutze 2.1. bei mir auf dem Rechner geht das so nicht.
Ich habe das beim googlen in irgendeinem EXCEL forum gefunden. Dort wird die Geschichte mit der Funktion "bereich.verschieben" anstatt "inddirekt" noch etwas verfeinert. Bereich.verschieben habe ich in OpenOffice Calc jedoch nicht gefunden.
Gruß Gerd
Das funktioniert recht gut und ist schneller, als wenn ich im Code etwas baue.
Gruß Gerd
Antworten