|
|
发表于 2014-7-18 05:48:15
|
显示全部楼层
来自: 中国辽宁营口
先说A段' {4 b0 g- L" P# _ k C
A段中有一个错误adss是选择集对象,adss(2)则是其中一个索引号为2的块参照对象,而块参照对象是没有Erase方法的.这显然是一个错误.
1 H; S z( ~/ r4 Z* y* S这个错误在调试中没有被发现,原因在于On Error Resume Next使得程序在遇到错误时跳过去执行下一行.这本来是为查找同名选择集用的,可它在代码后面仍然在发挥作用,掩盖了后面的错误.
$ e) F7 [1 |3 a8 n. |" _4 Y: t合理的方法是在查找同名选择集后,在代码中写入一行它的用途是禁止当前过程中任何已启动的错误处理程序,也就是让On Error Resume Next在后面的代码中不再起作用.' D# N5 k V$ s1 \
# L$ `8 f. K. R
B段- Dim fType1(0 To 1) As Integer+ D6 E% I9 R3 x; ~
- Dim fData1(0 To 1) As Variant
复制代码- adss1.Select acSelectionSetCrossing, tukuang0A, tukuang0C, fType, fData
复制代码 你的模块通用声明部分应该是缺少这一行这个语句的意义是要求变量必须显式声明./ D$ ]* ]8 @' V4 x
如果没有这个语句,当程序运行到栏选这一行时,会自动声明两个新的变体变量:fType和fData,并没有使用你定义的选择集过滤器,导致选择失败.A段和B段连起来用时,这一行就会使用A段中定义的过滤器,所以正常.
$ T' n l" R; ?提一个建议:在VBA编辑器的"工具"菜单下点"选项",在弹出的选项对话框的"编辑器"选项卡的"代码设置"框架中选中"要求变量声明"复选框.以后在新建模块窗口时,编辑器会在模块前面自动添加Option Explicit语句,这会让我们少犯错误.2 u5 @ Q1 d& z, U1 Y+ A1 @2 n
% |2 E5 z! N0 F# u7 UC段错了- Bttreff = aref.GetAttributes
复制代码 Bttreff是包含该块参照中所有属性参照的数组,Bttreff(1)则是其中一个数组下标为1的属性参照对象;而MsgBox的第一个参数是你想在消息框上显示的字符串,它不能显示一个CAD对象 ! A9 Z1 d( i6 Z$ ]# v7 I
可以这样写- MsgBox Bttreff(1).TagString
复制代码 或者- MsgBox Bttreff(1).TextString
复制代码 等等6 D/ I: E# i1 x/ z
g2 r- A! z0 ]C1,C2和C30 _# }* j8 E" s; E2 [# I
C1和C2都对,C3错( m1 G; a- d0 f" Y h# i
AttributeReference是BlockReference(块参照对象)中的属性参照对象,是块参照对象的一个元素;BlockReference是Entity(CAD图元对象)的子集,而Entity又是Object(所有对象)的子集.6 P. P0 q6 g) v" f, s
打个比方,BlockReference是"人",AttributeReference是"手",Entity是"动物"的统称,Object是"生物"的统称,"人"当然是"动物",也是"生物",但"人"不是"手","手"也不是"人": o' G3 `( @& E/ \) I1 v$ q
如果你下一步要操作的是一个"人"对象,声明变量为"人",或者"动物",甚至"生物",对程序运行都没有影响.区别在于编辑代码时,如果VBA编辑器看到你前面声明的是"人",就会提示你所有"人"的属性,方法和事件;如果VBA编辑器看到你声明的是"动物",就只能提示"动物"共有的属性,方法和事件,如果你使用了"翅膀"这个鸟类动物的属性,VBA编辑器也不会发现你的错误,直到运行程序时才会报错.如果VBA编辑器看到你声明的是"生物",就什么提示也没有了,因为它根本不知道你要干什么.$ }, p3 d2 y7 j4 C( e7 O. q
|
|