Tabellenblatt ans Ende verschieben,Kopieren

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

Moderator: Moderatoren

Jörg
*****
Beiträge: 392
Registriert: Mo, 21.10.2013 12:05

Tabellenblatt ans Ende verschieben,Kopieren

Beitrag von Jörg »

Hallo Fachleute,
nachfolgenden Code habe ich hier aus dem Form.

Code: Alles auswählen

sub copy_sheet_and_protect

odoc=ThisComponent
osheets=odoc.sheets
ocount=osheets.Count
oActiveSheet=odoc.currentController.ActiveSheet
oNewSheetName= inputbox ("neuer Name: ","aktuelle Tabelle kopieren", "Tabelle")
oNewPassword= inputbox ("Passwort: ","Tabellenschutz", "Tabelle")
osheets.copyByName( oActiveSheet.Name, oNewSheetName, ocount )
oNewSheet=osheets(ocount)
oNewSheet.protect(oNewPassword)
msgbox ("Tabelle '"+oNewSheetName+"' angelegt und geschützt"

end sub
Das Makro verschiebt das jeweils aktivierte Tabellenblatt.
Mein Wunsch wäre es aber über den Index (1)zuzugreifen.
Über den Namen wäre auch nicht gut, da er sich ändert.
Hab schon alles mir mögliche probiert.
Vielen Dank.
Zuletzt geändert von Jörg am Fr, 03.02.2017 19:00, insgesamt 1-mal geändert.
Gruß Jörg

Win 10 Pro AOO 4.1.15
Karolus
********
Beiträge: 7438
Registriert: Mo, 02.01.2006 19:48

Re: Tabellenblatt ans Ende verschien,Kopieren

Beitrag von Karolus »

Hallo

Code: Alles auswählen

…
osheets.copyByName( osheets(1).Name, oNewSheetName, ocount )
…
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Jörg
*****
Beiträge: 392
Registriert: Mo, 21.10.2013 12:05

Re: Tabellenblatt ans Ende verschien,Kopieren

Beitrag von Jörg »

Hallo Karolus,
erstmal ein Gutes Neues.
Danke Dir.
Nachfolgend der geänderte Code.
Habe noch dieses

Code: Alles auswählen

oActiveSheet=odoc.currentController.ActiveSheet
geändert in

Code: Alles auswählen

osheets (0)=odoc.currentController.ActiveSheet

Code: Alles auswählen

sub copy_sheet_and_protect2

odoc=ThisComponent
osheets=odoc.sheets
ocount=osheets.Count
osheets (0)=odoc.currentController.ActiveSheet
oNewSheetName= inputbox ("neuer Name: ","aktuelle Tabelle kopieren", "Tabelle")
oNewPassword= inputbox ("Passwort: ","Tabellenschutz", "Tabelle")
osheets.copyByName(osheets (0).Name, oNewSheetName, ocount )
oNewSheet=osheets(ocount)
oNewSheet.protect(oNewPassword)
msgbox ("Tabelle '"+oNewSheetName+"' angelegt und geschützt"

end sub
Gruß Jörg

Win 10 Pro AOO 4.1.15
Karolus
********
Beiträge: 7438
Registriert: Mo, 02.01.2006 19:48

Re: Tabellenblatt ans Ende verschien,Kopieren

Beitrag von Karolus »

Bullschit!
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Jörg
*****
Beiträge: 392
Registriert: Mo, 21.10.2013 12:05

Re: Tabellenblatt ans Ende verschien,Kopieren

Beitrag von Jörg »

Karolus hat geschrieben: Fr, 20.01.2017 14:53Bullschit!
ach ja, ganz der Alte... :lol:
ich geh mal davon aus, dass Du diese Änderung meinst ?

Code: Alles auswählen

osheets (0)=odoc.currentController.ActiveSheet
Lasse ich das "(0)" weg, krieg ich das:
Unbenannt1.PNG
Unbenannt1.PNG (6.17 KiB) 8487 mal betrachtet
Falls Du etwas anderes meinst, lasse es mich bitte wissen.
Gruß Jörg

Win 10 Pro AOO 4.1.15
Karolus
********
Beiträge: 7438
Registriert: Mo, 02.01.2006 19:48

Re: Tabellenblatt ans Ende verschien,Kopieren

Beitrag von Karolus »

Hallo

Dann müsste das folgende auch diesen Fehler produzieren, tut es aber nicht, sondern läuft einwandfrei durch.

Code: Alles auswählen

sub main
sheets = thisComponent.Sheets
sheets.copyByName( sheets(0).Name , "neuerName", sheets.Count)
end sub
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Jörg
*****
Beiträge: 392
Registriert: Mo, 21.10.2013 12:05

Re: Tabellenblatt ans Ende verschien,Kopieren

Beitrag von Jörg »

Guten Morgen WiM,
Vielen Dank für Deinen Code.
Aber bei mir wird die letzte Tabelle verschoben.
Erst mit diesen Änderungen funktioniert es, wie gewünscht. (Konkret geht es um die 4. Tabelle Index(3) )

Code: Alles auswählen

oSheet = odoc.Sheets (3)

Code: Alles auswählen

oSheets = oDoc.currentController.ActiveSheet
kpl. sieht das dann so aus:

Code: Alles auswählen

Sub copy_sheet_and_protect2

    oDoc    = ThisComponent
    oSheet = odoc.Sheets (3)
    oSheets  = oDoc.currentController.ActiveSheet '1 Tabellenblatt
    oNewSheetName = Inputbox ("neuer Name: ","aktuelle Tabelle kopieren", "Tabelle")
    
    oSheets = oDoc.sheets   'alle Tabellenblätter
    oCount  = oSheets.Count 'zählt Tabellenblätter

    'MsgBox "Akt.-TAB-NN: " & oSheet.Name & "  ||  oCount.Wert = " & oCount
    'Exit Sub

    oSheets.copyByName( oSheet.Name , oNewSheetName , oCount )
    
    oNewPassword  = Inputbox ("Passwort: ","Tabellenschutz", "Tabelle")
    oNewSheet=osheets(ocount)
    oNewSheet.protect(oNewPassword)
    
    MsgBox ("Tabelle '"+oNewSheetName+"' angelegt und geschützt"
    
End Sub
Warum das so ist, wie schon gesagt, keine Ahnung.
Aber Hauptsache es funktioniert.
Gruß Jörg

Win 10 Pro AOO 4.1.15
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Tabellenblatt ans Ende verschien,Kopieren

Beitrag von balu »

Hallo Jörg,

Warum das so ist, wie schon gesagt, keine Ahnung.
Das mit "keine Ahnung" musst Du dir dringends abgewöhnen.

Aber Hauptsache es funktioniert.
Und dise Einstellung kann dich noch in den Wahnsinn treiben.

Beide Punkte zusammen betrachtet, ergeben dann, ich sags mal so rum, schusseligkeitsfeler die dir noch den letzten Nerv rauben werden.
Ich zeigs dir mal am folgenden Beispiel.

Code: Alles auswählen

    oSheets  = oDoc.currentController.ActiveSheet '1 Tabellenblatt
    oNewSheetName = Inputbox ("neuer Name: ","aktuelle Tabelle kopieren", "Tabelle")
    
    oSheets = oDoc.sheets   'alle Tabellenblätter
Fällt dir was auf?



Na gut, werde dich aufklären.

Erst wird der Variable oSheets das folgende Objekt zugeordnet: oDoc.currentController.ActiveSheet.

Dann, zwei Zeilen tiefer, wird der gleichen Variable oSheets ein anderes Objekt zugeordnet, und zwar dieses hier: oDoc.sheets.

Na Glückwunsch auch, wenn es funktioniert. Aber wenn Du deine, sorry für den folgenden Ausdruck, Gleichgültigkeit beibehälst, dann kannst Du noch quasi in "Teufels Küche" kommen.

So ein paar Code-Zeilen wie in deinem letzten Posting auf unstimigkeiten hin zu überprüfen dürfte ja wohl nicht arg so schwer sein. Wenn Du das aber nicht machst, dann darfst Du dich nicht darüber wundern wenn es dann mal an anderer Stelle fürchterlich hakt.

Diese Zeile

Code: Alles auswählen

    oSheets  = oDoc.currentController.ActiveSheet '1 Tabellenblatt
kannst Du getrost löschen, da sie ja durch die zweit genannte Zuordnung überflüssig ist.


Aber bei mir wird die letzte Tabelle verschoben.
Na dann erklär mir mal wie Du hiermit

Code: Alles auswählen

oSheets.copyByName( oSheet.Name , oNewSheetName , oCount )
eine Tabelle verschieben kannst?



Und jetzt mal eine ganz ganz ganz wichtige Frage an dich.
Was willst Du denn jetzt wirklich?
- Ein ganz bestimmtes Tabellenblatt verschieben, oder kopieren.
- Oder immer das letzte Tabellenblatt verschieben oder kopieren.
- Soll das dementsprechende Blatt immer ans Ende hin verschoben oder kopiert werden.

Das ist wirklich sehr wichtig zu wissen, da je nach dem was Du möchtest, der dementsprechende Code ganz anders aufgebaut werden muss.



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
Jörg
*****
Beiträge: 392
Registriert: Mo, 21.10.2013 12:05

Re: Tabellenblatt ans Ende verschieben,Kopieren

Beitrag von Jörg »

Hallo Balu,
danke für Deine ausführlichen Anmerkungen.
Ziel:
Immer das 4. Tabellenblatt kopieren und immer ans Ende der Mappe verschieben
Hab ja bei Dannenhöfer nachgesehen, vielleicht nicht gründlich genug, aber die dort vorgeschlagene Methode erwartet als 2. Parameter die Position und die ändert sich ja bei meinem Vorhaben.
balu hat geschrieben: Sa, 21.01.2017 12:08 Na dann erklär mir mal wie Du hiermit

Code: Alles auswählen

oSheets.copyByName( oSheet.Name , oNewSheetName , oCount )

eine Tabelle verschieben kannst?
Hab ich doch eigentlich nicht gesagt. (Copy= Kopieren)
balu hat geschrieben: Sa, 21.01.2017 12:08 Aber wenn Du deine, sorry für den folgenden Ausdruck, Gleichgültigkeit beibehälst,
Ja ist doof, mgl.-weise sind mir event. Konsequenzen nicht klar.
Karolus hat geschrieben: Fr, 20.01.2017 16:45 Dann müsste das folgende auch diesen Fehler produzieren, tut es aber nicht, sondern läuft einwandfrei durch.
Habe es so noch mal probiert:

Code: Alles auswählen

sub copy_sheet_and_protect
odoc=ThisComponent
osheets=odoc.sheets
ocount=osheets.Count
oNewSheetName= inputbox ("neuer Name: ","aktuelle Tabelle kopieren", "Tabelle")
osheets.copyByName(osheets (3).Name, oNewSheetName, ocount )
oNewSheet=osheets(ocount)
end sub
Jetzt ohne Fehlermeldung.
Bin für jeden weiteren Hinweis dankbar !
Gruß Jörg

Win 10 Pro AOO 4.1.15
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Tabellenblatt ans Ende verschien,Kopieren

Beitrag von balu »

Hallo Jörg,
Immer das 4. Tabellenblatt kopieren und immer ans Ende der Mappe verschieben
In meinen Augen ist das ein einfaches kopieren.
Aber deine Aussage ist schon verwirrend, wenn man sich das genauer anschaut.
Was kopieren heißt dürfte ja wohl klar sein. Und verschieben heißt ja, das etwas wo anders hinkommt und dabei seine alte Position verlässt.
So, und nun das ganze mal als ein theoretisches Beispiel mit Tabellenblättern.

Angenommen eine Datei hat insgesamt 5 Blätter (Kurzform für: Tabellenblätter). Und jetzt wird das 4. Blatt an das Ende hin verschoben. Daraus ergibt sich, das die Datei weiterhin 5 Blätter enthällt. Jedoch hat sich die Reihenfolge geändert.
Vorher waren es beispielsweise:
Tabelle1, Tabelle2, Tabelle3, Tabelle4, Tabelle5.

Nach dem verschieben von Tabelle4 ans Ende sieht das dann so aus:
Tabelle1, Tabelle2, Tabelle3, Tabelle5, Tabelle4.

Und bei einem erneuten verschieben tauschen die letzten beiden wieder ihre Position, so das sie wieder wie am Anfang dastehen, also von 1 bis 5. Und das kann ich mir nicht wirklich vorstellen, das Du das willst, da dein Makrocode ja auch etwas anderes sagt.

Wenn es nur um den reinen Kopiervorgang geht, dann reicht ja das folgende. Und ja, der Code funktioniert und ist auch korrekt.

Code: Alles auswählen

sub copy_sheet_and_protect
oSheets = ThisComponent.sheets
iCount = oSheets.Count
sNewSheetName = inputbox ("neuer Name: ","aktuelle Tabelle kopieren", "Tabelle")
oSheets.copyByName(oSheets(3).Name, sNewSheetName, iCount)
end sub
Achte mal auf die winzig kleinen Unterschiede zu deinem Code.
Du hast wohl schon einen Kleinbuchstaben wie das o voran gestellt, um zu verdeutlichen das es sich dabei um ein Objekt handelt. Das dumme ist nur, das nicht alles ein Objekt ist. Und deshalb habe ich das jetzt mal etwas angepasst, wobei die Kleinbuchstaben folgenden Sinn ergeben:
i = Integer
s = String

Und jetzt fügen wir noch den Blattschutz hinzu.

Code: Alles auswählen

sub copy_sheet_and_protect
oSheets = ThisComponent.sheets
iCount = oSheets.Count
sNewSheetName = Inputbox ("neuer Name: ","aktuelle Tabelle kopieren", "Tabelle")
oSheets.copyByName(oSheets(3).Name, sNewSheetName, iCount)

    sNewPassword = Inputbox ("Passwort: ","Tabellenschutz", "Tabelle")
    oNewSheet = oSheets(iCount)
    oNewSheet.protect(sNewPassword)
    
    MsgBox "Tabelle '" & sNewSheetName & "' angelegt und geschützt"
end sub
Muss jetzt mal wech.



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
Jörg
*****
Beiträge: 392
Registriert: Mo, 21.10.2013 12:05

Re: Tabellenblatt ans Ende verschien,Kopieren

Beitrag von Jörg »

Hallo Balu,
ja Du hast recht. Es ist "nur" kopieren.
Ich hätte besser schreiben sollen:

Das 4. Blatt kopieren und die Kopie ans Ende der "Mappe" ablegen.

Ehrlich gesagt hab ich mir über die "o-s" und "i-s" keine Gedanken gemacht, zumal sie eigentlich nicht gebraucht werden. Oder?

Als Laien wie mich ist es auch nicht leicht zu erkennen, warum es in der Deklaration (hoffe, dass das die richtige Bezeichnung ist) diese Unterschiede gibt. Zum Vergleich:
Du schreibst

Code: Alles auswählen

oSheets = ThisComponent.sheets
ein Anderer schreibt:

Code: Alles auswählen

odoc=ThisComponent
osheets=odoc.sheets
Geh ich richtig in der Annahme, dass dieser Befehl die Kopie am Ende ablegt?

Code: Alles auswählen

iCount = oSheets.Count
Dann wird diese Zeile sicher nicht benötigt, wenn man das Blatt an einer bestimmtem Stelle positionieren will:
Hoffe, dass das folgende richtig ist:

Code: Alles auswählen

sub copy_sheet 
oSheets = ThisComponent.sheets
sNewSheetName = inputbox ("neuer Name: ","aktuelle Tabelle kopieren", "Tabelle")
oSheets.copyByName(oSheets(3).Name, sNewSheetName,4) 'Index 5
end sub
Bezüglich Deines Hinweises auf die Zuordnung Variable-Object: muß ich beim Übernehmen beachten.
Wünsch Dir noch nen schönen Sonntag.
Und Danke! :)
Gruß Jörg

Win 10 Pro AOO 4.1.15
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Tabellenblatt ans Ende verschien,Kopieren

Beitrag von balu »

Hallo Jörg,
ja Du hast recht. Es ist "nur" kopieren.
Okay, dann ist ja das auch geklärt.

Ehrlich gesagt hab ich mir über die "o-s" und "i-s" keine Gedanken gemacht, zumal sie eigentlich nicht gebraucht werden. Oder?
Theoretisch sind sie nicht zwingend nötig. Aber sie können durchaus sehr hilfreich sein, wenn ein Makro etwas an Umfang gewinnt. Denn dann kann man schon mal in Grübeln geraten, ob eine bestimmte Variable jetzt nun ein 'String' (Text), oder einen Wert 'Integer' (Zahl) enthällt. Bei einer weitern Verarbeitung einer solchen Variablen ist das schon hilfreich zu wissen was da drin ist, weil die weitere Verarbeitung davon abhängt. Denn wenn man erkennen kann:
"A-ha! Da steht ein kleines s davor, das heißt da ist Text drin, und damit kann ich nicht rechnen."
Dann hat man ein Problem weniger.


Als Laien wie mich ist es auch nicht leicht zu erkennen, warum es in der Deklaration (hoffe, dass das die richtige Bezeichnung ist) diese Unterschiede gibt.
Nein, das ist nicht die richtige Bezeichnung.
Deklaration ist das: Dim
Das was Du ansprichst ist eine: Defenition einer Variablen.
Zum Vergleich:
Du schreibst

Code: Alles auswählen

oSheets = ThisComponent.sheets
ein Anderer schreibt:

Code: Alles auswählen

odoc=ThisComponent
osheets=odoc.sheets
Beide Methoden sind korrekt, und beide Methoden können je nach Situation auch angewendet werden.
In so einer kleinen und kurzen Sub muss man nicht unbedingt erst oDoc defenieren und dann diese Variable einmalig einsetzen.
Es gibt aber auch Situationen wo das nicht verkehrt ist um sich Tipp arbeit zu ersparen. Und zwar dann, wenn man in einer Sub mehrere Tabellenblätter defenieren will, mal ein Berispiel.

Code: Alles auswählen

	oDok = ThisComponent
	oTempSheet = oDok.sheets.getByName("TempFileDaten")
	oStammSheet = oDok.sheets.getByName("StammDaten")
	oErstellSheet = oDok.sheets.getByName("BlätterErstellen")
	oPreview = oDok.sheets.getByName("Vorschau_Eingabeformular")
Auch hier könnte man Problemlos oDok immer durch ThisComponent ersetzen. Aber Du kannst dir sicherlich vorstellen, dass das nicht mehr so locker leicht zu lesen ist.

Mit anderen Worten, mal ist es Geschmackssache und mal ist es einfach übersichtlicher für was man sich entscheidet.


Geh ich richtig in der Annahme, dass dieser Befehl die Kopie am Ende ablegt?

Code: Alles auswählen

iCount = oSheets.Count
Dann wird diese Zeile sicher nicht benötigt, wenn man das Blatt an einer bestimmtem Stelle positionieren will:
Nein! Das ist ein Denkfehler!

Code: Alles auswählen

oSheets.Count
Gibt lediglich die Anzahl der existierenden Blätter zurück. Und diese Anzahl (dieser Wert) wird dann der Variablen iCount zugeordnet.
Und es ist schon für einen Laien für den Anfang etwas schwerer zu verstehen, als Du jetzt denkst.
Hoffe, dass das folgende richtig ist:

Code: Alles auswählen

sub copy_sheet 
oSheets = ThisComponent.sheets
sNewSheetName = inputbox ("neuer Name: ","aktuelle Tabelle kopieren", "Tabelle")
oSheets.copyByName(oSheets(3).Name, sNewSheetName,4) 'Index 5
end sub
Nicht hoffen, sondern selber probieren und Erfahrungen sammeln.
Aber nun gut, wills mal etwas erklären.

Es prallen hier jetzt zwei Unterschiedliche Welten aufeinander.
Während bei copyByName eine nullbasierende Zählung zugrunde liegt, heißt also das von 0 an gezählt wird, so zählt aber oSheets.Count von 1 aus.
Beispiel:
Tabelle1, Tabelle2, Tabelle3
Die nullbasierende Zählung sagt jetzt also, es sind 2 Blätter vorhanden.
Die menschlich normale Zählweise, genau so wie oSheets.Count, sagen aber das es 3 Blätter sind.
Und beide haben auf ihre Art und Weise vollkommen recht.

Und wenn jetzt oSheets.Count z.B. 4 zurück gibt, dann ist die 4 für copyByName wohl auch 4, da aber bei 0 angefangen wird zu zählen ergibt das dann für uns die 5.

Wenn Du die Kopier-Sub noch weiter reduzieren willst, dann doch bitte schön so rum.

Code: Alles auswählen

sub copy_sheet 
oSheets = ThisComponent.sheets
sNewSheetName = inputbox ("neuer Name: ","aktuelle Tabelle kopieren", "Tabelle")
oSheets.copyByName(oSheets(3).Name, sNewSheetName, oSheets.Count)
end sub
Arbeite mal mit deiner reduzierten Version, und anschließend mit meiner Änderung. Schau genau hin was passiert, damit Du selber die Auswirkungen beobachten kannst.



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
Antworten