Formel mit relativen Bezügen in Zellbereich einfügen

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

Moderator: Moderatoren

Clousi
*
Beiträge: 10
Registriert: So, 22.08.2021 12:26

Formel mit relativen Bezügen in Zellbereich einfügen

Beitrag von Clousi »

Hallo zusammen

Ich würde gerne eine Formel mit relativen Bezügen in einen Zellbereich einfügen. Dafür habe ich mir folgendes Script gebastelt. Nur leider krieg ich es nicht zum laufen (Eigenschaft oder Methode nicht gefunden: setFormula):

Code: Alles auswählen

Sub Main
Dim oDoc As Object
Dim oSheet As Object
Dim oRange as Object
 
oDoc = ThisComponent
oSheet = oDoc.Sheets(0)

oRange=oSheet.getCellRangeByName("C15:C20")
oRange.setFormula("=E15&F15")

End Sub
Hat mir jemand einen Tipp?

Vielen Dank im Voraus!
Clousi
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Formel mit relativen Bezügen in Zellbereich einfügen

Beitrag von Stephan »

Die Fehlermeldung kommt weil Du einem CellRange keine Formel zuweisen kannst, sondern nur den jeweiligen Zellen des CellRange.

es geht im Konkreten:

Code: Alles auswählen

Sub Main2
Dim oDoc As Object
Dim oSheet As Object
Dim oRange as Object
 
oDoc = ThisComponent
oSheet = oDoc.Sheets(0)

For i = 15 To 20
	oSheet.getCellRangeByName("C" & i).setFormula("=E" & i & "&F" & i)
Next i

End Sub

Für allgemeine Verwendung ist aber möglicherweise ein Misch-Masch von nativen Makro- und dispatcher-Code pragmatischer (eine allumfassend optimale Implementierung ist das aber auch nicht):

Code: Alles auswählen

Sub Main
Dim oDoc As Object
Dim oSheet As Object
Dim oRange as Object
 
oDoc = ThisComponent
oSheet = oDoc.Sheets(0)

document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")


oSheet.getCellRangeByName("C15").setFormula("=E15&F15")
oDoc.CurrentController.Select(oSheet.getCellRangeByName("C15"))

dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

oRange=oSheet.getCellRangeByName("C15:C20")
oDoc.CurrentController.Select(oRange)

dim args1(5) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Flags"
args1(0).Value = "F"
args1(1).Name = "FormulaCommand"
args1(1).Value = 0
args1(2).Name = "SkipEmptyCells"
args1(2).Value = false
args1(3).Name = "Transpose"
args1(3).Value = false
args1(4).Name = "AsLink"
args1(4).Value = false
args1(5).Name = "MoveMode"
args1(5).Value = 4

dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args1())

End Sub




Gruß
Stephan
Clousi
*
Beiträge: 10
Registriert: So, 22.08.2021 12:26

Re: Formel mit relativen Bezügen in Zellbereich einfügen

Beitrag von Clousi »

Hallo Stephan,

Du bist ja wirklich sehr hilfsbereit! Ich bin dir dafür extrem dankbar!

Ich habe den Work-Around mit der Misch-Masch Lösung getestet und diese funktioniert soweit gut!
Wenn ich allerdings anstelle "=E15&F15" eine komplexere Formel einsetze (z.B. sververweis) dann wird das auf Anhieb nicht als Formel erkannt und Calc gibt mir die Fehlermeldung #Name? zurück. Erst wenn ich die Zelle C15 über den Formel-Editor auswähle und diesen (ohne Modifikation) wieder schliesse, wird mir der gewünschte Wert zurückgegeben.

Weisst Du woran das liegen könnte?
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Formel mit relativen Bezügen in Zellbereich einfügen

Beitrag von Stephan »

grundsätzlich musst Du in:

Code: Alles auswählen

oSheet.getCellRangeByName("C15").setFormula("=E15&F15")
die internen, englischen, Tabellenfunktionsnamen benutzen, für SVERWEIS() also VLOOKUP() (siehe: http://calc-info.de/files/Funktionen_de-en.pdf).

Um deutsche Funktinsnamen zu benutzen, musst Du diesen Code verwenden:

Code: Alles auswählen

oSheet.getCellRangeByName("C15").FormulaLocal = "=E15&F15"

Gruß
Stephan
Clousi
*
Beiträge: 10
Registriert: So, 22.08.2021 12:26

Re: Formel mit relativen Bezügen in Zellbereich einfügen

Beitrag von Clousi »

Hervorragend! Ich bin beeindruckt! Herzlichen Dank!
Antworten