找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1117|回复: 4

[VBA程序]:求教 多次执行循环跳出问题

[复制链接]
发表于 2006-3-2 18:04:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
代码说明:这段小代码我是写在vbaide的模块中的,想实现在vbaide界面点F5后可以进入CAD,点一个有长度属性的obj(假定点直线),然后点一个文字,把直线的长度值(小数点后保留3位)赋值给这个text,并且可以循环多次直到按esc键

问题: 在loop 后添加

            Until Checkkey(vk_escape) = True  后只执行一次就跳出循环了,不要这个语句又跳不出循环

请帮忙指正一下,卡在这儿不知道怎么做了 谢谢了

附代码如下:

Public Const vk_escape = &H1B
Public Declare Function Getasynckeystate Lib "user32" (ByVal vkey As Long) As Integer

Public Function Checkkey(lngkey As Long) As Boolean
If Getasynckeystate(lngkey) Then
Checkkey = True
Else
Checkkey = False
End If
End Function

Sub CHANGDU()
Dim Sourceobj As AcadObject     '有长度属性的obj
Dim Basepnt As Variant      
Dim Destobj As AcadText    '文字
Dim value1  As Single          '长度值
Dim Value2 As Single           '长度值 保留位数之后的
Dim Objselected As Integer   '循环需要
Dim unit As Long
Dim ws As Integer                    '需要保留的小数点后位数

On Error Resume Next
Objselected = 1

Do  '进入循环
Retry:
    ThisDrawing.Utility.GetEntity Sourceobj, Basepnt, "选择线(有长度属性的,圆弧则应该转换成多段线后在用本程序)"
    '选择有长度属性的obj 主要是直线或则多段线
      
       If Sourceobj Is Nothing Then     '如果没有选择则重新选则
       GoTo Retry
       Else
       End If
        
    ws = 3
    unit = acDecimal
    value1 = Sourceobj.Length
    Value2 = ThisDrawing.Utility.RealToString(value1, unit, ws)  '保留3位有效小数位
   
Gettext:
    ThisDrawing.Utility.GetEntity Destobj, Basepnt, "选择文字"
      
       If Destobj Is Nothing Then    '如果没有选择则重新选则
       GoTo Gettext
       Else
       End If

     Destobj.TextString = Value2

Loop Until Checkkey(vk_escape) = True    '问题语句 位置*-*3
ExitSub:
End Sub
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-3-2 18:24:02 | 显示全部楼层
用错误机制
按下Esc会引发错误的,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-2 20:49:25 | 显示全部楼层
先谢谢斑竹   我加了Until Checkkey(vk_escape) = True后跳出并不是因为按了esc
我我希望能够运行一次就可以 点一个直线,赋值给一个文字,再点一个直线,赋值给一个文字
这样重复做很多次直到我不需要这么做了,然后按esc跳出来,现在问题是我用这段代码可以执行一次赋值,之后没有按esc键就返回vbaide界面了,不能重复做
(那段关于esc的函数是从书上抄的)
如果我不用 Until Checkkey(vk_escape) = True  
的话该怎么在我想跳出时跳出运行啊 谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-2 22:24:03 | 显示全部楼层
Sub CHANGDU()
On Error GoTo ErrHandle
Dim Sourceobj As AcadObject '有长度属性的obj
Dim Basepnt As Variant
Dim Destobj As AcadText '文字
Dim value1 As Single '长度值
Dim Value2 As Single '长度值 保留位数之后的
Dim Objselected As Integer '循环需要
Dim unit As Long
Dim ws As Integer '需要保留的小数点后位数

Objselected = 1

Do While True '进入循环

ThisDrawing.Utility.GetEntity Sourceobj, Basepnt, "选择线(有长度属性的,圆弧则应该转换成多段线后在用本程序)"
'选择有长度属性的obj 主要是直线或则多段线


ws = 3
unit = acDecimal
value1 = Sourceobj.length
Value2 = ThisDrawing.Utility.RealToString(value1, unit, ws) '保留3位有效小数位

ThisDrawing.Utility.GetEntity Destobj, Basepnt, "选择文字"

Destobj.TextString = Value2

Loop '问题语句 位置
ErrHandle:
End Sub
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-3 00:02:08 | 显示全部楼层
谢谢版主的无私帮助
能用了
不过选东西的时候如果没有选到就会停止运行了,只能小心点了
感谢


在我第一楼的代码中的dim语句完了后使用msgbos发现 Checkkey(vk_escape) 从程序运行开始就是true (为什么我没有按esc键而Checkkey(vk_escape)=true到现在为止我还不知道原因)
在参考的那个使用api函数判断esc键的程序里面找了半天,找到一句 err.clear
加了进去程序好像就可以用了
       If Sourceobj Is Nothing Then
       Err.Clear
       GoTo Retry
       Else
       End If
难道err会影响esc键值的判断吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-28 19:21 , Processed in 0.366263 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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