QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3416|回复: 3
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑 * Z6 }6 d% N6 T/ a; ]

$ B- z4 {' U. k. b( S5 N. R各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的) E+ B  B; V  W4 h  i* r
  1. '查找块
    * n$ G7 J# l3 k/ [. E
  2. Public Sub FindBlock()
    5 t9 E8 a; u" _) R( g

  3. 8 ?0 j5 Y( r7 k3 a5 h7 e$ z* e
  4. Dim Objblock As AcadBlockReference
    9 Z0 z% i- H! |

  5. + f% o  D: f! W1 D1 p+ G- ~
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配: o  Q4 g3 D- j. p. }
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then
    5 W, d2 R/ n1 H" _
  8.      MsgBox "存在!"! e7 f2 V% I% f7 ^0 M9 [2 B3 U
  9.   Else$ h- K4 J8 ]1 o
  10.      MsgBox "不存在!"
    6 n- ^1 Z/ B7 B- @
  11.   End If( w7 n7 t, x' ~3 y" `7 u
  12. Next Objblock
    # M9 I- O8 o% ?0 s4 {( g
  13. $ U- S6 v' i# J; q. L
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码
  1. 1 O4 @) Z# F( I; E
  2. Sub A()2 A4 R& v/ h% o% E$ ]: X3 }5 t
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean- [, K# J! y) N' U# B; `& L
  4.     For Each E In ThisDrawing.ModelSpace
    1 N( ?/ t& r+ V8 @) ]7 w( Z
  5.         If E.ObjectName = "AcDbBlockReference" Then% J3 S, O3 n9 S- V& l( a0 j
  6.             Set BR = E# ^* d  W9 L# s7 ?' A" K& J) A
  7.             If BR.Name = "属性块" Then) l/ Y- z: k3 K% l8 m9 I! B# I+ h4 n
  8.                 B = True
    ( `7 Q1 i6 l% u, n0 J! a
  9.                 Exit For
    3 J4 k  ]" b0 t- ^6 b
  10.             End If
    3 F; ~0 q+ E" O" y7 r7 l
  11.         End If
    + y0 o4 w$ C3 }# ^' e' M
  12.     Next% H( X: {2 Q; H2 B- w
  13.     If B Then
    ! [' ?, P3 g: g; o) t
  14.         MsgBox "存在"" i) X3 ]) H7 x4 j8 Y
  15.     Else  H7 k$ v6 f4 H  V! g2 U/ N
  16.         MsgBox "不存在"2 n& I( t7 V; E8 x# M' G0 d
  17.     End If
      M5 P. H3 F2 h( V! Y7 k7 p
  18. End Sub
      [2 \2 b) A# N! `' D4 o7 b
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".
( }1 Z( O7 F. j) X) Z! ]上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?
: N8 j0 v( S3 U% v' ~+ {! [如果是前者,上面的代码就可以了.如果是后者,要用下面的代码
  1. " T; W( l; f- i/ u4 L, t
  2. Sub A()
    9 N" u4 Y7 m' ]5 w/ u; G9 m+ Q/ S
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant
    . s$ Z' R! }  ~
  4.     For Each E In ThisDrawing.ModelSpace, d# J! e, J, \: N, w, q. }9 h7 w
  5.         If E.ObjectName = "AcDbBlockReference" Then
    7 z. k; z8 r. @/ O5 I0 j: E
  6.             Set BR = E! p, R7 A4 \2 r
  7.             Atts = BR.GetAttributes5 L' A) q: N# c* z4 W
  8.             If UBound(Atts) >= 0 Then
    3 \0 O# _1 E" o9 l( T" z$ w- \
  9.                 B = True
    2 n9 b+ M$ m% X  O$ K
  10.                 Exit For# p9 L) t- o+ E! U3 a
  11.             End If" H) p$ [; `, p& K8 e4 H4 f9 K
  12.         End If- P; l: A; @7 }' ?' K
  13.     Next
    4 @  y( B9 J( d) E& g* w) n
  14.     If B Then
    ( o# j' Q% E6 e* x7 a$ V
  15.         MsgBox "存在"
    . v: j' U* k1 `5 Z7 d
  16.     Else$ M7 ~# G' T. i8 {( b: k
  17.         MsgBox "不存在". s$ x1 \8 P1 E( y) l: r5 N5 q' z
  18.     End If% v# G* p( T) U, e* f' g/ A
  19. End Sub+ i- ]5 q7 Z3 V2 o( l) Z- ?
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia
: e2 a0 }( h$ T" @: S) W8 a# G, G4 M6 p, l- ]( N+ Q7 C
我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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