QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
5天前
查看: 3337|回复: 3
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑
5 B/ U  s0 t4 c# T
; |. w7 \7 U- s: {各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的, Z: H# F. T/ o3 m. y3 B9 ?3 o
  1. '查找块- e$ h% k/ f7 D0 }( t( P
  2. Public Sub FindBlock()! m& C  D  j7 e3 K) S

  3. 3 L, H! K1 W8 f& T: M, X# M6 N& ^+ e
  4. Dim Objblock As AcadBlockReference- L3 ^( u! }( n" U7 P

  5. : z: L# \/ u* Q2 e/ M; x
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配
      z+ w# y% ]) i: C$ R
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then/ Z! Z. v% L  Q; Q* }3 m) J! [! l3 l
  8.      MsgBox "存在!"5 r( g) p5 N- N2 I9 o: v- j4 m
  9.   Else
    ' a: Z, t. h' K0 k$ B3 k3 t
  10.      MsgBox "不存在!"- u+ |9 A( d5 E4 C: ], m
  11.   End If, }1 X2 Q' G( b7 c4 @$ E, @
  12. Next Objblock0 ]5 c4 i; P& q

  13. ) O! {& l( k- P3 C
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码
  1. 6 n4 i- A1 q9 _7 P
  2. Sub A()
    4 U3 ]/ M, b5 O+ v
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean
    7 f' O" [: y9 ^- U0 K3 C0 R2 A& J& p
  4.     For Each E In ThisDrawing.ModelSpace
    7 N. i# W, P# |5 R
  5.         If E.ObjectName = "AcDbBlockReference" Then% C& Q4 e% Z- T6 D: e: M
  6.             Set BR = E
    0 @9 ?' R+ @8 E- i) P5 H3 Q5 Z9 Q
  7.             If BR.Name = "属性块" Then7 Q, P5 E9 F; n( N: C. E
  8.                 B = True) o  ?9 a/ l/ _" N
  9.                 Exit For
    3 K- E% p9 y( `
  10.             End If5 {+ t. v! B  |; m0 u! |% i1 y
  11.         End If- y2 F- J4 M" |" I
  12.     Next0 [2 o$ w( U2 K% }6 y
  13.     If B Then
    % o9 b& F, s. e( S+ x; k. x
  14.         MsgBox "存在"! Q. m# y5 h9 c- F+ i3 Y9 {0 G5 G
  15.     Else( w5 K1 S; |2 x7 m1 |$ D+ {. U
  16.         MsgBox "不存在"! _# i/ U" t" s, i6 D
  17.     End If. o3 P, h; [9 g, V
  18. End Sub
    4 \# ?# t6 I1 i8 R( A) m
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".1 B7 T- I& ]$ s* e7 ^
上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?/ _. y- ?" t" ^" h! o$ P
如果是前者,上面的代码就可以了.如果是后者,要用下面的代码

  1. : ?. j' b- M$ B7 r
  2. Sub A()% m3 i* H' K; ~$ W# f
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant' W) L- O7 F+ ?) p
  4.     For Each E In ThisDrawing.ModelSpace+ g6 N9 Q- U. ~$ H. B( T' ^1 e; [
  5.         If E.ObjectName = "AcDbBlockReference" Then1 r/ `$ K- G6 D3 M: H
  6.             Set BR = E
    ) }7 v8 V. L! P: Z/ e: n
  7.             Atts = BR.GetAttributes
    4 _: a/ ^/ g! B# p
  8.             If UBound(Atts) >= 0 Then
    5 m! P$ r$ u4 g/ U9 Q' I+ G
  9.                 B = True  N, z- J; F: l; [1 r
  10.                 Exit For
    ' B: n5 c" [/ J/ }% U
  11.             End If
    0 ~1 u7 h$ I7 x+ I5 j! }% ?' Y
  12.         End If
    + w0 k9 |1 g* s: q
  13.     Next8 w: {9 ^1 w! L5 L. m
  14.     If B Then
    - i" `& q1 g5 ?
  15.         MsgBox "存在"
    % r, ^, ?, a/ ]$ y' Q, u# m( H
  16.     Else" H& H. }6 e% G  u- {
  17.         MsgBox "不存在"% |( w2 V* {3 l, z$ \+ D
  18.     End If% F( W; ~: g$ c2 _
  19. End Sub
    / q3 h/ R  U7 x  H( l1 o7 X4 J: [
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia
5 q, ?1 o, Y/ B5 F- F0 W  l, ?: i. S# r) a. f% p
我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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