QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑
" o8 e/ J+ w8 I
, w+ q7 p# e- A! c/ Q5 I各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的& R  `5 l4 i% N/ {$ b
  1. '查找块
    1 T# h  S- B! o
  2. Public Sub FindBlock()
    4 b% _& q2 o4 q" w; d( V, d

  3. 1 \: H* D) z/ v: a
  4. Dim Objblock As AcadBlockReference9 h& j9 X) m" {1 r1 c+ F9 n
  5.   m6 H+ T! M) O% [/ U8 F( r
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配3 D7 s8 @, n7 ^$ g: `7 [3 h
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then
    ( t+ E- C1 R9 L3 x5 E# D) H
  8.      MsgBox "存在!"
    7 Y) c. @0 ]; r& c; @# u  Z9 B
  9.   Else
    / U. i' p! W1 j. s
  10.      MsgBox "不存在!"* f3 L3 I+ B) P' e2 X  `8 S9 |
  11.   End If
    4 j) l! s; ]2 \0 h% l1 q9 Q6 }/ \
  12. Next Objblock
    - A2 o2 T0 `7 `- ?/ Y$ |" j/ J0 r
  13. 4 n0 x6 B# Q& u  r
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码
  1. ( q: _- x9 E+ V" _/ B* `9 v3 L
  2. Sub A()' o( Y+ H8 q- _
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean; }) S* g5 |. a; L/ ^! s. T
  4.     For Each E In ThisDrawing.ModelSpace
    / q0 Z* q8 J0 t" D
  5.         If E.ObjectName = "AcDbBlockReference" Then
    1 Z1 z! l0 a# @
  6.             Set BR = E" L* `/ ~# l9 ~( I
  7.             If BR.Name = "属性块" Then$ B3 |2 T' ^0 n3 L
  8.                 B = True& ^& \( \+ {9 y, h
  9.                 Exit For
    - {% l" }. i! v+ c; Z, M! C# {
  10.             End If* b( Y4 U& }/ @6 z4 P1 A
  11.         End If& n; u: H; p1 h: z5 ~& x
  12.     Next) n" B$ i2 i8 v' G) C) _" ~$ z
  13.     If B Then
    1 g( c1 O2 q7 k) Y7 ]
  14.         MsgBox "存在"
    - _) J$ s7 F% h* Q' A& @
  15.     Else) H, j9 u; z$ m. f6 B3 ]5 x
  16.         MsgBox "不存在"
    9 O  G/ z5 r8 h0 g7 B+ |
  17.     End If- F' H8 E; [( n  w( t, r- ^4 q! b
  18. End Sub
    / \. Q0 x5 D5 A
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".- @! V: o3 W% L& A' _
上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?) l: r# w9 O1 J1 f+ f  B
如果是前者,上面的代码就可以了.如果是后者,要用下面的代码
  1. 1 @' ?' a$ {4 ?0 Q" \% ~
  2. Sub A()
    " N2 w2 R  \7 j" d- V
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant
    ) K5 ?/ Q4 w6 e$ Y3 \& h
  4.     For Each E In ThisDrawing.ModelSpace; i8 F$ X% c5 c- X/ M( |
  5.         If E.ObjectName = "AcDbBlockReference" Then
    # n) X  `( o, x) X& x+ I
  6.             Set BR = E
    - y4 m# T+ Q. d+ Z/ e
  7.             Atts = BR.GetAttributes
    2 {: x. z3 h' A5 j( w' v' m
  8.             If UBound(Atts) >= 0 Then
    ) @2 D( E- B: [* f; @; Z2 i9 Y
  9.                 B = True( z/ b( [: ?2 c( O
  10.                 Exit For& R, R# q5 Q4 Y) ^0 Z0 T, l
  11.             End If
    6 e4 J( w) `6 w7 {4 H+ x8 f' @5 n
  12.         End If
    ' T; r5 a' T) ]+ s  o! A
  13.     Next6 u: j4 {9 _6 I
  14.     If B Then- M8 ^8 E/ f/ H: U- l
  15.         MsgBox "存在"2 ^3 W6 V/ k- c( T5 h1 e
  16.     Else% r) Y) m$ x& S6 G2 ?9 e
  17.         MsgBox "不存在"* p: \2 J! f2 o0 f; k/ w$ D# a2 ^
  18.     End If  t7 p! o% t3 s# m, Z2 o6 J
  19. End Sub2 Y2 `1 n- L! U$ q( Q
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia
9 D- b- [5 Y9 ]) ?/ }! u( R3 p. F& T3 A/ P% }. N7 ?8 ^) y1 G
我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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