Seite 1 von 1

Calc Kopieren mit "Inhalte einfügen"

Verfasst: Di, 15.08.2017 10:19
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

Re: Calc Kopieren mit "Inhalte einfügen"

Verfasst: Di, 15.08.2017 10:52
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

Re: Calc Kopieren mit "Inhalte einfügen"

Verfasst: Di, 15.08.2017 15:37
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

Re: Calc Kopieren mit "Inhalte einfügen"

Verfasst: Di, 15.08.2017 15:46
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

Re: Calc Kopieren mit "Inhalte einfügen"

Verfasst: Di, 15.08.2017 20:55
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

Re: Calc Kopieren mit "Inhalte einfügen"

Verfasst: Di, 15.08.2017 23:22
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

Re: Calc Kopieren mit "Inhalte einfügen"

Verfasst: Mi, 16.08.2017 11:41
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

Re: Calc Kopieren mit "Inhalte einfügen"

Verfasst: Mi, 16.08.2017 12:54
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

Re: Calc Kopieren mit "Inhalte einfügen"

Verfasst: Mi, 16.08.2017 17:40
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

Re: Calc Kopieren mit "Inhalte einfügen"

Verfasst: Do, 17.08.2017 13:34
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

Re: Calc Kopieren mit "Inhalte einfügen"

Verfasst: Do, 17.08.2017 17:51
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

Re: Calc Kopieren mit "Inhalte einfügen"

Verfasst: Do, 17.08.2017 19:40
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

Re: Calc Kopieren mit "Inhalte einfügen"

Verfasst: Do, 17.08.2017 21:25
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