AW: Activate/Select
14.10.2006 00:52:53
IngGi
Hallo Peter,
ändere deinen Code mal folgendermaßen und laß' das Ganze laufen.
Private Sub CommandButton2_Click()
Worksheets("Tabelle1").Activate
Range("A1").Select
Worksheets("Tabelle2").Activate
Range("A5") = "Hallo Peter"
End Sub
Du wirst zwei Dinge bemerken. Erstens läuft der Code nun ohne Fehler durch. Aber zweitens wird der Text "Hallo Peter" nicht wie von dir erwartet in die Zelle A5 von Tabelle2 geschrieben, sondern in Zelle A5 von Tabelle1.
Der Grund dafür ist folgender. Du musst ein Tabellenblatt nicht vorher aktivieren, um bestimmte Dinge damit anzustellen, z.B. etwas in eine Zelle zu schreiben. Das geht auch mit einem Tabellenblatt, das im Hintergrund, also nicht aktiv ist. Und weil das so ist, musst du VBA möglichst genau mitteilen, was du wo haben willst. Um eine bestimmte Zelle anzusprechen und z.B. den Wert 5 dort hineinzuschreiben, müsstest du eigentlich folgenden ausführlichen Programmcode verwenden:
Application.Workbooks("Mappe1.xls").Worksheets("Tabelle1").Range("A5") = 5
Dabei ist "Application" die laufende Excelanwendung, "Workbooks("Mappe1.xls") ist ein Objekt, genauer eine Arbeitsmappe, die in dieser Excelanwendung geöffnet ist, "Worksheets("Tabelle1") ist ein Tabellenblatt innerhalb dieser Arbeitsmappe und "Range("A5")" schließlich ist eine Zelle innerhalb dieses Tabellenblattes.
Du musst dich also theoretisch immer von "Application" ausgehend Unterobjekt für Unterobjekt nach unten durchhangeln, bis zu dem gewünschten Objekt, in deinem Falle die Zelle A5. In der Praxis läßt sich das Ganze meist abkürzen, indem man z.B. schreibt
Range("A5") = 5
Allerdings muss man dann schon genau wissen, was man da macht und mir selbst passieren dabei oft die haarsträubendsten Fehler. Und damit kommen wir zurück auf den obigen Programmcode. Würde dieser in einem allgemeinen Modul stehen, dann würde er so funktionieren, wie du das erwartest. In einem allgemeinen Modul beziehen sich Angaben zu Zellen, bei denen nicht angegeben ist, zu welchem Tabellenblatt in welcher Arbeitsmappe sie gehören, immer auf das aktive Tabellenblatt. Im Modul eines Tabellenblattes dagegen beziehen sich solche Zellangaben nicht auf das aktive Tabellenblatt, sondern eben auf das Tabellenblatt, in dessem Modul der Programmcode steht. Darum verweist du mit der Angabe
Worksheets("Tabelle2").Activate
auch nicht auf die Tabelle2, sondern du aktivierst das Tabellenblatt nur. VBA weiß damit aber noch nicht, auf welches Tabellenblatt sich nachfolgende Zellangaben beziehen. Sie können sich genausogut auf ein Tabellenblatt im Hintergrund beziehen, wie auf das aktive Tabellenblatt. Das kommt dann eben in deinem Fall darauf an, in welchem Modul der Programmcode steht.
Übrigens stimmt das nicht ganz, was ich oben gesagt habe, nämlich dass der obige Programmcode in einem allgemeinen Modul so laufen würde, wie du das erwartest. Er würde vielmehr gar nicht laufen. Das hat aber andere Gründe. Dafür müsstest du das Ganze etwas modifizieren und in das Modul deines Tabellenblattes folgenden Code schreiben:
Private Sub CommandButton2_Click()
MeinMakro
End Sub
Und in ein allgemeines Modul:
Private Sub MeinMakro()
Worksheets("Tabelle1").Activate
Range("A1").Select
Worksheets("Tabelle2").Activate
Range("A5") = "Hallo Peter"
End Sub
Gruss Ingolf