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
ein Anderer schreibt:
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?
Dann wird diese Zeile sicher nicht benötigt, wenn man das Blatt an einer bestimmtem Stelle positionieren will:
Nein! Das ist ein Denkfehler!
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