QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
5天前
查看: 3335|回复: 3
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑 , r- B" R& T! U$ @
0 v9 F8 E9 ?$ o  {4 ~( v9 J4 B
各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的
+ B  s4 R% g4 S0 h
  1. '查找块8 O  |7 Q& ^6 s! n% p2 A
  2. Public Sub FindBlock(): n; z3 _. N9 w* J8 d( J
  3. 8 z  B7 @9 s4 S4 l
  4. Dim Objblock As AcadBlockReference
    ' U  _, p7 `8 |* k2 V- |; s2 W0 U$ w

  5.   p" H6 b0 E+ m2 X
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配# C9 D6 E* g# Z! C$ q9 w- ^. G
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then
    ( V4 E4 J& b$ [. \
  8.      MsgBox "存在!"
    - O. q4 `. b! S* B
  9.   Else' p$ y9 F, D' C6 q; _8 P5 p' l* k. U
  10.      MsgBox "不存在!"+ i. L. x% C. f! y$ V
  11.   End If
    1 N) Q8 T7 S6 R2 M% }
  12. Next Objblock$ g( L+ \* W2 c3 |: F9 G

  13. ! ]0 k: b; d: W' U
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码
  1.   K2 C! m6 V% _: T
  2. Sub A()
    / O( H2 F% A& A. H# ~  m
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean: u3 g& I  I* \. r
  4.     For Each E In ThisDrawing.ModelSpace
    0 f1 L: Y$ V- D( [' r, K5 {& h
  5.         If E.ObjectName = "AcDbBlockReference" Then
      y" W7 i6 q4 g; i- P. v( r
  6.             Set BR = E* W( }5 Q9 `. b8 C
  7.             If BR.Name = "属性块" Then
    5 ?' ^: I4 p! ^: ^1 l# z; o( B( h6 {
  8.                 B = True; P% h( N5 _. L' c
  9.                 Exit For
    + B9 _' D3 h7 x& q& [/ M
  10.             End If
    9 m7 W0 V5 }. m0 e
  11.         End If
    5 G/ g7 X0 j  {( X# a
  12.     Next
    ! B  \, b3 M0 T! L7 L* _8 t
  13.     If B Then" F9 x9 O& g) M" W0 n5 x  `8 ^
  14.         MsgBox "存在", p5 K" z/ g* A6 o1 [- T* k
  15.     Else  L# I! W$ M1 l* N$ |1 s
  16.         MsgBox "不存在"
    , ^- W4 N, ~5 B8 e& Y2 j# I
  17.     End If, D! k8 l2 C1 i+ n3 z- Z
  18. End Sub) S3 W- F# F0 T! J: H( w. x, U
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".& ~( V6 d/ [4 Z3 D; K! N! [: y
上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?1 Y4 _: _+ r( w8 ]8 N
如果是前者,上面的代码就可以了.如果是后者,要用下面的代码
  1. ' r! ?# d$ \: f  [
  2. Sub A()% V# N3 {1 V1 V! Z& |+ G/ X
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant& ~# ~; o$ V3 D: d2 O$ Z
  4.     For Each E In ThisDrawing.ModelSpace
    " C' p1 n; ~1 A2 B
  5.         If E.ObjectName = "AcDbBlockReference" Then
    3 B! @; H2 g  s
  6.             Set BR = E
    & w; H3 V+ ^- X$ v' ^* w
  7.             Atts = BR.GetAttributes: Y/ f/ u2 N6 F
  8.             If UBound(Atts) >= 0 Then- q$ Y& R2 j8 p9 @
  9.                 B = True  H9 T5 x! B+ h1 O1 k! g
  10.                 Exit For
    : P! ~7 ?: m1 g6 [& \9 h! j# O
  11.             End If
    9 h1 B. U+ |  i9 y5 G% p* V
  12.         End If* ~5 M) G( Z# n! T9 O" Y
  13.     Next
    / i& W, E) D6 |# l. m/ Z
  14.     If B Then5 ]* G% W" M; O/ h7 Y8 Y
  15.         MsgBox "存在". Z9 A9 q; A* F1 J1 {; g2 ~7 @
  16.     Else
    / I2 v: V8 i6 h* ~# ~
  17.         MsgBox "不存在"
    ' V& S, r3 s- y$ I. `/ l  T( G
  18.     End If" @4 x9 a% Y9 K
  19. End Sub( O8 U! S  h7 M1 e& w! z
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia # A, O( @% G3 e( N3 {( _% O
1 N, Z2 T1 F: S7 F; w  i8 S
我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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