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"
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.
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