yxh1202 发表于 2010-6-8 14:50:00

最好能实现在VBA执行的任何地方,只要按ESC键就可以退出执行,回复到CAD界面。谢谢高手指点

洋葱老爹 发表于 2010-6-20 21:03:00

读取系统变量"erron",根据返回值可以知道是否按了ESC键或别的什么键.

3xxx 发表于 2016-6-8 21:53:02

请教:
Do
      DoEvents
      dl& = GetKeyboardState(Key(0))       '获取当前按键状态——这句是什么用意?
      For i = 0 To 254
            If Key(i) And &H80 Then    '如某个键当时按下,则位7为1——这句怎么理解?
                KeyCode& = MapVirtualKey(i, 0)
                If KeyCode = 1 Then Exit Do
            End If
      Next
    Loop

vbcad 发表于 2016-6-9 20:22:44

在你的代码中加入循环检测按键
用法
DO
IF chkKeyDown( "Esc") THEN
   DEBUG.PRINT "按下了ESC键"
    EXIT DO
ENDIF
LOOP




下面是模块中的代码
Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
Private Declare Function GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As Long
Dim arrKeyName(255) As String, bReadKeyNameFlag As Boolean
Public Function chkKeyDown(ByVal sKeyName As String) As Boolean
    Dim r As Long
    Dim Key(0 To 255) As Byte
    Dim KeyCode As Long

    If Not bReadKeyNameFlag Then Call LoadKeyName '如果没有载入键名,载入键名

    KeyCode = KeyNameToCode(sKeyName)
    r = GetKeyboardState(Key(0)) '获取当前按键状态
    If Key(KeyCode) And &H80 Then '如果指定键按下
      chkKeyDown = True
    End If

End Function
Private Sub LoadKeyName()
Dim iCode As Long
Dim sTxt As String

For iCode = 1 To 127
    sTxt = String(128, Chr(0))
    GetKeyNameText MapVirtualKey(iCode, 0) * &H10000, sTxt, 128
    If InStr(sTxt, Chr(0)) > 0 Then
      sTxt = Left(sTxt, InStr(sTxt, Chr(0)) - 1)
      arrKeyName(iCode) = sTxt
    End If
Next
For iCode = 1 To 127
    Debug.Print iCode, arrKeyName(iCode), Len(arrKeyName(iCode))
Next
bReadKeyNameFlag = True
End Sub
Private Function KeyNameToCode(ByVal sKeyName As String) As Long
Dim iCode As Long
For iCode = 1 To 127
    If arrKeyName(iCode) = sKeyName Then
      KeyNameToCode = iCode
      Exit For
    End If
Next
End Function


vbcad 发表于 2016-6-9 20:28:45

指定按键名要注意大小写
常用按键

IF chkKeyDown( "Tab") THEN debug.print "按下Tab键"
IF chkKeyDown( "Enter") THEN debug.print "按下回车键"
IF chkKeyDown( "Shift") THEN debug.print "按下Shift键"
IF chkKeyDown( "Ctrl") THEN debug.print "按下Ctrl键"
IF chkKeyDown( "Alt") THEN debug.print "按下Alt键"
IF chkKeyDown( "Caps Lock") THEN debug.print "按下大小写转换键"
IF chkKeyDown( "Space") THEN debug.print "按下空格键"
IF chkKeyDown( "Num 1") THEN debug.print "按下数字键盘1键"
IF chkKeyDown( "Num 9") THEN debug.print "按下数字键盘9键"
IF chkKeyDown( "F1") THEN debug.print "按下F1键"
IF chkKeyDown( "F12") THEN debug.print "按下F12键"

3xxx 发表于 2016-6-10 13:20:59


非常好,谢谢你的耐心解答。

xjjq2008 发表于 2016-10-19 19:01:46

天之雨露 发表于 2009-6-23 05:28
DoEvents能实现你要的功能,具体参见以下网址,灵活运用http://www.cnblogs.com/todd/archive/2006/05/10/3 ...

处理按下Esc键
      If objSelect Is Nothing Then
                If CheckKey(&H1B) = True Then
                  Exit Sub
                Else
                  do something
                End If
            End If

月牙湾 发表于 2016-10-19 22:07:40

加个 if,判断一下esc就可以了。
页: 1 [2]
查看完整版本: 一个简单问题,VBA如何实现按ESC键退出循环?