QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
查看: 3402|回复: 3
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑
  ^7 X2 H" t4 k) `
- a5 Y" J7 ^6 [, f( q6 c( t各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的* X6 l/ b7 G& z/ _0 \0 U/ {& }
  1. '查找块
    8 w8 K  K' S, P
  2. Public Sub FindBlock()
    - x" |* X4 W( U0 P$ e, N
  3. " B: ?+ v1 X* L
  4. Dim Objblock As AcadBlockReference
    4 d4 d* `* f$ f7 B5 e
  5. ( _* }1 S: D% ^4 D, f' c! `
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配- w/ C* }8 k4 A) V& {
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then
    3 |2 T! z8 {1 F2 b, P: n
  8.      MsgBox "存在!"
    - a# D6 T9 e  {1 @$ l$ I% f$ ^# W
  9.   Else( K& w+ B+ l- B; H5 J
  10.      MsgBox "不存在!"* z& Y) C" G" m8 u" ]. {
  11.   End If8 q7 g* E3 w0 ^$ U- W8 x% `7 O
  12. Next Objblock
    - X, B6 c6 [" o& ?3 D
  13. " U) C3 c7 L& o6 l9 F
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码
  1. 6 j2 M7 A6 T: f3 P% U/ J- K% }8 f
  2. Sub A()
    5 }' K; q, }7 Q) F( }2 E
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean
    ! d/ ?% P0 X! w! i3 `
  4.     For Each E In ThisDrawing.ModelSpace
    2 k( g$ O% F0 s
  5.         If E.ObjectName = "AcDbBlockReference" Then
    5 n7 V: D" o7 Q0 t2 z+ ^7 S
  6.             Set BR = E: h7 R: E- d( W
  7.             If BR.Name = "属性块" Then$ P6 P# T, Y) R! q- W
  8.                 B = True
    4 K5 ~. ]4 g1 z! h, }! A0 P9 V" }
  9.                 Exit For4 z/ ?+ l7 c) W8 Q' y0 c5 b
  10.             End If& o" x9 M9 ?; |
  11.         End If0 q3 R* `/ F& q, w. Q: H
  12.     Next* S* {7 K0 @& S9 v! z$ q
  13.     If B Then, e2 G: J* M" U# o( R' a; @+ w9 f1 y
  14.         MsgBox "存在"
    ( \+ f6 H# }( P% Y
  15.     Else
    5 [1 n2 `' d! o4 j' R9 H
  16.         MsgBox "不存在"
      L: i+ h6 _7 f( x9 Y. ?
  17.     End If
    " S. h$ d& m: L( ?
  18. End Sub; i. ?2 Y" @6 w
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".
& K* q! {8 g2 N% J0 k* a上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?. Q5 i. {& ]! {: Z% w, }& Z
如果是前者,上面的代码就可以了.如果是后者,要用下面的代码
  1. / x; _' {' _$ v( T( K
  2. Sub A()
    5 U4 L' ]9 n0 @0 [5 @
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant
    $ F( i# T  A4 @' @$ \8 J/ g
  4.     For Each E In ThisDrawing.ModelSpace
    8 R( K6 X7 P. L, h# x6 `7 @$ q
  5.         If E.ObjectName = "AcDbBlockReference" Then
    1 V& B! V5 m; ~: U5 ~
  6.             Set BR = E" B& M8 u8 k! [  _
  7.             Atts = BR.GetAttributes! Q1 a7 Z8 O$ h4 U1 i& s
  8.             If UBound(Atts) >= 0 Then
    2 {$ X; ]' L9 b
  9.                 B = True
    ) o8 \8 ^; X; N. M- y+ Z, t
  10.                 Exit For
      o, J* j/ b- K8 s; f
  11.             End If. x2 j7 o- v4 W/ K  ~1 N6 q
  12.         End If$ H8 H$ W4 s( `6 a
  13.     Next
    4 z9 h" Y7 e1 d; ~9 N
  14.     If B Then
    7 @& ?( \  `6 @" H% O5 O: ^$ Y0 f
  15.         MsgBox "存在"
    & |8 i% |/ z. B) P$ q$ O! n; L
  16.     Else# `/ \$ i  L2 n
  17.         MsgBox "不存在": c! o1 V# R2 C1 {9 D# X
  18.     End If9 C0 p! d8 d& S: l6 A- A7 o
  19. End Sub
    + ^6 N9 Z* g8 s; g
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia 9 a; r# L1 c2 F9 s4 z3 @$ d
8 E' x: v& U( c; w& e4 M* {
我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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