Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.10.2025 10:28:49
16.10.2025 17:40:39
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

GetAsyncKeyState - Tastaturanschlag beeinflussbar?

Forumthread: GetAsyncKeyState - Tastaturanschlag beeinflussbar?

GetAsyncKeyState - Tastaturanschlag beeinflussbar?
25.10.2017 17:26:28
Jens
An die Excelprofis!
In einer großen Tabelle soll in bestimmten Zellbereichen beim Drücken der ENTF-Taste eine Null hineingeschrieben werden (formatiert als Zeitwert mit 00:00, wobei ansonsten dort nur bestimmte Zeitwerte eintragbar sind die größer 0 sind ("Datenüberprüfung"); also das Eintragen einer 0 ist nicht möglich z.B. mit STRG-ENTER).
Dies funktioniert auch mit folgendem Code im Arbeitsblatt:
Option Explicit
'Diese Funktion ermittelt, ob seit ihrem letzten Aufruf eine bestimmte Tasteneingabe erfolgt ist.
'https://vbarchiv.net/api/details.php?id=getasynckeystate
Private Declare Function GetAsyncKeyState Lib "user32.dll" ( _
ByVal vKey As Long) As Integer
Private Const VK_DELETE As Long = &H2E ' Entfernen
-------------------------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
' Beim Drücken der ENTF-Taste im Eingabebereich soll wieder ein "00:00" erscheinen.
' Dies darf lediglich in den Zeiteingabe-Bereichen stattfinden, die zusammengefasst werden:
Dim rngZEIT1 As Range, rngZEIT2 As Range, rngZEIT3 As Range, rngZEIT4 As Range, rngZeit5 As Range, _
rngZEIT6 As Range, rngZEIT7 As Range, rngZEIT8 As Range, rngZEIT9 As Range, rngZeit10 As Range, _
rngZEIT11 As Range, rngZEIT12 As Range, rngZEIT13 As Range
Dim rngUnion As Range
Set rngZEIT1 = Range("H8:I38", "L8:M38")
Set rngZEIT2 = Range("P8:Q38", "T8:U38")
Set rngZEIT3 = Range("X8:Y38", "AB8:AC38")
Set rngZEIT4 = Range("AF8:AG38", "AJ8:AK38")
Set rngZeit5 = Range("AN8:AO38", "AR8:AS38")
Set rngZEIT6 = Range("AV8:AW38", "AZ8:BA38")
Set rngZEIT7 = Range("BD8:BE38", "BH8:BI38")
Set rngZEIT8 = Range("BL8:BM38", "BP8:BQ38")
Set rngZEIT9 = Range("BT8:BU8", "BX8:BYG38")
Set rngZeit10 = Range("CB8:CC38", "CF8:CG38")
Set rngZEIT11 = Range("CJ8:CK38", "CN8:CO38")
Set rngZEIT12 = Range("CQ8:CR38", "CT8:CU38")
Set rngZEIT13 = Range("QC8:QC38", "QT8:QU38")
Set rngUnion = Union(rngZEIT1, rngZEIT2, rngZEIT3, rngZEIT4, rngZeit5, rngZEIT6, rngZEIT7, _
rngZEIT8, rngZEIT9, rngZeit10, rngZEIT11, rngZEIT12, rngZEIT13)
If Not Intersect(Target, rngUnion) Is Nothing Then
If (GetAsyncKeyState(VK_DELETE) And &H8000) = &H8000 Then _
Target.Value = "0"
...
F R A G E :
Es nervt oft, dass man die ENTF-Taste genau 0,0xxxx Sekunden drücken muss, weil ansonsten nichts passiert, oder, wenn man zu lange drückt, die "00:00" erscheint und wieder verschwindet.
Kann man das Drücken der Tastatur durch weiteren Code bzw. Code-Verbesserung beeinflussen, so dass die Dauer des Drückens (fast) egal ist oder ist Excel mit seinem VBA hier an seinen Grenzen?
Vielen Dank schon mal!
Gruß, Jens
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: GetAsyncKeyState - Tastaturanschlag beeinflussbar?
25.10.2017 17:38:35
Nepumuk
Hallo Jens,
versuch es mal so:
If Not Intersect(Target, rngUnion) Is Nothing Then
    If (GetAsyncKeyState(VK_DELETE) And &H8000) = &H8000 Then
        Application.EnableEvents = False
        Target.Value = 0
        Application.EnableEvents = True
    End If
End If

Gruß
Nepumuk
Anzeige
AW: GetAsyncKeyState - Tastaturanschlag beeinflussbar?
25.10.2017 17:41:19
Daniel
Hi
wäre es nicht einfacher, alle Leerzellen in der Schnittmenge von Target und dem gewünschten Bereich mit 0 zu überschreiben?
dann brauchst du das GetAsyncKeyState-Gedöns nicht.
also im Prinzip:
If Not Intersect(Target, rngUnion) Is Nothing Then
On Error resume Next
Application.EnableEvents = false
Intersect(Target, rngUnion).SpecialCells(xlcelltypeblanks).value = 0
Application.EnableEvents = true
On Error Goto 0
End IF
das On Error Resume Next ist erforderlich, weil das Specialcells mit einem Fehler abbricht, wenn es keine Zellen finden kann (und das ist ja der Fall, wenn du Zellen mit Inhalt füllst)
das Application.EnableEvents = False verhindert den Selbstaufruf des ChangeEvents Wenn du die Leerzellen überschreibst
Gruß Daniel
Anzeige
AW: GetAsyncKeyState - Tastaturanschlag beeinflussbar?
25.10.2017 18:30:46
Jens
Vielen Dank für Eure Vorschläge!
@ Nepomuk:
Hatte ich schon mal probiert mit EnableEvents, bringt aber nichts.
@Daniel:
Klappt beim ersten Mal. Wenn ich dann Werte über ein Pulldownmenü einsetze, überschreibt das Makro mir alle leeren Zellen der geschützten Tabelle außerhalb des Bereichs. = ?
Da stehe ich nun aufm Schlauch.
Anzeige
AW: GetAsyncKeyState - Tastaturanschlag beeinflussbar?
25.10.2017 18:43:33
Daniel
Hi
kann sein, dass wenn das Intersect aus Target und Bereich nur eine Zelle ergibt dann das SpecialCells auf alle Zellen angewendet wird und nicht nur auf den gewünschten bereich.
da muss dann wahrscheinlich zusätzlich die Abfrage rein
Application.EnableEvents = false
If Intersect(Target, rngUnion).Cells.Count = 1 then
if Target.Value = "" then Target.Value = 0
Else
On Error resume Next
Intersect(Target, rngUnion).SpecialCells(xlcelltypeblanks).value = 0
On Error Goto 0
end if
Application.EnableEvents = true
Gruß Daniel
Anzeige
AW: GetAsyncKeyState - Tastaturanschlag beeinflussbar?
25.10.2017 19:01:31
Jens
Hallo Daniel,
es funktioniert doch nicht. Die Zellen sind leer, ich drücke auf ENTF und nichts passiert. Auch ohne Blattschutz... Der Code ist so klar, aber woran liegt es?
AW: GetAsyncKeyState - Tastaturanschlag beeinflussbar?
25.10.2017 19:22:27
Jens
Funktioniert natürlich doch... OMG... Tabelle geschlossen und wieder geöffnet und siehe da: es funktioniert doch.
Sorry, Daniel. Vielleicht liegt's mom. am Rechner: Nach einem Windowsupdate piepst er weiterhin, gibt Töne von sich, wenn Internetvideos abgespielt werden und der Dateimanager "Totalcommander" kann sogar mp3s spielen. Aber KEIN EINZIGES Musikabspielprogramm! Treiber neu, BIOS... ach ja... warten auf das nächste Update...
So. Dir einen schönen Abend und noch mal vielen Dank!!!
Anzeige
;
Anzeige

Infobox / Tutorial

Tastaturanschläge in Excel VBA beeinflussen mit GetAsyncKeyState


Schritt-für-Schritt-Anleitung

  1. Füge den folgenden Code in das entsprechende Arbeitsblatt ein. Dieser Code nutzt die GetAsyncKeyState-Funktion, um beim Drücken der ENTF-Taste eine Null in bestimmte Zellbereiche zu schreiben:

    Option Explicit
    Private Declare Function GetAsyncKeyState Lib "user32.dll" ( _
       ByVal vKey As Long) As Integer
    Private Const VK_DELETE As Long = &H2E ' Entfernen
    
    Private Sub Worksheet_Change(ByVal Target As Range)
       Dim rngUnion As Range
       Set rngUnion = Union(Range("H8:I38"), Range("L8:M38"), Range("P8:Q38"), _
           Range("T8:U38"), Range("X8:Y38"), Range("AB8:AC38"))
    
       If Not Intersect(Target, rngUnion) Is Nothing Then
           If (GetAsyncKeyState(VK_DELETE) And &H8000) = &H8000 Then _
               Target.Value = "0"
       End If
    End Sub
  2. Aktiviere die Makros in deiner Excel-Datei, um sicherzustellen, dass der Code funktioniert.

  3. Testen: Drücke die ENTF-Taste in einem der definierten Zellbereiche. Es sollte eine Null erscheinen.


Häufige Fehler und Lösungen

  • Problem: ENTF-Taste funktioniert nicht richtig.

    • Lösung: Stelle sicher, dass der Code im richtigen Arbeitsblatt eingefügt wurde und dass die Makros aktiviert sind.
  • Problem: Der Wert wird nicht in die Zelle geschrieben.

    • Lösung: Überprüfe, ob die Zelle nicht geschützt ist und dass sich der Cursor tatsächlich in einem der definierten Bereiche befindet.
  • Problem: Der Code führt zu unerwartetem Verhalten.

    • Lösung: Setze die Application.EnableEvents-Eigenschaft auf False, bevor du Werte in die Zelle schreibst, und zurück auf True, nachdem du die Änderungen abgeschlossen hast.

Alternative Methoden

Wenn du die GetAsyncKeyState-Funktion nicht verwenden möchtest, gibt es alternative Ansätze:

  1. Direktes Überschreiben von Leerzellen: Du kannst alle Leerzellen in einem bestimmten Bereich überschreiben, ohne die GetAsyncKeyState-Funktion zu verwenden. Hier ist ein Beispiel:

    If Not Intersect(Target, rngUnion) Is Nothing Then
       On Error Resume Next
       Application.EnableEvents = False
       Intersect(Target, rngUnion).SpecialCells(xlCellTypeBlanks).Value = 0
       Application.EnableEvents = True
       On Error GoTo 0
    End If
  2. Zusätzliche Abfragen einfügen: Du kannst den Code so anpassen, dass er nur eingeht, wenn eine Zelle tatsächlich leer ist.


Praktische Beispiele

Hier sind einige praktische Anwendungsbeispiele für die Verwendung von GetAsyncKeyState in Excel VBA:

  • Beispiel 1: Füge in eine Tabelle automatisch "00:00" ein, wenn die ENTF-Taste gedrückt wird.
  • Beispiel 2: Verwende die Funktion zur Erstellung eines Musikabspielprogramms, das auf Tasteneingaben reagiert.

Tipps für Profis

  • Vermeide unnötige Verschachtelung: Halte deinen Code so einfach wie möglich, um die Lesbarkeit zu erhöhen.
  • Dokumentation: Kommentiere deinen Code gründlich, damit du später leicht nachvollziehen kannst, was jeder Teil des Codes macht.
  • Testen: Führe häufig Tests durch, um sicherzustellen, dass alle Event-Handler wie gewünscht funktionieren.

FAQ: Häufige Fragen

1. Was ist GetAsyncKeyState?
GetAsyncKeyState ist eine Windows-API-Funktion, die den Status einer bestimmten Taste auf der Tastatur abruft.

2. Wie kann ich sicherstellen, dass mein Code robust ist?
Verwende On Error Resume Next und On Error GoTo 0, um Fehler zu behandeln und unerwartete Abstürze zu vermeiden.

3. Kann ich diese Methode in älteren Excel-Versionen verwenden?
Ja, der Code sollte in den meisten Excel-Versionen funktionieren, die VBA unterstützen. Achte darauf, dass die API-Deklaration korrekt ist.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige