QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑
4 @" O1 v6 j5 d* S7 O9 V3 K6 D6 {/ T+ ^1 z
各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的
8 X8 z3 E8 _3 Y
  1. '查找块( w; i7 Z9 L" L( R/ i+ ^. w' @
  2. Public Sub FindBlock()* W* L1 P. a, o2 h3 O; U$ H
  3. 5 O" T& n) t! o# q* ?* w' c
  4. Dim Objblock As AcadBlockReference+ c# ?- s# {5 Q6 F
  5.   v* |9 m6 C) y
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配
    ; O$ R; h& {) p5 Q1 ~
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then
    : `% Z, y% k, _" @
  8.      MsgBox "存在!"8 q& a- j9 E3 Q( l
  9.   Else
    / k; h. l" a$ A) D; c
  10.      MsgBox "不存在!"3 f8 f: Z* K5 p- \$ `/ x
  11.   End If
    2 L0 `' R( W1 |/ M
  12. Next Objblock
    ) o2 X+ V9 Q. K' |* k8 M2 w
  13. * Z* I9 s1 |' H5 c
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码
  1. & ?0 G6 W) L# P6 d9 m* {
  2. Sub A(): b# ], ^5 Y" r/ K5 ^' q" X
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean
    ; a' L3 _/ r3 C  ^& k2 d
  4.     For Each E In ThisDrawing.ModelSpace8 P& a9 x6 y9 A: s: j$ j' I
  5.         If E.ObjectName = "AcDbBlockReference" Then& x  ?9 s* s' \0 H& ~
  6.             Set BR = E
    7 @( Z. _' Q1 a( I3 Y0 B) B" Q, s' }
  7.             If BR.Name = "属性块" Then) f6 i8 m6 A! F0 k: k
  8.                 B = True
    2 t0 S  {1 N  u2 u! W' B8 F
  9.                 Exit For
    1 f( _$ a& C" V/ g% E! k7 |
  10.             End If, c. b$ l/ P  @" `2 K3 [5 P& I5 Z
  11.         End If2 M( B6 d/ u2 \0 D( @. }- k& P
  12.     Next
    $ C3 y3 U" C$ k$ l* p4 w' H
  13.     If B Then: Q8 S' j/ m5 G2 e0 U8 }
  14.         MsgBox "存在"1 W1 l7 _; j& q' h( ]. ~
  15.     Else
    1 W$ O$ g( w- A5 X5 d3 I
  16.         MsgBox "不存在"
    , [5 `1 g% k+ a) B9 m; O
  17.     End If
    0 u( M7 S* G: S6 Q
  18. End Sub8 m" K2 Q3 T- T" ?' {% i, _, K
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".4 t4 Y3 ]5 |4 V. v/ X4 H! [9 e) l) c
上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?9 E# I1 k+ X2 y/ D0 X% |: _2 D" E; |* x
如果是前者,上面的代码就可以了.如果是后者,要用下面的代码

  1. 0 V. u2 }2 t& V6 o
  2. Sub A()
    , S5 a" o/ M+ |$ j
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant
    % a; t; P# D) T- N2 c# Y
  4.     For Each E In ThisDrawing.ModelSpace4 M% f' D; D0 T8 \
  5.         If E.ObjectName = "AcDbBlockReference" Then
    # x- K$ ?# A/ d, D4 i
  6.             Set BR = E
    2 w, K. G- s; q. B, l' ^; m
  7.             Atts = BR.GetAttributes: y0 z) |- x1 A) b& r1 j
  8.             If UBound(Atts) >= 0 Then
    ( u# h' T' B% i! E. O, E! i9 ]/ T% Y' ?
  9.                 B = True1 S: U) B5 [. Z7 W
  10.                 Exit For& n0 O% s4 u  H; O' T. ]+ `
  11.             End If& s6 I3 o8 Z, }4 @
  12.         End If
    $ {1 j# S4 t% l2 u1 z9 I
  13.     Next+ W2 O. T) R8 i  c4 k
  14.     If B Then
    3 d2 M1 F  H, E
  15.         MsgBox "存在"* X. t: W7 m8 e/ J  p2 e2 _3 Z% `
  16.     Else: A" \4 `5 R( p, f) |2 ?1 d
  17.         MsgBox "不存在"
    & B% @0 T. o( B" B$ b  L8 Y
  18.     End If7 ]( _! i$ B; x- X/ s
  19. End Sub7 ?* e1 ?+ G& k
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia . N! _" s; {# i' q* B6 G) ~6 z- f
' s9 G. [; {# ^: I" N2 N* P: O
我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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