QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑
5 v3 [  E2 s# a2 V/ H+ P( ]/ _9 t  l$ ?$ H, O2 {+ q
各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的" G7 _8 x8 w( V# l( k* v
  1. '查找块) P, M4 B, A8 p. K  G$ }/ o9 O
  2. Public Sub FindBlock()
    8 u- \* U: B4 [6 R2 ~( w' N
  3. ; j6 B7 Z! G5 y% W8 l: r3 }/ W
  4. Dim Objblock As AcadBlockReference  O) j' n( p' g, p+ ~

  5.   ?; U6 g4 j4 G% {7 x- x
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配
    9 ~9 u  O+ i& I
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then- n; I# v) g/ b( c; W) {
  8.      MsgBox "存在!"5 G, {! O; ?# T" n! \& P
  9.   Else+ F2 A" ?% p7 k) Y
  10.      MsgBox "不存在!"% B% {2 _7 R' ?8 D
  11.   End If) `" Q8 [' Z. i7 }. W
  12. Next Objblock
    9 V) |6 s8 o  B" R5 b% ^+ X& p+ y

  13. 0 ~$ a% \4 T7 a3 |. U# O; {
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码
  1. 8 h* s$ T5 K) M- @2 o
  2. Sub A()( a/ ~+ D% y/ V" x5 x5 i6 i
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean
    & h6 s1 I& d5 r) N% e& N$ Z5 b) L8 \0 K
  4.     For Each E In ThisDrawing.ModelSpace
    8 Q8 [; c; Y. ?6 o7 u: |1 d/ B3 m
  5.         If E.ObjectName = "AcDbBlockReference" Then+ h* o( Y. l( i5 u
  6.             Set BR = E% o) Z! v$ L3 U  a' D
  7.             If BR.Name = "属性块" Then" A' J" s4 f4 o6 L
  8.                 B = True
    9 k+ B" Y; S  }6 Y% \$ m* H
  9.                 Exit For
    ' C" z: I9 d2 H$ g6 Y$ W
  10.             End If# i- U! y1 n2 f6 t) i
  11.         End If
    . U: x3 S! a1 P# B+ K' W
  12.     Next
    ; g4 U! W! g- Q/ {: O
  13.     If B Then
    8 }  s" v1 ^% p- }' m  ~2 G
  14.         MsgBox "存在"6 H) t' F: V% ?2 `
  15.     Else
    * Q. z8 |1 |5 }( a: v
  16.         MsgBox "不存在"4 \# @5 C; j& ^; i. n
  17.     End If7 Q  d& n3 B* E: g0 D4 T
  18. End Sub( _; ?1 S, H  I. \6 R5 ]
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".# \* H4 \: r& t
上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?
* p9 {" H3 w8 g1 e$ v如果是前者,上面的代码就可以了.如果是后者,要用下面的代码
  1. # X5 M  k6 I9 C/ p1 l) u2 G  T+ [
  2. Sub A()
    9 `' ]" M* W1 H9 O& P4 S3 T$ n
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant
    5 p2 f9 M5 ^3 C4 ?" s
  4.     For Each E In ThisDrawing.ModelSpace' _, Y. D- I7 I- M
  5.         If E.ObjectName = "AcDbBlockReference" Then
    7 J3 g9 y; W( X( a5 n
  6.             Set BR = E
    , o; l( n$ e+ E% E5 B
  7.             Atts = BR.GetAttributes" A; O6 O& F( i
  8.             If UBound(Atts) >= 0 Then
    0 q) j" L0 `* q! ^
  9.                 B = True; E0 J1 L* t7 {2 R# |7 C2 q
  10.                 Exit For
    0 U+ d& I- t+ z! q; ?5 O  m8 f
  11.             End If& P- N2 N# t2 b2 C) u2 E
  12.         End If; {7 X0 U" l3 q' G% o* ~4 r9 n% k) C8 p
  13.     Next2 m( |) C" T, v) |3 X  L& i9 P4 M
  14.     If B Then
    6 T. y0 p6 V- }, q  g
  15.         MsgBox "存在"+ ?, X9 K4 \6 g- Q7 R
  16.     Else, z7 l; j& ?2 h5 N: ?* Z
  17.         MsgBox "不存在"
    # ^6 J1 }% `4 l5 ^
  18.     End If( X2 B5 C4 l4 N. r( Y+ L
  19. End Sub2 t. e+ @, e$ j) {- `( R& Z5 d
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia
: O5 U' }2 R( s, E5 l
; r, u' Y7 l% n  {我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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