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.Kannst du mir an dem Makro vielleicht noch erklären was welche Zeile für einen Sinn hat?!
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
Code: Alles auswählen
for i = 3 to 9
Code: Alles auswählen
if oBlattHersteller.getCellByPosition(i, iEndeQuelle ).string = "X" then
Und dir dürfte ja die "If ... then" so weit klar sein.
Code: Alles auswählen
sSucheBlattName = odoc.Sheets.ElementNames(i-3)
Der gefundene Blattname aus dem Blatt-Array wird dann der Variablen *sSucheBlattName* zugewiesen.
Code: Alles auswählen
oSucheBlatt = odoc.Sheets.GetByName( sSucheBlattName )
Code: Alles auswählen
With oSucheBlatt
x = .Columns(1).queryEmptyCells() 'Spalte B
iEndeZiel = x(x.Count-1).RangeAddress.StartRow+1
End With
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
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
Und andersrum
Code: Alles auswählen
oSucheBlatt.getCellByPosition( 1, iEndeZiel-1 ).string = oBlattHersteller.getCellByPosition( 0, iEndeQuelle ).string
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.
Wenn "Von Position 11 bis 22" die Basic Zählung ist, dann interessieren dich die Blätter 0 bis 10 jetzt überhaupt nicht.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
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