QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
6天前
查看: 3401|回复: 3
收起左侧

[已答复] VBA 查找属性块代码是这么写的吗?

[复制链接]
发表于 2010-9-1 19:07:40 | 显示全部楼层 |阅读模式 来自: 中国北京

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑 8 k% U4 l3 l, G3 c

7 {8 H& g; ]  y% c3 G, V4 v" L各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的
) I% }1 E2 g; B3 ~/ }% z3 }
  1. '查找块
    ( _0 [) f3 b% C, \# v
  2. Public Sub FindBlock()6 A: t# O8 {, O' A9 \( a" w& ]; b

  3. / K# v! r, \) F# G' c3 u
  4. Dim Objblock As AcadBlockReference
    1 j6 _  d  l) W3 e2 |' G3 t

  5. 9 a, d; Q; w; k1 U& R3 A
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配7 B+ r/ Q. E: }5 U; R
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then
    " I: ^, |. X/ ~( d# w
  8.      MsgBox "存在!"7 _  [0 F( S( ^
  9.   Else! W3 h, R$ T  a1 ?9 @6 y* |
  10.      MsgBox "不存在!"
    * N& m! R& k8 B+ q2 c  }3 `
  11.   End If7 z- }: [' N8 k3 [% v( e: ~( a" z7 |
  12. Next Objblock( v  i+ J: I7 ]$ ~; n8 H- {

  13. 8 I  Y: a1 u3 e$ E' s. `
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码

  1. / ^6 _. a# R& Z  {# Q
  2. Sub A()$ H1 l$ \: P2 i& n  X% D8 v5 o
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean
    ) b- ]: h" @/ `; D$ K9 u, f- n: Q% t& h
  4.     For Each E In ThisDrawing.ModelSpace8 J. T8 G! D# N
  5.         If E.ObjectName = "AcDbBlockReference" Then# a( A0 I8 T. z9 c
  6.             Set BR = E( n& E/ S( B9 C9 G. ^
  7.             If BR.Name = "属性块" Then* q. q" B2 n1 ]' w7 P/ s: d% m
  8.                 B = True
    6 e4 \/ M9 Y" y3 R' ~5 v5 i
  9.                 Exit For
    ( L/ |6 h+ Q" S% W7 P6 A9 ^. Y
  10.             End If. l2 S4 W3 M" x
  11.         End If0 _* `" r1 f8 `
  12.     Next" T5 [1 \( j. v2 X7 Q
  13.     If B Then& ~8 A% Q" d4 c; U: W
  14.         MsgBox "存在"
    " }" _, B7 j, H: L+ o
  15.     Else/ n  l9 P; D" w8 Y
  16.         MsgBox "不存在"  p8 j' c& g  c
  17.     End If9 {! G1 Z/ k- t6 L+ h8 d$ T. g
  18. End Sub' C- m! k* G3 s$ A7 |: e
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".
( H1 K+ J& R# e3 M上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?2 y+ Z9 i* R- Z+ e. S* \4 Y: p
如果是前者,上面的代码就可以了.如果是后者,要用下面的代码

  1. , c6 U! \0 Y5 g6 @  g" g' `
  2. Sub A()
    : I3 ?7 m1 J( o2 @
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant
    0 N) B& n1 Q+ g
  4.     For Each E In ThisDrawing.ModelSpace
    6 n# g. r" t! y  w1 r7 x
  5.         If E.ObjectName = "AcDbBlockReference" Then
    ) _. h1 u: s" a* K8 N5 }
  6.             Set BR = E: G9 i2 D/ |& q3 p
  7.             Atts = BR.GetAttributes
      n% Z$ d( l4 _
  8.             If UBound(Atts) >= 0 Then
    7 d' y. ]" t; `- L: D# J4 p7 {
  9.                 B = True' i* U1 `' Q6 \" y; ]9 D! g
  10.                 Exit For# v" E' D5 r. `, ^
  11.             End If% a6 t3 y! `) X! h  A$ v
  12.         End If0 l9 h' u/ |* k, y4 M3 h3 K4 g4 [
  13.     Next: a1 v$ k# ]' |* i
  14.     If B Then
    % j/ _! V' U- L0 [) ?& R. l
  15.         MsgBox "存在"
    ( N1 p$ A9 x' H* i
  16.     Else3 M8 P  N! d5 ~  Y" e) {
  17.         MsgBox "不存在"
    7 f5 x; E1 _9 u
  18.     End If, R& W5 I7 C3 W! r$ h1 m8 R
  19. End Sub
    ; u- l( f: m* {2 J  H6 z- ?" p) H
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia
/ M: L: O* j& C, {3 m# J/ K( f- S
0 ]4 U1 |5 P4 _我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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