QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑 ; |( T2 w( ]6 c/ {5 Z6 D

* l" w7 ~& b8 {. k各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的
- D' u# e* B, U* _4 U% p" J- Q
  1. '查找块
    1 O4 z2 x& f% a$ O, X; }
  2. Public Sub FindBlock()- W2 r( I6 o/ y
  3. ( k- z9 t- \+ `
  4. Dim Objblock As AcadBlockReference
    $ Q$ p8 ~& s( C+ a
  5. 5 |, t! n$ O6 d/ K+ c. z! U. \
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配& _6 [) n3 k$ g+ ~0 n
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then
    , O* z# B! ~. M7 ~- ~( K1 q
  8.      MsgBox "存在!", e" E  l9 I, L9 n
  9.   Else
    0 O% w1 x0 E8 ^& }
  10.      MsgBox "不存在!"' L# j( Q9 Y: v" R. U; Q; Q' R
  11.   End If  ?% t$ s* I( ], `1 J% z
  12. Next Objblock
    + H3 T8 t% h# ]4 u1 ^

  13. 9 u' K: }6 T' L; j1 w3 Q
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码

  1. # _6 D: k9 p$ s, s1 y
  2. Sub A()
    4 o' @% `: k5 Y
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean* J# I! j! q4 A% [# [9 z
  4.     For Each E In ThisDrawing.ModelSpace
    # [3 D: Q" q7 O% H- P: F
  5.         If E.ObjectName = "AcDbBlockReference" Then
    3 b+ }& [8 a9 W+ N4 Z  f
  6.             Set BR = E
    1 [# q: X' f7 r* G
  7.             If BR.Name = "属性块" Then
    6 ~0 F0 }  k" M
  8.                 B = True
    $ n3 ]5 B5 ~* u; i6 z
  9.                 Exit For
      ]3 G. y. @1 Q0 \) v0 d2 d
  10.             End If- K( Q  J8 y# H3 b1 o0 z3 H
  11.         End If: b4 J; G9 H/ K. H2 ^* H  ?
  12.     Next* s  t0 i: ]9 m1 C* v$ o
  13.     If B Then2 t  P1 C7 q4 x7 z7 F* z
  14.         MsgBox "存在"
    ) F) f  ]6 y3 s1 y2 `, Q% ]
  15.     Else: n& G* j; v. o! w- |
  16.         MsgBox "不存在"# o4 s. l9 z) f0 B/ l; y
  17.     End If' m% g: T! C( m% |
  18. End Sub. b2 R" ~" ?: x- y# f- K
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant"./ t8 J/ k; B! h" V( e5 X3 ~* t
上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?
8 `1 W6 N: t7 J6 Q6 O8 D! Q如果是前者,上面的代码就可以了.如果是后者,要用下面的代码

  1. - ^8 J7 g9 e) @# E
  2. Sub A()
    4 D8 s5 T! s9 O& a
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant
    ! l: L" B6 K, y/ p
  4.     For Each E In ThisDrawing.ModelSpace2 W4 W# y3 W$ D! R1 J, ?( j
  5.         If E.ObjectName = "AcDbBlockReference" Then1 b' I$ t' \# z
  6.             Set BR = E2 j& m% ?+ s" V* [
  7.             Atts = BR.GetAttributes( l; {( V2 x" @
  8.             If UBound(Atts) >= 0 Then: P: x3 p- S  e7 D# N) W4 T
  9.                 B = True
    / Y3 ]/ l+ h, A* z+ ~5 x
  10.                 Exit For
    ; J4 S& ?/ W) a, D& L: X' L
  11.             End If
    ; y4 P; ]7 p) o- r( R/ Y
  12.         End If
    * C$ c8 s  @8 ]/ N6 J0 X3 Z# U* I
  13.     Next+ }# X2 _6 M0 b9 i) _9 [
  14.     If B Then0 X  T+ J* x/ u+ g" ~. g$ \
  15.         MsgBox "存在"3 Y' `" D' D; H- a
  16.     Else( l/ @, @6 _% T" S
  17.         MsgBox "不存在"
    ( e( @* {7 K0 `( q) h7 i
  18.     End If- c( n4 b% _% i7 X9 b! ~* u* J
  19. End Sub8 D7 l* H' g2 h# w5 t; H
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia * M7 B3 R! R, e, b' B8 J0 I" B

! p9 E+ }! A0 ^) C4 S我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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