QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
6天前
查看: 3400|回复: 3
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑
0 V, Y3 B. h, z% L; I& z  u. \/ A) W3 x, o- _2 o7 q
各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的
* s1 ^. r' j" W
  1. '查找块
    " H2 d5 L1 i. M4 A1 N
  2. Public Sub FindBlock()
    4 [9 E- o0 G9 p. z" |$ m/ p5 \; s7 B
  3. % M. a5 I! R* x2 h
  4. Dim Objblock As AcadBlockReference. `+ Z# W- H$ H# k% u& @( w% l! e

  5. ' @4 C5 ~+ s7 ^1 |7 ~
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配. O  l( A6 Q9 i& p$ @
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then/ X# t1 f% Q1 X& t: r( D: V5 x
  8.      MsgBox "存在!"
    8 r* U3 j1 @  @! H% w! H$ r
  9.   Else
    * [) H$ ~# T5 U' ^5 G3 h
  10.      MsgBox "不存在!"
    ( _7 B  y( R; C9 N% ]8 @* v" ~# y: B  ?
  11.   End If. f1 C8 V+ m# r* H
  12. Next Objblock, ?0 L% x7 q2 Z" N
  13. ) e% r6 D2 {  R8 g& z3 C+ y  K
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码
  1. $ W1 k2 n! e" t9 V
  2. Sub A()  ?# P& G" R: Y: W* c) l0 Q
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean
    / E- e  Y1 f) a7 z* U
  4.     For Each E In ThisDrawing.ModelSpace  l% K! l* R2 ~) y4 d
  5.         If E.ObjectName = "AcDbBlockReference" Then. I% @! \- Z6 z  r8 G
  6.             Set BR = E, n* s; ?4 ~: X+ q2 G9 H, K7 A) G
  7.             If BR.Name = "属性块" Then8 {( s' z9 J$ I+ n4 i. [
  8.                 B = True7 K! e! o6 k  Q: b3 x4 J) h7 @
  9.                 Exit For6 B  {$ o0 j+ u' X; G; G1 l
  10.             End If
    & y: E1 |% M$ Q$ a% L9 T* `
  11.         End If
    + V0 M$ \! V  w6 F# ~
  12.     Next1 @1 j5 D1 D$ }
  13.     If B Then
    ' d! D' J7 V- X+ Z0 h. r3 A2 f
  14.         MsgBox "存在"
    - e, T( `/ O1 O+ w2 A& a
  15.     Else
    & }- C' F" |/ v( c( P) ~
  16.         MsgBox "不存在"
    9 W7 ?8 B! E4 ?& C1 d* ~9 M
  17.     End If+ b/ V' M$ f( I! u' |
  18. End Sub3 ~7 V$ M6 i6 E0 A9 }
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".
: m: L* K$ W) Q3 A. k& c: ?上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?7 C  ]' a& k' d3 Z
如果是前者,上面的代码就可以了.如果是后者,要用下面的代码

  1. $ R* [$ T0 P* j% f1 e' i  \4 e
  2. Sub A()6 l" T; ?8 F, Z6 m0 S3 }, V
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant
    2 k; e  ^# {3 e- V" K
  4.     For Each E In ThisDrawing.ModelSpace
    # ^5 t2 A! M1 n9 P  l2 a2 B
  5.         If E.ObjectName = "AcDbBlockReference" Then9 e0 N5 n0 y7 n) y8 a8 Z
  6.             Set BR = E7 k0 `4 |/ b" S1 x
  7.             Atts = BR.GetAttributes
    8 \4 A5 {1 S( o7 |$ Y- l5 M
  8.             If UBound(Atts) >= 0 Then
    ( f  q% r: j1 Z2 |0 _: s- |' z& [
  9.                 B = True4 b; A4 M$ w8 X* M$ O$ L
  10.                 Exit For
    ! ~; |% k" f4 l8 ^9 e) w
  11.             End If
    , y% F, e5 f" f  h
  12.         End If( _5 i  I6 x7 [, p) f
  13.     Next7 w4 U# P8 @* N2 i9 n
  14.     If B Then
    8 }* l4 K- {3 N
  15.         MsgBox "存在"
    : @2 c. o9 _  h/ L, W7 K- W
  16.     Else
    , s, Z5 y: ~+ J9 a. H6 v  i
  17.         MsgBox "不存在"
    ( b0 j: G3 R% ]6 d
  18.     End If
    5 W$ t: {. F) g7 f8 b
  19. End Sub% B/ R1 o" O* a4 X2 g9 S
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia
. p6 ~; b( B& |& L6 ]1 H, Q( L7 V6 h- ?, _, S0 d5 j( K
我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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