CALC: Daten von einem Tabellenblatt in ein anderes kopieren

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: CALC: Daten von einem Tabellenblatt in ein anderes kopieren

Re: CALC: Daten von einem Tabellenblatt in ein anderes kopieren

von Katte » Fr, 14.08.2015 21:08

Hallo balu

Ich kann dir gar nicht genug danken! Danke Danke Danke :D Schick mir Deine Adresse und ich schicke dir einen Kasten Bier oder Wein (da aber keinen Kasten ;)

Ich habe es heute hin bekommen. Es macht (fast) alles was ich will. Ich muss ja noch ein paar andere Arbeitsblätter verteilen, aber da versuche ich mich mal selber durch zu fitzen ;) Ansonsten muss ich noch mal nachfragen und ich hoffe du stehst mir noch mal so lieb und nett und hilfreich Rede und Antwort ;) *schleimmodusoff*
Und wenn ich das jetzt richtig sehe, dann sind die 12 Saison-Blätter "wahllos" in diesen 18 Spalten verteilt. Und das heißt dann:
"Houston wir haben ein Problem!"
Denn in diesem Falle wird das nix mit meinem eben erklärten Code, da keine eindeutige Identifizierung gegeben ist (bis jetzt).
Ja...das "musste" ich so machen, weil wir 3 Saisons im Jahr haben. Einmal Ganzjährig, dann einmal Frühjahr/Sommer und einmal Herbst/Winter. Im Datenblatt konnte ich aber Ganzjahr und FS zusammenfassen. Ist ja auch egal...für dieses Blatt brauchte ich das nicht unbedingt und ich habe es angepasst. Jetzt sind es nur noch 12 Spalten und 12 Blätter.

Ich wünsche Dir ein schönes und hoffentlich nicht so heißes Wochenende 8)

Liebe Grüße
Katte

Re: CALC: Daten von einem Tabellenblatt in ein anderes kopieren

von balu » Do, 13.08.2015 23:01

Hallo Katte,
Kannst du mir an dem Makro vielleicht noch erklären was welche Zeile für einen Sinn hat?!
Der Indexzähler für ein Array in Basic fängt bei 0 an. Also das erste Blatt ganz links am Anfang hat den Index 0. Der Mensch fängt von 1 an zu zählen, jedoch nicht Basic.
Genau so verhällt sich das mit den Spalten und Zeilen. Spalte A ist für uns die 1, in Basic ist das aber die 0.

Code: Alles auswählen

	With oBlattHersteller
		x = .Columns(0).queryEmptyCells() 'Spalte A
		iEndeQuelle = x(x.Count-1).RangeAddress.StartRow-1
	End With
Damit wird die letzte benutzte Zelle in der Spalte A im Blatt *Hersteller* ermittelt. Da das Ergebnis in diesem Falle die reale Zeilennummer wäre, aber im weiteren Verlauf die Zelladressierung nicht mit ".getCellRangeByName(..." sondern mit ".getCellByPosition(..." vorgenomen wird, muss die Zeile um 1 runtergezählt werden. Und deshalb: "StartRow-1"

Code: Alles auswählen

	for i = 3 to 9
Das ist der Zähler für die Spalten D bis J, im Blatt *Hersteller*.

Code: Alles auswählen

	if oBlattHersteller.getCellByPosition(i, iEndeQuelle ).string = "X" then
Das i ist die Spalte, und iEndeQuelle wird vorher bei "With oBlattHersteller..." ermittelt, und das ist die Zeilenposition.
Und dir dürfte ja die "If ... then" so weit klar sein.

Code: Alles auswählen

	sSucheBlattName = odoc.Sheets.ElementNames(i-3)
Da StarBasic die Blätternamen in einem Blatt-Array gespeichert hat, wird hier mit "odoc.Sheets.ElementNames(i-3)" darauf zugegriffen. Da das Blatt-Array mit 0 anfängt, jedoch der Zähler von der "For ... Next" bei 3 anfängt, muss die 3 von i abgezogen werden damit es keinen Fehler gibt. Denn in diesem Fall geht das Blatt-Array von 0 bis 7, während der "For ... Next"-Zähler von 3 bis 9 geht. Und würde man die 3 nicht abziehen, käme es bei dem Zähler 8 zu einem Fehler, da das Blatt-Array ja bei 7 aufhört.

Der gefundene Blattname aus dem Blatt-Array wird dann der Variablen *sSucheBlattName* zugewiesen.

Code: Alles auswählen

	oSucheBlatt = odoc.Sheets.GetByName( sSucheBlattName )
Und hier wird der Variablen *oSucheBlatt* das Blatt zugeordnet mit dem Blattnamen der vorhin gefunden wurde.

Code: Alles auswählen

	With oSucheBlatt
		x = .Columns(1).queryEmptyCells() 'Spalte B
		iEndeZiel = x(x.Count-1).RangeAddress.StartRow+1
	End With
Jetzt wird wieder die letzte Zeile gesucht. Ist eigentlich vom Prinzip her nix anderes wie vorhin. Jedoch ist ja diesmal das Blatt nicht fest vorgegeben, sondern Variabel. Und das zu untersuchende Blatt wurde ja eben ermittelt und der Variablen *oSucheBlatt* zugeordnet.
Der nächste Unterschied ist der, das diesmal zu der gefundenen letzten Benutzten Zeile eine 1 dazu addiert wird, denn es soll ja IN die erste leere Zelle nach der letzten benutzten Zelle etwas reingeschrieben werden. Und deshalb: "StartRow+1"

Code: Alles auswählen

oSucheBlatt.getCellRangeByName( "B" & iEndeZiel ).string = oBlattHersteller.getCellByPosition( 0, iEndeQuelle ).string
Da jetzt alle benötigten Zellen; im Blatt *Hersteller* sowie im gesuchten Blatt ermittelt wurden, wird nun auf ganz einfache Art und Weise die Zelle kopiert.

Es ist zu sehen, das 2 Methoden zur Zelladressierung gleichzeitig verwendet werden. Einerseits mit getCellRangeByName und anderseits mit getCellByPosition. Der Wert für die Zeile wird auch auf unterschiedliche Weise ermittelt, wie eben schon erwähnt mit "StartRow-1" und "StartRow+1".

Natürlich könnte man auch eine einheitliche Zelladressierung nehmen, jedoch muss man dann aufpassen das man sich nicht vertut. Zum Beispiel wäre folgendes auch möglich.

Code: Alles auswählen

oSucheBlatt.getCellRangeByName( "B" & iEndeZiel ).string = oBlattHersteller.getCellRangeByName( "A" & iEndeQuelle+1 ).string
Aber so etwas kann zu Verwirrung führen, wenn zu iEndeQuelle wieder eine 1 addiert wird.
Und andersrum

Code: Alles auswählen

oSucheBlatt.getCellByPosition( 1, iEndeZiel-1 ).string = oBlattHersteller.getCellByPosition( 0, iEndeQuelle ).string
würde die Frage auftauchen, warum jetzt für iEndeZiel eine 1 abgezogen wird? Klar könnte man das auch umgehen indem die -1 komplett entfällt, aber dafür müsste dann die dementsprechende "With oSucheBlatt" auch geändert werden.


Du merkst schon: "Viele Wege führen nach Rom." Und für welchen man sich entscheidet, ist manchmal gar nicht so einfach. Und den eingeschlagenen Weg auch noch plausibel zu erklären, ist auch wieder so ein Ding für sich selber, da dies alles Geschmacksache ist.

Ich hoffe aber das Du im groben jetzt das ganze etwas besser verstehst.


ich weiß nicht wie bzw wo ich angebe, in welche Tabellenblätter der Hersteller verteilt werden soll. Ich habe in meiner eigentlichen Datei 12 Tabellenblätter, die für die "Saisons" sind. Von Position 11 bis 22. In dem Blatt Hersteller werden die Saisons von Spalte E bis V eingetragen. also in LO-Sprache 4 to 22
Wenn "Von Position 11 bis 22" die Basic Zählung ist, dann interessieren dich die Blätter 0 bis 10 jetzt überhaupt nicht.

Aber Halt Stop!!!
Da stimmt etwas nicht!
11 bis 22 macht 12 Blätter. Okay.
ABER Spalte E bis V sind in Basic Zählung 18 Spalten, und damit wären das dann 18 Blätter. Und außerdem ist das dann in "LO-Sprache" dann nicht 4 to 22, sondern 4 to 21.

Und wenn ich das jetzt richtig sehe, dann sind die 12 Saison-Blätter "wahllos" in diesen 18 Spalten verteilt. Und das heißt dann:
"Houston wir haben ein Problem!"
Denn in diesem Falle wird das nix mit meinem eben erklärten Code, da keine eindeutige Identifizierung gegeben ist (bis jetzt).

Der Code liese sich ja noch irgendwie umschreiben, so das er auch noch zusätzlich sicherer ist (gegen versehentliches verschieben der Blätter), aber leider erschwerst Du das ganze Vorhaben von vornherein. Denn in deiner Beispieldatei heißen die 3 Blätter:

"Datenblatt 2015_FS2015", "Datenblatt HW2015", "Datenblatt 2016_FS2016".

Das ist suboptimal -{auf gut Deutsch geagt: scheiße!}-, da doppelt gemoppelt und nicht konsequent durchdacht. Obwohl in FS2016 ja wohl schon die Jahreszahl vorhanden ist, setzt Du noch eine Jahreszahl davor. Das machst Du aber nicht bei HW, und das ist blöde.


Würden die Blätter wie folgt lauten,

"Datenblatt FS2015", "Datenblatt HW2015", "Datenblatt FS2016"

dann wäre das umschreiben des Codes gar nicht mehr so schwer, da ich dann nicht auf das Blatt-Array zugreifen würde, sondern die Kopfzeile auslese und noch "Datenblatt " vorne ranhänge um den Blattnamen zu erstellen.


Und nun habe ich keine Lust mehr, Wetter und Streß hinterlassen ihre Spuren.


Gruß
balu

Re: CALC: Daten von einem Tabellenblatt in ein anderes kopieren

von Katte » Do, 13.08.2015 09:53

Hallo balu

Ich habe mich als erstes mal deinem Code gewidmet. Jetzt hab ich nur das Problem....ich weiß nicht wie bzw wo ich angebe, in welche Tabellenblätter der Hersteller verteilt werden soll. Ich habe in meiner eigentlichen Datei 12 Tabellenblätter, die für die "Saisons" sind. Von Position 11 bis 22. In dem Blatt Hersteller werden die Saisons von Spalte E bis V eingetragen. also in LO-Sprache 4 to 22

Kannst du mir an dem Makro vielleicht noch erklären was welche Zeile für einen Sinn hat?! :D Damit ich das besser verstehen kann?
Der Profi hier ist Stephan. Ich bin nur ein kleiner fortgeschrittener Anfänger.
Stephan hat mir mit meinem Porjekt auch schon sehr viel weiter geholfen und ich bin ihm da auch sehr dankbar. Aber fortgeschrittene Anfänger können den nicht so weit fortschrittenen Anfängern wie mich (vor allem was Makros angeht) manchmal einige Sachen besser erklären.
Wenn ich dich richtig verstehe, dann willst Du aus dem Blatt *Hersteller* den letzten Hersteller finden der gleichzeitig in der Spalte E den Marker X hat, um ihn dann auf das Blatt *Datenblatt 2015_FS2015* in die dortige erste freie Zelle nach der letzten benutzten Zelle zu kopieren.

Und wenn ich jetzt mal etwas weiter meine Gedanken freien Lauf lasse, möchtest Du im Endeffekt eigentlich viel lieber den letzten eingetragenen Hersteller in das, oder die 'Saison Datenblättern' automatisch verteilen lassen da ein Hersteller durchaus in mehreren Blättern eingetragen werden kann. Wobei die Kürzel für die 'Saison Datenblättern' in der Kopfzeile (Zeile 2) stehen. Und Du hattest dir bestimmt gedacht, wenn Du das mit dem gegebenen Beispiel für 2015 hinbekommst, dann könntest Du das für die anderen Blätter einfach dementsprechend anpassen. Und aus diesem Grude ist der Button im Blatt *Hersteller* auch mit "Hersteller verteilen" beschriftet.
du hast den Nagel auf den Kopf getroffen :D

Und eigentlich müssten die Hersteller dann auch noch auf Tabellenblätter für die Teams aufgeteilt werden (Textil (Blatt 8), Parts (Blatt 5), Equipment (Blatt 3)) anhand der Spalte C im Blatt Hersteller. Wie gesagt, das ist wirklich nur ein Ausschnitt von meiner eigentlichen Datei. Und ich dachte wirklich, wenn man mir einen Denkanstoß gibt und ich das auch noch verstehe, dann kann ich den Rest alleine machen :D Will ja nicht alles jemand anderen machen lassen, möchte ja auch was lernen dabei ;) Aber manchmal ist das mit den Makros gar nicht so einfach...zu mal man im Netz auch nicht vieles findet.

Danke schon mal und viele Grüße
Katte

Re: CALC: Daten von einem Tabellenblatt in ein anderes kopieren

von balu » Mi, 12.08.2015 21:32

Hallo Katte,
aber im Vergleich zu euch Profis
Der Profi hier ist Stephan. Ich bin nur ein kleiner fortgeschrittener Anfänger.

Das ist ja der Wahnsinn :D Ich danke dir erstmal für die Mühe, die du dir gemacht hast.
Freut mich wirklich zu hören. Danke dafür.

--- was ist AOO?
ApacheOpenOffice. Das ist ferner der reguläre Nachfolger von OpenOffice.org (OO.o).

Wahrscheinlich melde ich mich morgen noch mal mit jeder Menge Fragen
Tu das ruhig. Ich weiß blos nicht ob ich dir dann aus Zeitgründen helfen kann, können auch andere.



Gute Nacht
balu

Re: CALC: Daten von einem Tabellenblatt in ein anderes kopieren

von Katte » Mi, 12.08.2015 21:17

Hallo balu

Das ist ja der Wahnsinn :D Ich danke dir erstmal für die Mühe, die du dir gemacht hast. Ich werde mich da morgen mal dran setzen und deine Ratschläge versuchen umzusetzen. Ich hab ein bisschen Ahnung von Excel bzw hier LibreOffice...aber im Vergleich zu euch Profis ist das wahrscheinlich lächerlich :o
Denn Du überarbeitest eine wohl ehemalige Excel-Datei.
--- Ich habe schon mal eine ähnliche Datei entworfen, aber da andere damit arbeiten müssen, die so gar keine Ahnung von Excel haben, wollte ich das vereinfachen und habe zwar noch mal komplett neu angefangen aber das Grundgerüst der alten Datei verwendet. Die Datei, die ich hier als Beispiel hochgeladen habe, ist ja nur ein kleiner Schnipsel von der eigentlichen. Das ist mittlerweile ein Mörderding und einigen würden wahrscheinlich die Haare zu Berge stehen, wenn sie die Formeln und Makros sehen ;) :D Aber bis jetzt funzt das alles....bis auf dieses "Herstellerproblem" Was auch schon das Problem in der alten Version war.
Du arbeitest wohl mit LO (LibreOffice 4.4.2.2).
--- seit heute hab ich LO 5.0.0.5 oder so. Aber vorher war es 4.4.2.2. Was ich LO schon verflucht habe...es raubt mir manchmal den letzten Nerv.
Denn in LO funktioniert das, aber nicht in AOO.
--- was ist AOO?

Wahrscheinlich melde ich mich morgen noch mal mit jeder Menge Fragen :D

Ich danke dir schon mal wie verrückt

Schönen Abend noch
LG Katte

Re: CALC: Daten von einem Tabellenblatt in ein anderes kopieren

von balu » Mi, 12.08.2015 19:02

Hallo Katte,

Du arbeitest wohl mit LO (LibreOffice 4.4.2.2). Auch wenn LO einige Excel eigenarten übernommen hat, so ist dennoch solch eine Formel nicht wirklich empfehlenswert.

Code: Alles auswählen

=WENN('Datenblatt 2016_FS2016'.B4="";"";SVERWEIS('Datenblatt 2016_FS2016'.$B$4:$B$1493;$Hersteller.$A$3:$C$1505;3; ))
Denn da sind 2 Sachen in der SVERWEIS drin die unter umständen dir noch zusätzlich das Leben versauern können.

Die Formel ist in den 3 'Saison Datenblättern' in deiner abgespeckten Beispieldatei in der Spalte C.

1.
Das Suchkriterium ist eine Zelle und kein Zellbereich.
Also nicht

Code: Alles auswählen

SVERWEIS('Datenblatt 2016_FS2016'.$B$4:$B$1493;$Hersteller.$A$3:$C$1505;3; ))
sondern

Code: Alles auswählen

SVERWEIS('Datenblatt 2016_FS2016'.$B4;$Hersteller.$A$3:$C$1505;3; ))
Natürlich könnte auch ein feststehendes Kriterium gesucht werden, asber hier geht es um eine Zelle.


2.
Auch wenn es funktioniert, so ist es dennoch empfehlenswert den 4. Parameter in der SVERWEIS einzutragen. Denn in LO funktioniert das, aber nicht in AOO.
Also nicht

Code: Alles auswählen

SVERWEIS('Datenblatt 2016_FS2016'.$B4;$Hersteller.$A$3:$C$1505;3; ))
sondern

Code: Alles auswählen

SVERWEIS('Datenblatt 2016_FS2016'.$B4;$Hersteller.$A$3:$C$1505;3;0))


Und dadurch wurde dann die gesamte Formel wie folgt aussehen.

Code: Alles auswählen

=WENN('Datenblatt 2016_FS2016'.B4="";"";SVERWEIS('Datenblatt 2016_FS2016'.$B4;$Hersteller.$A$3:$C$1505;3;0))

Ach ja, noch etwas wichtiges, auch wenn es dir nicht gefallen wird.
Mach deine Datei noch mal komplett neu, bis auf die Makros. Denn Du überarbeitest eine wohl ehemalige Excel-Datei. Und von daher ist es besser wenn sie neu erstellt wird, da eventuelle Probleme sich einschleichen können, oder sich schon eingeschlichen haben (ist wohl nicht garantiert, aber Sicher ist Sicher). Und außerdem ist die Datei ja durch den Einsatz von StarBasic (Makro) so wie so nicht mehr zu 100% unter Excel lauffähig.


Und nun zu deinem Code, besser gesagt zu deinem Problem damit.
Wenn ich dich richtig verstehe, dann willst Du aus dem Blatt *Hersteller* den letzten Hersteller finden der gleichzeitig in der Spalte E den Marker X hat, um ihn dann auf das Blatt *Datenblatt 2015_FS2015* in die dortige erste freie Zelle nach der letzten benutzten Zelle zu kopieren.

Und wenn ich jetzt mal etwas weiter meine Gedanken freien Lauf lasse, möchtest Du im Endeffekt eigentlich viel lieber den letzten eingetragenen Hersteller in das, oder die 'Saison Datenblättern' automatisch verteilen lassen da ein Hersteller durchaus in mehreren Blättern eingetragen werden kann. Wobei die Kürzel für die 'Saison Datenblättern' in der Kopfzeile (Zeile 2) stehen. Und Du hattest dir bestimmt gedacht, wenn Du das mit dem gegebenen Beispiel für 2015 hinbekommst, dann könntest Du das für die anderen Blätter einfach dementsprechend anpassen. Und aus diesem Grude ist der Button im Blatt *Hersteller* auch mit "Hersteller verteilen" beschriftet.

Die einfachste Methode wäre wie folgt.
a) Im Blatt *Hersteller* den letzten Hersteller finden
b) anschließend schauen in welchen Zellen der gleichen Zeile in den Spalten D bis J ein X-Marker steht
c) wenn Marker gefunden, dann in dem dementsprechenden Blatt die letzte benutzte Zeile finden, und aus dem Blatt *Hersteller* den Hersteller in dieses Blatt in die nächste leere Zelle nach der letzten benutzten Zelle kopieren
d) da ja ein Hersteller in mehreren Blättern vertreten sein kann/darf, die Schritte b) und c) so lange wiederholen bis man in der letzten Spalte (J) angelangt ist.

Ich habe deine Beispieldatei auf 7 'Saison-Datenblätter' erweitert, da Du ja im Blatt *Hersteller* eigentlich auch 7 vorgegeben hast; Spalte D bis J. Und dadurch liese sich folgendes Makro erstellen.

Code: Alles auswählen


Sub Main

	Dim odoc as Object, oBlattHersteller as Object, oSucheBlatt as Object
	Dim sSucheBlattName as String

	odoc = ThisComponent
	oBlattHersteller = odoc.Sheets().GetByName("Hersteller")
'------------------------------------------------------------------------------		

	With oBlattHersteller
		x = .Columns(0).queryEmptyCells() 'Spalte A
		iEndeQuelle = x(x.Count-1).RangeAddress.StartRow-1
	End With

'------------------------------------------------------------------------------	
	for i = 3 to 9

		if oBlattHersteller.getCellByPosition(i, iEndeQuelle ).string = "X" then
			sSucheBlattName = odoc.Sheets.ElementNames(i-3)
			oSucheBlatt = odoc.Sheets.GetByName( sSucheBlattName )				
			
			With oSucheBlatt
				x = .Columns(1).queryEmptyCells() 'Spalte B
				iEndeZiel = x(x.Count-1).RangeAddress.StartRow+1
			End With				
			
			oSucheBlatt.getCellRangeByName( "B" & iEndeZiel ).string = oBlattHersteller.getCellByPosition( 0, iEndeQuelle ).string
		end if
'------------------------------------------------------------------------------
	next i
'------------------------------------------------------------------------------
	print "Fäddisch :-)))"
End Sub
Ist wohl nicht schön und könnte man auch noch etwas überarbeiten, aber es funktioniert so wie ich es eben bei den Punkten a) bis d) beschrieben habe.

W I C H T I G !!!!
Die 'Saison-Datenblätter' müssen VOR dem Blatt *Hersteller* stehen! Also auf keinem Fall dahinter. Und außerdem müssen sie noch momentan mit der Reihenfolge der Spalten D bis J übereinstimmen.

Würde in der Zeile 2 die exakt gleichen Namen stehen wie in den Blattregistern (oder umgekehrt), dann könnte man das Makro noch etwas sicherer schreiben. Denn so besteht die Gefahr, das wenn man ein Blatt aus versehen verschiebt, die richtigen Daten in das falsche Blatt übertragen werden. Oder man müsste mein Makro dementsprechend kompliziert umschreiben, wozu ich jetzt keine Lust hatte.

Ach ja, beinahe vergessen.
Drücke auf den Button im Blatt *Hersteller*, und schon wird der dort als letzter eingetragene Hersteller auf 2 Blätter aufgeteilt. Das geht sehr schnell :D, mit einer Rückmeldung. Du kannst aber auch mehr als 2 Blätter auswählen, einfach in den Spalten D bis J einen X-Marker setzen.

Viel Spaß damit ;-)



Gruß
balu
Dateianhänge
Bsp8-v_0.2.ods
(127.33 KiB) 144-mal heruntergeladen

Re: CALC: Daten von einem Tabellenblatt in ein anderes kopieren

von Katte » Mi, 12.08.2015 10:54

der komplette Code ist

Code: Alles auswählen

Sub Herstellerdaten_uebertragen
   odoc = ThisComponent
   cur = ThisComponent.Sheets().GetByName("Datenblatt 2015_FS2015").createCursor
   cur.GotoEndOfUsedArea(True)
   z = cur.GetRangeAddress.EndRow 'letzte_Zeile
   werte = oDoc.Sheets().getByName("Tabelle1").getCellRangeByName("A3:V1500").getDataArray()
   For i = 0 To UBOUND(werte())
      tmp = werte(i)
      If tmp(4) = "X" Then 'Spalte E
         oDoc.Sheets().GetByName("Datenblatt 2015_FS2015").getCellRangeByName("B" & z+1).FormulaLocal = tmp(0)
         z = z + 1
      End If
   Next i
End Sub

Re: CALC: Daten von einem Tabellenblatt in ein anderes kopieren

von Stephan » Mi, 12.08.2015 10:46

aber das tu ich ja schon
was soll ich darauf antworten? Anhand des Codes, und einiger sinnvoller Annahmen wie der restliche Code ist, kann das nicht sein.

Wenn es aber doch so ist, dann wirst Du wohl den kompletten Code posten müssen der diesen Fehler hervorbringt, denn nur so kann man die Ursache finden.


Gruß
Stephan

Re: CALC: Daten von einem Tabellenblatt in ein anderes kopieren

von Katte » Mi, 12.08.2015 10:44

und wie ich gerade festgestellt habe...werden alle hersteller aus dem Blatt "Hersteller" wirklich ans Ende der Tabelle geschrieben...alle 926. Eigentlich soll ja nur die letzte Zeile des Blatts "Hersteller" in die anderen Blätter in die letzte freie Zeile geschrieben werden. Denn das Ende der Tabelle ist weiter unten, weil da noch einige Formeln drin sind....da erkennt LO das wohl als Ende der Tabelle. Also muss ich LO sagen, dass es die letzte freie Zelle in Reihe B nehmen muss...oder?! Aber wie mach ich das?

Re: CALC: Daten von einem Tabellenblatt in ein anderes kopieren

von Katte » Mi, 12.08.2015 10:34

aber das tu ich ja schon

Code: Alles auswählen

odoc = ThisComponent
cur = ThisComponent.Sheets().GetByName("Datenblatt 2015_FS2015").createCursor
cur.GotoEndOfUsedArea(True)
z = cur.GetRangeAddress.EndRow
So steht das auch in deinem Makro...trotzdem schreibt er in dem Tabellenblatt in die gleiche Zeile wie in dem Blatt der Hersteller. :?:

Re: CALC: Daten von einem Tabellenblatt in ein anderes kopieren

von Stephan » Mi, 12.08.2015 10:17

Wie sage ich LO, dass er auch das Tabellenende in im "Datenblatt 2015_FS2015" nimmt?
indem Du das Ende DIESES Datenblatts bestimmst, also:

Code: Alles auswählen

odoc = ThisComponent
cur = ThisComponent.Sheets().GetByName("Datenblatt 2015_FS2015").createCursor
cur.GotoEndOfUsedArea(True)
z = cur.GetRangeAddress.EndRow
wohingegen das Ende des anderen Datenblattes ("Hersteller") ja wäre:

Code: Alles auswählen

odoc = ThisComponent
cur = ThisComponent.Sheets().GetByName("Hersteller").createCursor
cur.GotoEndOfUsedArea(True)
z = cur.GetRangeAddress.EndRow

Gruß
Stephan

Re: CALC: Daten von einem Tabellenblatt in ein anderes kopieren

von Katte » Mi, 12.08.2015 09:23

Hallo Stephan

Sorry, dass es wieder was gedauert hat...hatte leider keine Zeit. Aber dafür jetzt reichlich ;)

Ein Problem hab ich noch. Die Zeilenanzahl im Blatt "Hersteller" und "Datenblatt 2015_FS2015" stimmen nicht überein. Wenn ich im Blatt "Hersteller" einen neuen anlege wird er zB in Zeile 926 geschrieben, weil das das Ende der Tabelle ist und beim Übertragen in "Datenblatt 2015_FS2015" wird er auch in Zeile 926 geschrieben. Dort ist das Tabellenende aber 767. Wie sage ich LO, dass er auch das Tabellenende in im "Datenblatt 2015_FS2015" nimmt?

Danke schon mal

VG

Re: CALC: Daten von einem Tabellenblatt in ein anderes kopieren

von Stephan » So, 02.08.2015 20:49

Irgendwas macht LO auch, wenn ich es ausführe...aber es schreibt nix ans Ende der Tabelle.
Dein Code schreibt einmalig in die nächsthöhere Zeile, das muss doch auffallen.

der richtige Code ist:

Code: Alles auswählen

Sub Herstellerdaten_uebertragen
   odoc = ThisComponent
   cur = ThisComponent.Sheets().GetByName("Datenblatt 2015_FS2015").createCursor
   cur.GotoEndOfUsedArea(True)
   z = cur.GetRangeAddress.EndRow 'letzte_Zeile
   werte = oDoc.Sheets().getByName("Tabelle1").getCellRangeByName("A3:V1500").getDataArray()
   For i = 0 To UBOUND(werte())
      tmp = werte(i)
      If tmp(4) = "X" Then 'Spalte E
         oDoc.Sheets().GetByName("Datenblatt 2015_FS2015").getCellRangeByName("B" & z+1).FormulaLocal = tmp(0)
         z = z + 1
      End If
   Next i
End Sub
Gruß
Stephan

Re: CALC: Daten von einem Tabellenblatt in ein anderes kopieren

von Katte » So, 02.08.2015 14:48

Hallo Stephan

Ich weiß...es ist schon eine Ewigkeit her als du mir eine Antwort auf mein Problem geschrieben hattest. Ich hatte nur leider keine Zeit daran weiter zu arbeiten bzw. habe erstmal kleinere Baustellen in Angriff genommen.

Leider kenne ich mich mit Arrays so überhaupt nicht aus. Also noch weniger als überhaupt mit Makros ;) Ich weiß, es ist hier nicht gern gesehen...aber könntest du mir vielleicht ein fertiges Makro zu meinem Problem schreiben? Ich habe keinen Plan wie ich das schreiben soll.
Mein Entwurf sieht jetzt so aus

Code: Alles auswählen

Sub Herstellerdaten_uebertragen
	odoc = ThisComponent
	cur = ThisComponent.Sheets().GetByName("Datenblatt 2015_FS2015").createCursor
	cur.GotoEndOfUsedArea(True)
	z = cur.GetRangeAddress.EndRow 'letzte_Zeile
	werte = oDoc.Sheets().getByName("Hersteller").getCellRangeByName("A3:V1500").getDataArray()
	For i = 0 To UBOUND(werte())
	tmp = werte(i)
	If tmp(4) = "X" Then 'Spalte E
      oDoc.Sheets().GetByName("Datenblatt 2015_FS2015").getCellRangeByName("B" & z).FormulaLocal = tmp(0)
      'z = z + 1
   End If
Next i	
End Sub
Irgendwas macht LO auch, wenn ich es ausführe...aber es schreibt nix ans Ende der Tabelle. :? Es kommt auch keine Fehlermeldung. Und das Netz gibt in Sachen LO und Arrays nicht viel her :(

Schonmal VIELEN DANK im voraus
Gruß Katte

Re: CALC: Daten von einem Tabellenblatt in ein anderes kopieren

von Stephan » Di, 23.06.2015 10:22

es beschleunigt den Ablauf des Makros erheblich erst alle Werte in ein Array einzulesen und dann mit dem Array zu arbeiten, z.B. sinngemäß so hier:

Code: Alles auswählen

z = 767
oDoc = ThisComponent
werte = oDoc.Sheets().getByName("Hersteller").getCellRangeByName("A3:J1500").getDataArray()
For i = 0 To UBOUND(werte())
	tmp = werte(i)
	If tmp(4) = "X" Then 'Spalte E
		oDoc.Sheets().GetByName("Datenblatt 2015_FS2015").getCellRangeByName("B" & z),FormulaLocal = tmp(0)
		z = z + 1
	End If
Next i
hierbei sollten dann konsequenterweise aber auch noch die 'SChreibausgaben':

Code: Alles auswählen

oDoc.Sheets().GetByName("Datenblatt 2015_FS2015").getCellRangeByName("B" & z),FormulaLocal = tmp(0)
nicht direkt geschrieben werden sondern ihrerseits in einem Array gesammelt und das komplette Array am Ende in die Datei mittels .SetDataArray() geschrieben werden.

z ist entbehrlich wenn man die jeweils erste leere Zeile bestimmt, z.B.:

Code: Alles auswählen

cur = ThisComponent.Sheets().GetByName("Datenblatt 2015_FS2015").createCursor
cur.GotoEndOfUsedArea(True)
letzte_zeile = cur.GetRangeAddress.EndRow
Gruß
Stephan

Nach oben