Registriert seit: 10.12.2024
Version(en): 365
Hallo zusammen und erst mal danke für die Aufnahme im Forum,
ich habe folgendes Problem:
auf einigen Tabellenblättern würde ich gerne die Feststelltaste automatisch aktivieren, auf anderen wieder ausschalten.
Über sendkey gibt es aber immer wieder das Problem, das die Taste auf den falschen Blättern angesprochen wird bzw. Numlock mit
ein-/ausgeschaltet wird.
Mit einer Abfrage ob die Taste an oder aus ist war ich noch nicht erfolgreich.
Allerdings bin ich auch noch ziemlicher Anfänger mit VBA..
LG YueGo
Registriert seit: 22.11.2019
Version(en): 365
Hallo YueGo,
dass bei SendKeys der Numlock ohne erkennbaren Grund und unkontrolliert umgeschaltet wird, ist ein bekanntes Problem.
Ich habe mir mal dazu eine Ersatz-Sub geschrieben, die das Problem löst. Hierzu sendest Du Deine Tastencodes nicht direkt sondern über die Funktion SendMyKeys.
Weitere Alternative ist der Test2.
Vielleicht hilft Dir das ja weiter.
Code:
Private Declare PtrSafe Function GetKeyboardState Lib "user32" ( _
pbKeyState As Byte) As Long
Sub TestSendKeys()
SendMyKeys "^v"
End Sub
Sub SendMyKeys(Was As String)
' Nummernblockeinstellung merken, SendKeys abschicken,
' Nummernblock ggf. wiederherstellen
' GetKeyboardState Keys(0) Keyboard-Array füllen
Dim Keys(0 To 255) As Byte, bNumBlock As Byte
GetKeyboardState Keys(0): bNumBlock = Keys(vbKeyNumlock)
SendKeys Was
GetKeyboardState Keys(0)
If bNumBlock <> Keys(vbKeyNumlock) Then SendKeys "{NUMLOCK}"
End Sub
' oder diese Alternative hier
Sub Test2()
CreateObject("WScript.Shell").SendKeys "^v", True
End Sub
_________
viele Grüße
Karl-Heinz
Registriert seit: 06.12.2015
Version(en): 2016
10.12.2024, 17:30
(Dieser Beitrag wurde zuletzt bearbeitet: 10.12.2024, 17:30 von Fennek.)
@Volti
Hallo,
da ich sehr wenig Ahnung von API's habe, wollte ich den Code sofort ausprobieren.
Aber "^v", also "paste" zerstört den Code im VBE.
Benötigt man nicht einen Schalter für "Einschalten" und "Ausschalten"?
Mein Versuch war:
Code:
Private Declare PtrSafe Function GetKeyboardState Lib "user32" ( _
pbKeyState As Byte) As Long
Sub TestSendKeys()
'SendMyKeys "^v"
SendMyKeys "{NUMLOCK}"
End Sub
Sub SendMyKeys(Was As String)
' Nummernblockeinstellung merken, SendKeys abschicken,
' Nummernblock ggf. wiederherstellen
' GetKeyboardState Keys(0) Keyboard-Array füllen
Dim Keys(0 To 255) As Byte, bNumBlock As Byte
GetKeyboardState Keys(0): bNumBlock = Keys(vbKeyNumlock)
SendKeys Was
GetKeyboardState Keys(0)
If bNumBlock <> Keys(vbKeyNumlock) Then SendKeys "{NUMLOCK}"
End Sub
Damit wird Numlook gewechselt, aber nicht gezielt "An-" oder "Ausgeschaltet".
mfg
PS: Aus meinem Archiv:
Code:
Private Declare PtrSafe Function GetKeyboardState Lib "user32" ( _
pbKeyState As Byte) As Long
Sub NumBlockEinschalten()
Dim Keys(0 To 255) As Byte
GetKeyboardState Keys(0)
If Keys(vbKeyNumlock) = False Then SendKeys "{NUMLOCK}"
End Sub
Sub NumBlockAusschalten()
Dim Keys(0 To 255) As Byte
GetKeyboardState Keys(0)
If Keys(vbKeyNumlock) Then SendKeys "{NUMLOCK}"
End Sub
Function GetNumBlockStatus() As Boolean
Dim Keys(0 To 255) As Byte
GetKeyboardState Keys(0)
GetNumBlockStatus = Keys(vbKeyNumlock)
End Function
Sub Test()
MsgBox "Der Nummernblock ist " & IIf(GetNumBlockStatus, "ein", "aus") & "geschaltet!"
End Sub
Registriert seit: 18.10.2020
Version(en): 365
Mein Vorschlag wäre
Code:
Option Explicit
Public Declare Function GetKeyState Lib "user32" ( _
ByVal nVirtKey As Long) As Integer
Private Declare Sub keybd_event Lib "user32" ( _
ByVal bVk As Byte, _
ByVal bScan As Byte, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
Private Const VK_CAPITAL = &H14
Private Const KEYEVENTF_KEYUP = &H2
Private Const KEYEVENTF_EXTENDEDKEY = &H1
Sub ToggleCapsLock()
' Simulate a Caps Lock key press
keybd_event VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY, 0
' Simulate a Caps Lock key release
keybd_event VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
End Sub
Sub CapsLockOff()
If (GetKeyState(VK_CAPITAL) = 1) Then
ToggleCapsLock
End If
End Sub
Sub CapsLockOn()
If Not (GetKeyState(VK_CAPITAL) = 1) Then
ToggleCapsLock
End If
End Sub
Registriert seit: 22.11.2019
Version(en): 365
Hallo Fennek,
hier ging es darum, SendKeys sicher zu benutzen ohne dass die Numlock-Taste verstellt wird, was ja leider öfter mal passiert.
Es ging nicht um das gezielte Ein- oder Ausschalten der Numlock oder Feststelltaste.
Die Funktion verwendet genauso Sendkeys, als wenn man es gleich verwendet, nur dass vorher die Numlock-Taste gecheckt wird und nach der Sendung eine evtl. Verstellung wieder korrigiert wird.
Das Beispiel ^v war vielleicht etwas dumm gelaufen, aber das ganze hat nichts mit der API zu tun.
SendKeys sendet die Tastenanschläge, wie auch die von Warkings gezeigte keybd_event, immer an das aktive Vordergrundfenster. Wenn Du die Test-Sub bei offenem VBE ablaufen lässt, erhält die VBE die Tastenanschläge und führt dort zu der Einfügeoperation.
Gruß
Karl-Heinz
Registriert seit: 26.09.2022
Version(en): 2019
Moin,
bei YueGo wird hinzukommen, dass er zusätzlich zu SheetActivate-Events immer auch darauf reagieren muss, wenn der User mit Alt-Tab in- oder aus einer anderen Anwendung zu Excel wechselt. Ich glaube, das hatten wir in der letzten oder vorletzten Woche schonmal als Thema.
Die Frage ist daher - wie so oft -: Was soll der Spaß? Wozu sollte es wichtig sein, auf bestimmten Blättern mit CapsLock zu arbeiten, was nicht anders besser gelöst wäre? Vielleicht erhellt uns der TE ja noch diesbezüglich.
Viele Grüße
derHöpp
Registriert seit: 10.12.2024
Version(en): 365
11.12.2024, 15:33
Danke für die Hilfe!
Habe es hinbekommen.
Aber das nächste Problem kommt bestimmt
Gruß
YueGo