明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: grado

一个简单问题,VBA如何实现按ESC键退出循环?

  [复制链接]
发表于 2010-6-8 14:50:00 | 显示全部楼层
最好能实现在VBA执行的任何地方,只要按ESC键就可以退出执行,回复到CAD界面。谢谢高手指点
发表于 2010-6-20 21:03:00 | 显示全部楼层
读取系统变量"erron",根据返回值可以知道是否按了ESC键或别的什么键.
发表于 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
发表于 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


发表于 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键"

发表于 2016-6-10 13:20:59 | 显示全部楼层
[em84
非常好,谢谢你的耐心解答。
发表于 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就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 09:45 , Processed in 0.239228 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表