linque06 发表于 2018-11-23 18:54:06

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

就是我事先不知道,我需要几个点,而每个点都需要用GetPoint函数获得。如果用循环,要怎么退出。我现在都 是按Esc让取点错处,然后通过错误处理退出。但是实际画图Esc一般都是取消,觉得很怪,有没有更好的办法。比如点空格就退出(CAD2008是可以,但CAD2019就不行。)

mikewolf2k 发表于 2018-11-26 09:41:22

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

zzyong00 发表于 2018-11-25 16:34:45

如果你只是取点,退出时按ESC,获取错误处理,不是很好吗?

linque06 发表于 2018-11-26 20:36:14

mikewolf2k 发表于 2018-11-26 09:41
ACAD VBA的交互部分比较弱,要取点就只能取点,要取按键就只能取按键,不能混合。要循环就只能通过ESC或者 ...

谢谢你给我很大的启发。

linque06 发表于 2018-11-26 20:36:52

zzyong00 发表于 2018-11-25 16:34
如果你只是取点,退出时按ESC,获取错误处理,不是很好吗?

就觉得有点怪,一般esc是退出才对。

wuyunpeng888 发表于 2018-12-4 17:04:25

mikewolf2k 发表于 2018-11-26 09:41
ACAD VBA的交互部分比较弱,要取点就只能取点,要取按键就只能取按键,不能混合。要循环就只能通过ESC或者 ...

怎么可能有这种想法,这种想法是错误的

wuyunpeng888 发表于 2018-12-4 17:10:34

异常捕捉本身就是功能的一部分,人家设计就是按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

linque06 发表于 2018-12-5 23:40:55

wuyunpeng888 发表于 2018-12-4 17:10
异常捕捉本身就是功能的一部分,人家设计就是按Esc产生错误,再者循环内检测按键都可以

Private Declare ...

感觉好高端,要好好学习一下。

linque06 发表于 2018-12-8 23:21:33

wuyunpeng888 发表于 2018-12-4 17:10
异常捕捉本身就是功能的一部分,人家设计就是按Esc产生错误,再者循环内检测按键都可以

Private Declare ...

大神,还有一个问题我想请教一下。就是我有一个三维软件会自动生成一个excel并打开。然后我在这个三维软件里用vba想直接处理这个表格。用set xbook=xlapp.activeworkbook时一直出错。原因是我点击运行宏时excel界面就不是激活的,该如何解决。

wuyunpeng888 发表于 2019-1-12 09:52:48

用命名集合的方式来引用,如set xbook=xlapp.workbooks.item("名称")这种,或者遍历查找也可以
页: [1]
查看完整版本: CAD VBA经常会遇到一个问题不知道如何处理。