明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 881|回复: 9

CAD VBA经常会遇到一个问题不知道如何处理。

[复制链接]
发表于 2018-11-23 18:54 | 显示全部楼层 |阅读模式
就是我事先不知道,我需要几个点,而每个点都需要用GetPoint函数获得。如果用循环,要怎么退出。我现在都 是按Esc让取点错处,然后通过错误处理退出。但是实际画图Esc一般都是取消,觉得很怪,有没有更好的办法。比如点空格就退出(CAD2008是可以,但CAD2019就不行。)
发表于 2018-11-26 09:41 | 显示全部楼层
ACAD VBA的交互部分比较弱,要取点就只能取点,要取按键就只能取按键,不能混合。要循环就只能通过ESC或者右键等来产生错误来退出了。
回到你的问题,如果左键选点,想右键退出的话,可以试试右键后产生的错误代码是多少,然后处理。以下我的取数值的代码供参考,可以输入一个数值,可以右键选择默认的数值,可以ESC退出。
    Err.Clear
    AddValue = ActiveDocument.Utility.GetReal(vbLf & "请输入要增加的数值(右键选择" & AddValue + ssetObj.Count & ",ESC退出):")
    Select Case Err.Number
           Case -2147467259, -2145320928 '右键
                AddValue = AddValue + ssetObj.Count
           Case -2147352567  'ESC
                GoTo ExitSub
           Case Else
    End Select
回复 支持 0 反对 1

使用道具 举报

发表于 2018-11-25 16:34 | 显示全部楼层
如果你只是取点,退出时按ESC,获取错误处理,不是很好吗?
 楼主| 发表于 2018-11-26 20:36 来自手机 | 显示全部楼层
mikewolf2k 发表于 2018-11-26 09:41
ACAD VBA的交互部分比较弱,要取点就只能取点,要取按键就只能取按键,不能混合。要循环就只能通过ESC或者 ...

谢谢你给我很大的启发。
 楼主| 发表于 2018-11-26 20:36 来自手机 | 显示全部楼层
zzyong00 发表于 2018-11-25 16:34
如果你只是取点,退出时按ESC,获取错误处理,不是很好吗?

就觉得有点怪,一般esc是退出才对。
发表于 2018-12-4 17:04 | 显示全部楼层
mikewolf2k 发表于 2018-11-26 09:41
ACAD VBA的交互部分比较弱,要取点就只能取点,要取按键就只能取按键,不能混合。要循环就只能通过ESC或者 ...

怎么可能有这种想法,这种想法是错误的
发表于 2018-12-4 17:10 | 显示全部楼层
异常捕捉本身就是功能的一部分,人家设计就是按Esc产生错误,再者循环内检测按键都可以

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Public Const VK_ESCAPE = &H1B
Public Const VK_LBUTTON = &H1
Public Const VK_RBUTTON = &H2
Public Const VK_SPACE = &H20
Public Const PI As Double = 3.14159265358979
Public Function CheckKey(lngKey As Long) As Boolean
If GetAsyncKeyState(lngKey) Then
    CheckKey = True
Else
    CheckKey = False
End If
End Function

用时是这样的
Call CheckKey(VK_ESCAPE)  '消除上一次命令按的取消键
Do Until m_Enabled = False
    str = VLF.Item("cursor").funcall()
    If CheckKey(VK_ESCAPE) = True Then
        RaiseEvent Move(KeyBoard, vbKeyEscape, p)
        Exit Sub
    End If
    temp = Split(str, " ")
    If UBound(temp) > 1 Then
        p(0) = Val(temp(1))
        p(1) = Val(temp(2))
        p(2) = Val(temp(3))
    End If
    RaiseEvent Move(temp(0), temp(1), p)
Loop

 楼主| 发表于 2018-12-5 23:40 来自手机 | 显示全部楼层
wuyunpeng888 发表于 2018-12-4 17:10
异常捕捉本身就是功能的一部分,人家设计就是按Esc产生错误,再者循环内检测按键都可以

Private Declare ...

感觉好高端,要好好学习一下。
 楼主| 发表于 2018-12-8 23:21 来自手机 | 显示全部楼层
wuyunpeng888 发表于 2018-12-4 17:10
异常捕捉本身就是功能的一部分,人家设计就是按Esc产生错误,再者循环内检测按键都可以

Private Declare ...

大神,还有一个问题我想请教一下。就是我有一个三维软件会自动生成一个excel并打开。然后我在这个三维软件里用vba想直接处理这个表格。用set xbook=xlapp.activeworkbook时一直出错。原因是我点击运行宏时excel界面就不是激活的,该如何解决。
发表于 2019-1-12 09:52 | 显示全部楼层
用命名集合的方式来引用,如set xbook=xlapp.workbooks.item("名称")这种,或者遍历查找也可以
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-20 18:53 , Processed in 0.194657 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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