QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
4天前
查看: 3333|回复: 3
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑 2 S- K% t2 C3 _
* j9 }8 H( e* P! h
各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的
. T& X, H' p1 o) F
  1. '查找块
    $ M. S1 |% Q7 A" @. t' g+ M
  2. Public Sub FindBlock(); h' I% ?* [' X. E7 m
  3. : {' \5 F% Q" W, E0 ~! p5 M
  4. Dim Objblock As AcadBlockReference7 V. C& b- J% P
  5. 0 T+ ~1 e/ C& R) `" X+ y
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配( m5 c: j+ z5 e4 C. o. n
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then9 K' r. ?  i: _& G8 n0 U
  8.      MsgBox "存在!"1 D& `/ D+ J. t2 c* f2 e
  9.   Else
    ) u( R0 k! u1 P3 r0 w9 z0 ~
  10.      MsgBox "不存在!"
    , v: v; ^0 T4 ]! s& g
  11.   End If" @( U; }' O1 y
  12. Next Objblock) Q: B+ D' ]# `+ ~" J' E* H

  13. / Z  P1 X1 \# V5 H. P
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码

  1. , s, n& i9 E. A3 {  W8 K) }# _, I
  2. Sub A()
    ) X+ y, X9 H4 p
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean9 \2 {  g& q4 v6 o
  4.     For Each E In ThisDrawing.ModelSpace/ J% l' i# ^) v) X
  5.         If E.ObjectName = "AcDbBlockReference" Then* c' I6 h/ g& M  d+ x/ k$ {
  6.             Set BR = E- H+ Y$ m# P8 p5 \
  7.             If BR.Name = "属性块" Then/ k5 h7 j. i3 n/ B* p$ `
  8.                 B = True( [9 [8 C% [/ S' z( w% V
  9.                 Exit For
    9 q: h1 W: Z) K8 Y+ v0 z8 b
  10.             End If
    $ s; G! h8 `5 R$ a& Z6 `. L
  11.         End If
    1 u4 i0 {0 A7 F
  12.     Next1 [( |+ D+ p- E8 j- z1 W/ V# ]7 W
  13.     If B Then/ o0 v, d' v  |+ J9 S4 G
  14.         MsgBox "存在"' t) V' H9 x# d2 f) [' h& O
  15.     Else- b* ?5 E1 Y/ S( F( z
  16.         MsgBox "不存在"
    2 Y8 R! N! a# Y- @. P4 a
  17.     End If
    / G. A1 x" K3 Z3 ~' W( i: H7 K+ j# v
  18. End Sub
    % B/ F. R6 r  L7 s- g( ^
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".
" r! T& o7 h0 g* ?+ J* \1 U, x8 b上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?* L/ ~. s0 K& v( Y) d$ B
如果是前者,上面的代码就可以了.如果是后者,要用下面的代码

  1. % @: @  l+ [  e
  2. Sub A()1 w+ B& B" y& O; h/ [
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant
    7 b. J2 r1 Y* Y! z7 p
  4.     For Each E In ThisDrawing.ModelSpace
    $ i3 o' J8 N- N% ?0 r% `$ C4 I
  5.         If E.ObjectName = "AcDbBlockReference" Then
    ' _& e# D" u/ d  W* [: a
  6.             Set BR = E$ o2 P  S% z. M4 ^: e5 X. p
  7.             Atts = BR.GetAttributes8 m* Z& `! d/ s6 m. Z3 \
  8.             If UBound(Atts) >= 0 Then
    9 @  R! m# v/ B, r
  9.                 B = True
    $ Z) g- Y- f* M( i
  10.                 Exit For! d4 z6 B8 K$ E# w  u1 c% l
  11.             End If
    ) ], L  ?& E% Z- n! O
  12.         End If7 c5 }. @; s5 Y/ U6 X) `6 o
  13.     Next* r3 B5 o2 z$ t2 b, k& Q
  14.     If B Then
    9 N$ e/ h( |6 t4 m) i+ I
  15.         MsgBox "存在"
    / m" G& T8 y& v, v! C4 x7 c6 X* B& y0 R
  16.     Else
    $ M. D  p( T" G  N( d8 S
  17.         MsgBox "不存在"- n; m: j: B( p# A
  18.     End If8 o2 r! u) `& e% S' S7 E( e% ^' x
  19. End Sub" q. a7 Q' z; Z9 i( h. k9 z
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia   p: c6 G  }' O

' W7 s( r+ l  p) b* ?# b4 c我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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