VBA Makro Funktion umgebungsabhängig?

Hallo Experten,

Excel (XP) macht mich gerade wahnsinnig.

Ich habe ein kleines Makro aufgezeichnet, das in einer datei ein Tabellenblatt anspringt, in eine Zelle einen Wert schreibt und dieses Blatt dann druckt. So fängt es an:

Sheets("Tagesbericht").Select
Range("J1:K1").Select

Bei J1 und K1 handelt es sich um verbundene Zellen.

Das funktioniert auch, wenn ich das Makro über Menü - Makros - ausführen ablaufen lasse.

ABER: ich habe in die anderen Tabellenblätter Befehls-Schaltflächen gepackt, die ich mit eben diesem Makro verknüpft habe (den Code einfach in die Codeseite der Schaltflächen kopiert). Wenn ich es darüber ausführen will, klappt es nicht. Ich kriege einen Laufzeitfehler 1004 und die Meldung, daß der zweite Befehl nicht ausgeführt werden kann.

Hat irgendwer eine Idee, woran das liegen könnte?

Für schlaue Antworten bedankt sich schon mal

Kubi

Hallo Kubi,

vermutlich liegt es an einer Einstellung in den Eigenschaften des Buttons auf dem Tabellenblatt. Die Eigenschaft

TakeFocusOnClick

musst du auf „False“ stellen.

Grüße aus Kamp-Lintfort
Erich Gier

versuchs doch einfach mit einem kleinen „Trick“…

lass Dein Makro wie es ist…
und für den Button machst Du ein einfaches
Application.Run „meinmakrodasinsanderesheetwechselt“

HTH
Munich

Hallo Erich,

vermutlich liegt es an einer Einstellung in den Eigenschaften
des Buttons auf dem Tabellenblatt. Die Eigenschaft

TakeFocusOnClick

musst du auf „False“ stellen.

Danke für den Tip, aber das war’s nicht. Der Fehler bleibt…

Gruß Kubi

Hallo Munich,

lass Dein Makro wie es ist…
und für den Button machst Du ein einfaches
Application.Run „meinmakrodasinsanderesheetwechselt“

Das klappt! Herzlichen Dank. Obwohl ich es immer noch unbefriedigend finde, nicht zu wissen, warum sich das so seltsam verhält…aber ich kann weiterarbeiten.

Sternchen gibt

Kubi

Hallo Kubi,
auch wenns schon läuft, noch eine Antwort zu

… Obwohl ich es immer noch unbefriedigend finde,
nicht zu wissen, warum sich das so seltsam verhält …

VBA verhält sich da doch eigentlich verständlich:
Die Prozedur „CommandButton1_Click()“ befindet sich im Code-Modul des Tabellenblatts, auf dem der Button liegt, etwa „Tabelle1“ . Wenn im Code „Cells(.,.)“ auftaucht, geht VBA dann davon aus, dass eine Zelle in dieser Tabelle gemeint ist. Nach der Zeile

Sheets("Tagesbericht").Select

ist „Tabelle1“ aber nicht mehr das aktive Blatt - das Selektieren klappt nicht.

Man muss VBA nur sagen, auf welchem Blatt die Zellen liegen, dann funktioniert es:

Private Sub CommandButton1\_Click()
 Sheets("Tagesbericht").Select
 Sheets("Tagesbericht").Range("J1:K1").Select
End Sub

Besser ist hier noch die Verwendung von „with“:

Private Sub CommandButton2\_Click()
 With Sheets("Tagesbericht")
 .Select
 .Range("J1:K1").Select
 End With
End Sub

Die Lösung, das Coding in eine weitere Prozedur auszulagern und diese in „CommandButtinX.Click()“ aufzurufen, funktioniert sicher auch, schadet aber der Klarheit und Übersichtlichkeit. Praktisch ist das aber dann, wenn mehrere Buttons oder andere Steuerelemente zum Teil identischen Code ausführen. Diesen Teil würde man dann in eine andere Prozedur auslagern.

Oft ist die Selektion eines Blatts oder eines Bereichs gar nicht erforderlich - auch wenn die Makroaufzeichnung davon intensiv Gebrauch macht. Will man etwa nur einen Wert zuweisen, kann man das direkt tun, ohne Blatt bzw. Zelle zu selektieren, etwa mit

Private Sub CommandButton3\_Click()
 Sheets("Tagesbericht").Range("J1") = "xyz"
End Sub

Viele Grüße aus Kamp-Lintfort
Erich Gier

1 „Gefällt mir“

Mir doch wurscht
ob da vba verständlich ist *lächel*
Hallo Erich,
mit activate kann man das auch erreichen und das ist das was ich nie kapiere. Warum muss ich erst Blatt xyz aktivieren um darauf was zu selektieren.
Ansonsten hast logo du vollkommen recht, select braucht man nicht und es ist sowieso unübersichtlich.
Ich habe deine email erhalten, habe aber derzeit keinen Kopp/Zeit/Lust für Excel. Ich melde mich wenn ich mal wieder excelvbamäßig was mache, dann schaue ich auch den Code an.
Gruß
Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]