Calc Kopieren mit "Inhalte einfügen"

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

Moderator: Moderatoren

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

Calc Kopieren mit "Inhalte einfügen"

Beitrag von wonk » Di, 15.08.2017 10:19

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: 10169
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von Stephan » Di, 15.08.2017 10:52

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: 15
Registriert: Di, 15.11.2016 15:18

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von wonk » Di, 15.08.2017 15:37

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: 10169
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von Stephan » Di, 15.08.2017 15:46

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: 15
Registriert: Di, 15.11.2016 15:18

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von wonk » Di, 15.08.2017 20:55

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: 10169
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von Stephan » Di, 15.08.2017 23:22

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: 15
Registriert: Di, 15.11.2016 15:18

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von wonk » Mi, 16.08.2017 11:41

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: 10169
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von Stephan » Mi, 16.08.2017 12:54

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: 3558
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von balu » Mi, 16.08.2017 17:40

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: 3558
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von balu » Do, 17.08.2017 13:34

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: 15
Registriert: Di, 15.11.2016 15:18

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von wonk » Do, 17.08.2017 17:51

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: 3558
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von balu » Do, 17.08.2017 19:40

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: 15
Registriert: Di, 15.11.2016 15:18

Re: Calc Kopieren mit "Inhalte einfügen"

Beitrag von wonk » Do, 17.08.2017 21:25

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 13 Gäste