Anzeige
Archiv - Navigation
1584to1588
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

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.
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

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige