QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑 8 h1 G4 n, t& w( o& ?: ^+ z
1 L4 Q& t" C- Q; ?
各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的. P- e( ?$ `1 ]; B
  1. '查找块" q. C  X, ^+ M9 X8 f6 ^$ {" i! c
  2. Public Sub FindBlock()6 g; ^, j4 F+ ?4 F  g

  3. $ w; g2 G: w9 L: Q8 R. `
  4. Dim Objblock As AcadBlockReference# q- S# Z: R6 Z/ S% K

  5. ( `; s" R0 W% d: J
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配
    ) P  |/ U  t& q/ N
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then
    ) n0 [% Q/ V( ]8 _6 x
  8.      MsgBox "存在!"
    6 \5 E0 S5 ~$ ]2 }0 K
  9.   Else/ }( Y/ S$ _  W% K: I2 l( R
  10.      MsgBox "不存在!"
    1 b* f/ J% ?! i$ O$ b/ q* d+ L
  11.   End If" c4 f' N4 \( G7 B# _' f
  12. Next Objblock) n( R. u5 U. S# ^' {
  13. & X3 N: G* r/ k; j# D8 {
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码

  1. 0 X3 B0 O, F  [$ l1 C  H. i
  2. Sub A()
    1 n- U- u+ J; t; P/ y
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean3 p. T4 }; _# }5 a' g  h+ ^
  4.     For Each E In ThisDrawing.ModelSpace
    7 V3 J- ]! j- d' B- d
  5.         If E.ObjectName = "AcDbBlockReference" Then
    4 X0 N( i: W6 C. e1 M$ W. n( f
  6.             Set BR = E/ x& I3 c7 W. `
  7.             If BR.Name = "属性块" Then
    * _0 V- I- K) g3 I& [$ u, n8 c
  8.                 B = True
    5 u9 h* s1 k# W8 ]; O9 E
  9.                 Exit For  f: }' q' [; K3 F* e7 E! X
  10.             End If
    ; Z$ j1 M. h0 a8 W/ P
  11.         End If+ d+ m3 U* A9 K) k
  12.     Next
    8 K# Y; Z2 g; L, x' J; }) i
  13.     If B Then
    , g% i" W. Q+ x. k& @: D$ D
  14.         MsgBox "存在"" L: t; M% v+ B0 T0 c  J
  15.     Else- q  I9 n; u% \' j5 l; p* m: M
  16.         MsgBox "不存在", H+ m$ u  q3 X! X; b, G# d% Z8 E
  17.     End If+ O5 y* c& a* |' ~1 \9 N5 ~4 A
  18. End Sub
    - g! k. P8 m& I8 X
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".
% P( `& `& I8 N* ]上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?
: n' O5 K& b3 w8 a6 G4 g- o如果是前者,上面的代码就可以了.如果是后者,要用下面的代码

  1. 0 y3 i" O, T3 p* G
  2. Sub A()
    - c4 R4 i" J! j8 e9 W2 t) R
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant/ Y( s9 e7 E) v5 p3 K4 I
  4.     For Each E In ThisDrawing.ModelSpace
    / Z3 D+ W% f2 }. m
  5.         If E.ObjectName = "AcDbBlockReference" Then
    5 ~! S  L# v: N* N
  6.             Set BR = E
    8 w2 M" y  `1 d* E5 x5 O
  7.             Atts = BR.GetAttributes, r, c" T3 g. M/ ^4 O$ H$ y
  8.             If UBound(Atts) >= 0 Then7 K/ D$ ^# t0 D) H9 j! f8 a
  9.                 B = True
    & _6 _/ A6 j6 K7 J' K
  10.                 Exit For
    1 V! y, T" P' d4 Y
  11.             End If: A% B! c3 c0 k8 I3 L2 L
  12.         End If
    5 n# D  w8 o' k! Q
  13.     Next
    " N+ ^5 d, w6 J
  14.     If B Then
    ' c( j/ t- y& A4 |
  15.         MsgBox "存在". @" N2 X7 v9 t1 d& H5 ]' P/ P- r
  16.     Else
    7 H- q4 }+ S( m( g( }
  17.         MsgBox "不存在"
    ; S. x# ^# r( t, K5 b
  18.     End If, x7 p0 H7 C" l+ u3 \; c# l0 h+ W6 @7 o
  19. End Sub9 `- z4 g7 x. d, L; A$ W' b
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia
8 q- N9 v; x2 w
9 p+ }! J; P" L5 Z- s) B我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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