VBA Excel 2007 - SendKey funktioniert nicht mit TK

Hallo Experten,

kann mir jemand sagen, warum ein VBA-Makro (in Excel 2007) einwandfrei läuft, wenn es über die Makro-Liste oder über eine eigens plazierte Schaltfläche in der Schnellstartleiste ausgeführt wird; Nicht aber, wenn ich’s über eine Tastenkombination aufrufe!?

Etwas genauer: Das Makro wird zwar auch ausgeführt wenn ich es über die Tastenkombi aufrufe, aber die abschließende SendKeys-Anweisung (SendKeys „{TAB}“) wird nicht übergeben…

Für sachdienliche Hinweise dankend!

Jagamoasta

Hallo Jaga,

kann mir jemand sagen, warum ein VBA-Makro (in Excel 2007)
einwandfrei läuft,

wo ist der Code?

wenn es über die Makro-Liste oder über eine
eigens plazierte Schaltfläche in der Schnellstartleiste
ausgeführt wird; Nicht aber, wenn ich’s über eine
Tastenkombination aufrufe!?

Etwas genauer: Das Makro wird zwar auch ausgeführt wenn ich es
über die Tastenkombi aufrufe, aber die abschließende
SendKeys-Anweisung (SendKeys „{TAB}“) wird nicht übergeben…

SendKeys ist immer heikel. Gelegentlich hilft es die Reihenfolge im Codeablauf zu ändern, aslo nicht als letzten Befehl hinzuschreiben.

Btw.: Multiposting wird nicht gern gesehen.

Gruß
Reinhard

Für sachdienliche Hinweise dankend!

Jagamoasta

Hallo Richard,

hab’ mir nur gedacht, dass diese VBA-Geschichte eigentlich nichts im Bereich „Tabellenkalkulation“ zu suchen hat und besser im Bereich „VBA“ aufgehoben wäre… (zumal das Problem in Excel mit dem Makro gelöst wäre)

Hier der gewünschte Code:

Sub NeueZeile()
Dim Bereich As String
Bereich = Application.ActiveSheet.ListObjects(1).DataBodyRange.Address

Range(Right(Bereich, Len(Bereich) - Application.Search(":", Bereich))).Select
SendKeys „{TAB}“
End Sub

Gruß

Erwin

Hallo Jagamoasta.

Ich habe festgestellt, dass die sendkeys - Befehle durchaus in Abhängigkeit vom Betriebssystem und der verwendeten EXCEL-Version unterschiedlich sein müssen, um ein stabiles Funktionieren zu erreichen. Als Beispiel:

ich muss nutzen (XP):
Application.SendKeys … True: DoEvents

bei nicht XP reicht unter Umständen auch
SendKeys … True:

Was ich sagen will: Neben den reinen Befehlen kann es auch sein, dass du etwas zusätzliches hineinschreiben musst, weil das Betriebssystem den Code sonst nicht (immer) mag. Ich habe 2 Tage geflucht, bis ich im Internet einen entsprechenden Nebensatz gefunden habe.

Sonst kann ich dir leider nicht helfen.

Grüße, Aiko.

P.S.: @Rainer – sendkeys ist sicher nicht stabil, aber ich nutze es, um automatisch passwortgesicherte Dateien aus dem Internet zu laden. Nach mehreren Stunden herumfragens, habe ich keine bessere Lösung als die sendkyes-Methode gefunden und da Sie bei mir stabil läuft … who cares. Und ich habe inzwischen wieder ein paar Makros mehr ohne select geschrieben.

Hallo Aiko,

Du bist genial!!

Der Tipp mit dem vorangestellten „Application“ war der Durchbruch…

Zwar wäre diese Geschichte ohnehin im Sinne der sauberen Programmierung; nur wäre ich wahrscheinlich nie darauf gekommen, da es (auch unter XP) bereits mehrfach ohne den Zusatz funktioniert hat.

Auf alle Fälle besten Dank für die Hilfe

Gruß

Jagamoasta

Hallo Jagamoasta.

Schön, dass es funktioniert. Das mit der sauberen Programmierng ist so eine Sache. Ich rufe andere Subs ohne Call auf, damit ich Parameter übergeben kann. Funktioniert wahrscheinlich auch anders - wo ich es grad schreibe, habe ich auch schon einie Idee - aber wir machen es halt eben so wie wir es kennen, weil es funktioniert. Da fragt dann niemand, ob das sauber ist. Stimme dir aber grundsätzlich zu: Sauberes Programmieren sollte das Ziel sein.

Viel Spaß mit deinem Makro, Aiko.

Grüezi Erwin

Sub NeueZeile()
Dim Bereich As String
Bereich =
Application.ActiveSheet.ListObjects(1).DataBodyRange.Address

Range(Right(Bereich, Len(Bereich) - Application.Search(":",
Bereich))).Select
SendKeys „{TAB}“
End Sub

Könntest Du die nicht auch einfach mit .Offset() erreichen, sodass Du auf SendKeys verzichten kannst:

Range(Right(Bereich, Len(Bereich) - Application.Search(":",Bereich))).Offset(0,1).Select


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Hallo Thomas,

Die Offset-Geschichte bewirkt lediglich, dass die Zelle rechts neben der letzten Datenbereichszelle markiert wird. Wenn ich dort dann einen Wert eingeben würde, würde eine neue Spalte zur bestehenden Tabelle hinzugefügt.

Deinen Hinweis - es doch noch einmal ohne der TAB-Taste zu versuchen hat mich aber noch einmal motiviert, nach einer alternativen Lösung zu suchen, die - nach meiner bescheidenen Meinung - besser ist als die erste:

Sub NeuenDatensatz()
Dim Bereich As String
For i = 1 To Application.ActiveSheet.ListObjects.Count
If Application.ActiveSheet.ListObjects(i).Active = True Then
Application.ActiveSheet.ListObjects(i).ListRows.Add
Bereich = Application.ActiveSheet.ListObjects(i).DataBodyRange.Address
Range(Bereich).Cells(Range(Bereich).Rows.Count, 1).Select
Else
’ Keine Aktion wenn das Tabellenobjekt nicht aktiv ist…
End If
Next
End Sub

Besten Dank noch einmal an alle!

Jagamoasta