Seite 1 von 1

Macro Zellen verschieben funktioniert - was mache ich?

Verfasst: Fr, 13.04.2012 12:09
von theindless
Hallo miteinander,

ich möchte noch etwas dazulernen und darum habe ich eine Frage.

Ich habe ein Macro geschrieben (mit Hilfe Dannenhöfer), welches eigentlich nur eine Zeile auf ein anderes Tabellenblatt verschiebt.
Ziel ist es, eine erledigte Aufgabe in eine Historie zu schieben.

Folgendes Macro:

Code: Alles auswählen

Sub NA_Archivieren

Dim Dokument As Object, Auswahl As String

Dokument = ThisComponent
Ursprung = Dokument.Sheets.getByName("NA")
Ziel = Dokument.Sheets.getByName("Historie NA")

Zelle = Dokument.getCurrentSelection().getCellAddress()
Zeile = Zelle.Row

Ursprungsbereich = Ursprung.getCellRangeByPosition(0, Zeile, 255, Zeile)
UrsprungsbereichAdresse = Ursprungsbereich.getRangeAddress

ZielZeilen = Ziel.getRows
ZielZeilen.insertByIndex(3,1)

Zielbereich = Ziel.getCellByPosition(0,3)
ZielbereichAdresse = Zielbereich.getCellAddress

Ziel.copyRange(ZielbereichAdresse,Ursprungsbereichadresse)

UrsprungsZeilen = Ursprung.getrows
UrsprungsZeilen.removeByIndex(Zeile,1)

End Sub
Den Anfang verstehe ich:
Ich lege fest, dass das aktive Dokument gemeint ist (ThisComponent) und definiere das Ursprungs-Blatt und das Ziel-Blatt (jeweils über getByIndex).
Die folgenden Zeilen dienen dazu, die Zeilennummer aus der aktuell gewählten Zelle auszulesen (getCurrentSelection().getCellAddress()).
Dann wird der zu kopierende Bereich im Ursprungs-Blatt festgelegt (Ursprung.getCellRangeByPosition(0, Zeile, 255, Zeile))

Aber was erreiche ich mit dem Teil-Code: UrsprungsbereichAdresse = Ursprungsbereich.getRangeAddress ?
Was bewirkt diese Code-Zeile?

Gleiches gilt für die folgenden Zeilen um den Zielbereich festzulegen. Die erste Zeile verstehe ich, aber was bewirkt ZielbereichAdresse = Zielbereich.getCellAddress?

Und was bedeutet der Teil UrsprungsZeilen = Ursprung.getrows?

Ich verstehe also immer die Festlegungen der Bereiche, aber was bedeuten die folgenden Befehle?
Benötige ich diese, um explizit Zugriff auf die zuvor festgelegten Bereiche zu erhalten?

Ich hoffe es kann mir jemand helfen und Licht ins Dunkel bringen...

Re: Macro Zellen verschieben funktioniert - was mache ich?

Verfasst: Mo, 16.04.2012 09:34
von theindless
Hallo,

hat keiner Zeit/Nerven mir das zu erklären?

Re: Macro Zellen verschieben funktioniert - was mache ich?

Verfasst: Mo, 16.04.2012 09:53
von Stephan
Ich lege fest, dass das aktive Dokument gemeint ist (ThisComponent)
Jein, das ist nicht ganz richtig, das aktive Dokument ist StarDesktop.CurrentComponent, ThisComponent ist nur das aktive Dokument aus Sicht der Basic-IDE

http://www.starbasicfaq.de/Worinbesteht ... hisCo.html
Was bewirkt diese Code-Zeile?
sie weist der Objekt-Variable namens "UrsprungsbereichAdresse" das 'Bereichsadressobjekt' des Bereichsobjektes (bzw. der Objektvariable namens) "Ursprungsbereich" zu.
Verkürzt gesagt ist hierbei das 'Bereichsobjekt' der entsprechende Zellbereich mit all seinen Eigenschaften/Methoden und das 'Bereichsadressobjekt' nur der Teil der adress-relevanten Eigenschaften (Tabelle, Startzeile, Endzeile, Startspalte, Endspalte)
Die erste Zeile verstehe ich, aber was bewirkt ZielbereichAdresse = Zielbereich.getCellAddress?
dito, nur geht es hier um einen Zellbereich der nur eine Zelle umfasst und der deshalb bezüglich der ZElladresse (nicht Zellbereichsadresse) angesprochen wird
Und was bedeutet der Teil UrsprungsZeilen = Ursprung.getrows?
der Objekt-Variable "Ursprungszellen" werden alle Zeilen des Tabellenblattes "NA" als 'Zeilenobjekt' zugewiesen



Gruß
Stephan

Re: Macro Zellen verschieben funktioniert - was mache ich?

Verfasst: Mo, 16.04.2012 10:27
von theindless
Hallo Stephan,

danke für die Antwort.

Ist enorm schwierig für mich zu verstehen... bin wohl noch nicht tief genug im System an sich drin.

Den Code zu schreiben war mit Dannenhöfer nicht sooo schwierig, aber ich versuche im Moment zu verstehen:

- was die einzelnen Code-Teile bedeuten und bewirken
- ob ich die einzelnen Code-Teile brauche bzw. alle brauche
- ob es einfachere Möglichkeiten gibt, mein Ziel zu erreichen.

In meinem Fall wäre z.B. interessant, ob diese "Bereichsadressobjekt"-Zuweisung und die "Zell-Adress"-Zuweisung zwingend erforderlich sind, und was das technisch bedeutet. Muss ich z.B. die Zuweisung immer machen, wenn ich dann auf den Zellbereich oder die Zelle zugreifen will?

Ich habe mal versucht, diese Zuweisungen zu reduzieren und scheinbar funktioniert es, wie z.B.

Code: Alles auswählen

Zelle = Dokument.getCurrentSelection().getCellAddress()
Zeile = Zelle.Row

Ursprungsbereich = Ursprung.getCellRangeByPosition(0, Zeile, 255, Zeile)
UrsprungsbereichAdresse = Ursprungsbereich.getRangeAddress
durch

Code: Alles auswählen

Ursprungsbereich = Ursprung.getCellRangeByPosition(0, Dokument.getCurrentSelection().getCellAddress().Row, 255, Dokument.getCurrentSelection().getCellAddress().Row)
Verstehe ich das richtig, dass die Zuweisungen an sich nicht zwingend erforderlich sind, sondern mehr der Übersichtlichkeit dienen?

Re: Macro Zellen verschieben funktioniert - was mache ich?

Verfasst: Mo, 16.04.2012 14:08
von Stephan
Verstehe ich das richtig, dass die Zuweisungen an sich nicht zwingend erforderlich sind, sondern mehr der Übersichtlichkeit dienen?
Ja, das verstehst Du ganz richtig. Einzig geht es nicht nur um Übersichtlichkeit sondern auch um Kürze des Codes, was aber fast Dasselbe ist.

Übersichtlich und kürzer wäre z.B. (Beispiel A):

Code: Alles auswählen

With Dokument.getCurrentSelection().getCellAddress()
  Ursprungsbereich = Ursprung.getCellRangeByPosition(0, .Row, 255, .Row)
End With
oder auch (Beispiel B):

Code: Alles auswählen

zeile = Dokument.getCurrentSelection().getCellAddress().Row
Ursprungsbereich = Ursprung.getCellRangeByPosition(0, zeile, 255, zeile)

Diese 2 Beispiele sowie Dein Beispiel und der ursprüngliche Code sind dabei funktionell identisch. Das man trotzdem manchmal verschiedene Schreibweisen verwendet hat, neben persönlicher Bevorzugung einer Schreibweise, damit zu tun das manche Ausdrücke in manchen Situationen zweckmäßiger sind.

Beispielsweise ist die Schreibweise:

Code: Alles auswählen

zeile = Dokument.getCurrentSelection().getCellAddress().Row
Ursprungsbereich = Ursprung.getCellRangeByPosition(0, zeile, 255, zeile)
prima, solange Du nicht auch die Spalte brauchst, denn brauchst Du diese, müßte man z.B. schreiben:

Code: Alles auswählen

zeile = Dokument.getCurrentSelection().getCellAddress().Row
spalte = Dokument.getCurrentSelection().getCellAddress().Column
Ursprungsbereich = Ursprung.getCellRangeByPosition(0, zeile, spalte, zeile)
was jedoch relativ lang ist, weswegen man u.U. bevorzugen würde zu schreiben:

Code: Alles auswählen

With Dokument.getCurrentSelection().getCellAddress()
  Ursprungsbereich = Ursprung.getCellRangeByPosition(0, .Row, .Column, .Row) 
End With
wohlgemerkt "u.U" und nicht generell, da es ja auch sein kann das man die Werte für Zeile und Spalte in verschiedenen Makros braucht, dann würde man (wieder nur u.U.) z.B. bevorzugen zu schreiben:

Code: Alles auswählen

Global zeile
Global spalte


Sub test()
  '... weiterer Code
  With Dokument.getCurrentSelection().getCellAddress()
    zeile = .Row
    spalte = .Column
  End With
  Ursprungsbereich = Ursprung.getCellRangeByPosition(0, zeile, spalte, zeile)
  '... weiterer Code
End Sub

Sub NochEinMakro()
  '...
  'hier werden die Werte für zeile und spalte auch gebraucht
  '...
End Sub
Naja, und so kann man noch vielfältig andere Schreibweisen verwenden, je nach Situation und Vorlieben.


Gruß
Stephan

Re: Macro Zellen verschieben funktioniert - was mache ich?

Verfasst: Mo, 16.04.2012 15:03
von theindless
Hallo Stephan,

danke für die ausführlichen Erläuterungen.

Das mit With... habe ich zwar schon mal gelesen, aber erst deine Ausführungen haben mir irgendwie nahe gebracht, wie das zu benutzen ist.

Ich habe auch verstanden, dass wohl jeder seinen eigenen Stil entwickelt, was mir insbesondere für die Bezeichnung von Variablen (Object-Variablen) schon aufgefallen ist.

Es hat wohl Vorteile, wenn man schlüssige Object-Variablen definiert, welche bei größeren Macros wiederholt bei Zugriffen benötigt werden, wie z.B.

oDoc = ThisComponent
oSheet = oDoc.Sheets....

usw.

Ich hoffe ich entwickle hier auch meinen "Stil" :-)

Nochmals Danke!