Calc Kopieren mit "Inhalte einfügen"

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

Moderator: Moderatoren

wonk
**
Beiträge: 26
Registriert: Di, 15.11.2016 15:18

Calc Kopieren mit "Inhalte einfügen"

Beitrag von wonk »

Hallo,
ich möchte in Calc per Makro Formelzellen Kopieren mit der Option "Inhalte einfügen" , so dass nur die Werte übernommen werden. Wie macht man das (aber möglichst ohne dispatcher)?
Gruss, wonk
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von Stephan »

Wenn es nur um Werte geht ist das doch der allereinfachste Fall:

Den Wert in Tabelle "Tabelle1" aus Zelle A1 in B1:

Code: Alles auswählen

tab = ThisComponent.Sheets().getByName("Tabelle1")
tab.getCellRangeByName("B1").Value = tab.getCellRangeByName("A1").Value

Gruß
Stephan
wonk
**
Beiträge: 26
Registriert: Di, 15.11.2016 15:18

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von wonk »

Hallo,
danke, manchmal sieht man das Naheliegende nicht.
Aber wenn ich das richtig sehe, gibt es dort keine Möglichkeit für ganze Bereiche? Ich muss das in einer Schleife über alle Spalten und Reihen machen?

Das Kopieren von Formelzellen mit Formelanpassung funktioniert auch nur im Schleifenverfahren!?
Gruss, wonk
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von Stephan »

Aber wenn ich das richtig sehe, gibt es dort keine Möglichkeit für ganze Bereiche?
Doch, die gibt es:

Code: Alles auswählen

tab = ThisComponent.Sheets().getByName("Tabelle1")
daten = tab.getCellRangeByName("A1:A10").getDataArray()
tab.getCellRangeByName("B1:B10").setDataArray(daten) 
Gruß
Stephan
wonk
**
Beiträge: 26
Registriert: Di, 15.11.2016 15:18

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von wonk »

Hm,
ich müßte eigentlich mit variablen Zeilenzahlen arbeiten. Ich habe deshalb ein Beispiel (zunächst mit Konstanten) mit CellRangeByPosition probiert.

Bereich = ThisComponent.Sheets(0).getCellRangeByPosition(2,1,4,10)
Daten= Bereich.getDataArray()
Bereich.getCellRangeByPosition(5,1,7,10).setDataArray(Daten)

Das wird aber so nicht akzeptiert, oder ist das so prinzipiell nicht möglich?

Übrigens: Ich suche immer noch eine Doku der Objekte mit allein Eigenschaften und Methoden!
Gruss, wonk
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von Stephan »

Das wird aber so nicht akzeptiert
wie denn auch, in erstr Zeile referenzierst Du ein Range-Objekt und in dritter Zeile willst Du, bezogen auf dieses Objekt, nochmals einen Zellbereich referenzieren.

richtig ist:

Code: Alles auswählen

Bereich = ThisComponent.Sheets(0)
Daten = Bereich.getCellRangeByPosition(2,1,4,10).getDataArray()
Bereich.getCellRangeByPosition(5,1,7,10).setDataArray(Daten)
besser wohl (weil der Variabkenname "Bereich" evtl. verwirrt):

Code: Alles auswählen

blatt = ThisComponent.Sheets(0)
Daten = blatt.getCellRangeByPosition(2,1,4,10).getDataArray()
blatt.getCellRangeByPosition(5,1,7,10).setDataArray(Daten)  

Übrigens: Ich suche immer noch eine Doku der Objekte mit allein Eigenschaften und Methoden!
diese Doku ist bei OO die sog. IDL-Referenz:
http://www.openoffice.org/api/docs/comm ... le-ix.html




GRuß
Stephan
wonk
**
Beiträge: 26
Registriert: Di, 15.11.2016 15:18

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von wonk »

Hallo,
danke, so nach und nach verstehe ich mehr, was ich eigentlich tue ;) , auch wenn ich mit der Doku so meine Schwierigkieten habe.

Wenn ich das richtig sehe, ist aber nicht möglich, das Kopieren von Formelzellen mit Formelanpassung (z.B. 3 Zellen auf 30 Zellen) OHNE Schleifenkonstruktion zu erreichen!?
Gruss, wonk
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von Stephan »

Wenn ich das richtig sehe, ist aber nicht möglich, das Kopieren von Formelzellen mit Formelanpassung (z.B. 3 Zellen auf 30 Zellen) OHNE Schleifenkonstruktion zu erreichen!?
Das Kopieren mit Formelanpassung ist ohne Schleife auch nicht möglich wenn Quell- und Zielbereich gleich groß sind.

Sofern "Formelanpassung" nur das Anpassen von Zellbezügen meint, weiß ich aber auch nicht warum Du das nicht mit dispatcher erledigen willst, denn das scheint mir der beste Weg dafür.
Eine Formelanpassung mit nativem Code (also ohne dispatcher) ist selbst wenn sie nicht flexibel programmiert sein muss, sondern nur für vorher feststehende Bezugsänderungen, zusätzlicher Programmieraufwand ohne das es irgendeinen Vorteil hätte. Ich jedenfalls sehe Keinen.


Ach und falls hier jemand mitliest und einen Weg kennt für eine Anpassung von Zellbezügen in beliebigen Formeln, mittels nativem Code, ich suche soetwas seit Jahren für meine mottco-Extension und wäre sehr interessiert daran.


Gruß
Stephan
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von balu »

Hallo wonk,

dein Hauptproblem ist doch gelöst. Also wäre es doch besser gewesen einen neuen Thread aufzumachen, denn: anderes Problem = neuer Thread.

Aber nun gut, wenn Stephan schon geantwortet hat, dann kann ich das auch ;-)
Wenn ich das richtig sehe, ist aber nicht möglich, das Kopieren von Formelzellen mit Formelanpassung (z.B. 3 Zellen auf 30 Zellen) OHNE Schleifenkonstruktion zu erreichen!?
1.
Automatische Anpassung der Zellbezüge in Calc per richtigem Programmieren (nativ) ist mir wohl unbekannt, was aber nix zu bedeuten hat, bin ja schließlich nur ne kleine Leuchte. Aber es gäbe da schon einen Trick, den ich nachher noch kurz beschreibe.

Und nein, Stephan, der Trick kann dir leider nicht bei DEINEM Problem behilflich sein.


2.
Ich frage mich ob überhaupt Calc-Formeln kopiert werden müssen, oder ob es vielleicht nicht besser wäre anstatt mit den Calc-Formeln zu arbeiten das gleich per Makro zu erledigen?


So, und nun zu dem Trick. Ist nur ein extrem vereinfachtes Beispiel.
Anstatt mit ausgeschriebenen Calc-Formeln a-la

Code: Alles auswählen

=WENN(B2<>"";"INHALT";"-")
zu arbeiten, würde ich mit "Namen" arbeiten.

Code: Alles auswählen

=FormelNummer1
Die gezeigte WENN-Formel wird dem Namen *FormelNummer1* zugeordnet. Dann kann man beispielsweise hiermit

Code: Alles auswählen

SXE = oDocGL.Sheets(0).getCellRangeByName("A2")
oDocGL.Sheets(0).getCellRangeByName("D2").Formula = SXE.Formula
oder

Code: Alles auswählen

SXE = oDocGL.Sheets(0).getCellRangeByName("A2")
oDocGL.Sheets(0).getCellRangeByName("D2").FormulaLocal = SXE.FormulaLocal
ganz einfach die Zelle kopieren und die Zellbezüge werden intern hinter dem Namen automatisch angepasst.
Zu dem Thema "NamenFürFormeln" gibts hier reichlich lesestoff. Einfach mal danach suchen.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von balu »

Hallo wonk,

hatte ich gestern vergessen gehabt zu erwähnen, das es auch noch eine andere Methode zum kopieren mit Zellbezugsanpassung gibt, nachzulesen hier.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
wonk
**
Beiträge: 26
Registriert: Di, 15.11.2016 15:18

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von wonk »

Hallo,
ich habe Dein Beispiel mal bei mir ausprobiert. Wenn ich das so übertrage, wird bei mir allerdings KEINE Formelanpassung vorgenommen. So wie in Deinem Link beschrieben, hatte ich das bei mir per Schleife gemacht.

Aber noch ein Hinweis: Bei mir werden 3 Formeln in einer Zeile in etwa 3500 Zeilen kopiert. Per Schleife braucht das bei mir gut 30s. Der Dispatcher schaft das in 2s (!) mit einem Makro mit 106 (!) Argumenten, dass ich aber nicht verstehe.

Allerdings weiß ich trotzdem nicht, wie ich bei mir den Dispatcher einsetzen kann, da die Kopieraktion bis in die letzte beschriebene Zeile des Blattes läuft. Die ist aber bei verschiedenen Anwendungen nicht immer in der gleichen Zeile. Bei visueller Erstellung des Makros kann ich das natürlich für EIN Beispiel ausführen. Aber ich weiß nicht wie ich beim Markieren des Übertragungsbereichs ALLGEMEIN bis in die letzte Zeile komme.

Gruss, wonk
Zuletzt geändert von wonk am Do, 17.08.2017 21:28, insgesamt 1-mal geändert.
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von balu »

Hallo wonk,
KEINE Formelanpassung vorgenommen.
Und das sagt mir absolut reineweg-gar-nie-nie-nix! Du musst nicht nur mir, sondern uns allen hier schon genau beschreiben und erklären, was *Formelanpassung* heißen soll. Am besten hängst Du hier eine abgespeckte Beispieldatei an, dann schauen wir mal weiter.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
wonk
**
Beiträge: 26
Registriert: Di, 15.11.2016 15:18

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von wonk »

Hallo,
"Formelanpassung" heißt einfach, daß beim Kopieren einer Formelzelle die relativen Zellbezüge angepasst werden. D.h. z.B., wenn in der Zelle A1 steht "=B1" und ich kopiere die Zelle nach A2, dann steht dort "=B2". KEINE Formelanpassung heißt, daß in Zelle A2 dann "=B1" steht.
Gruss, wonk
Antworten