QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑
: a9 [8 B/ B3 k9 Q1 S+ V
: }) r7 g5 I- w; _2 \- Q8 p各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的- s3 ?3 P+ M; T4 B$ t; u
  1. '查找块
    ) Y  J7 t; w# D/ f, ~) t
  2. Public Sub FindBlock()
    7 U4 X8 z2 R" m6 |
  3. 8 i$ V1 G/ [- _- B
  4. Dim Objblock As AcadBlockReference
    4 [# u$ Z% S$ f" k) f" ~4 z% g) }( ^
  5. 2 s, D; \7 [$ D1 V& r
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配1 d: H' X  y' G
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then' y2 E# `0 |1 ]7 p
  8.      MsgBox "存在!"
    # |4 C2 ?$ u) ^! A8 d& c1 `( i/ h3 G
  9.   Else( b: }# B2 _, n' K1 E5 X3 J
  10.      MsgBox "不存在!"
    1 R" R& C3 H& X9 p  B" C
  11.   End If
    / C7 s9 P# D) z4 b: J6 [
  12. Next Objblock! u: C- M- w& E, {1 T/ l3 R

  13. 8 e% _5 x) R' ^* G; m
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码
  1. 8 |: w# J9 g  q2 u' f
  2. Sub A()% T, H0 Y8 S0 ], |9 |4 z
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean% |0 B+ I8 ^4 c5 Q6 {
  4.     For Each E In ThisDrawing.ModelSpace% d/ S1 Z7 v, T# j
  5.         If E.ObjectName = "AcDbBlockReference" Then
    : F8 i+ o& }& a3 W
  6.             Set BR = E
    ( h* \0 t& Q8 x- W  d
  7.             If BR.Name = "属性块" Then5 S- u  `5 h7 n  X0 t6 {
  8.                 B = True$ _; C9 A1 L1 G
  9.                 Exit For
    5 T: Y9 i, U% t7 q4 O4 d
  10.             End If3 d% c% C% z5 K, X% F
  11.         End If& c& J  l! _- D5 F
  12.     Next
    8 ]/ ?2 ?. `7 V$ \
  13.     If B Then
    - q1 |1 l9 T) {# m) O
  14.         MsgBox "存在"
    ( S# ~) Z. s' ^( T$ @/ c
  15.     Else
    - w: V3 }$ s+ c: Y, n$ r4 ~7 |7 }
  16.         MsgBox "不存在"
    2 u2 g1 B9 F, y
  17.     End If
    8 j' y, W% N1 a0 N, m. T; U. _
  18. End Sub' B2 @3 u. q; h9 g
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".1 @2 h; c0 L" s8 \8 c" ^
上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?( w! u+ t: x+ C
如果是前者,上面的代码就可以了.如果是后者,要用下面的代码

  1. . @1 o) Q2 E: `6 \! J3 y8 C1 ?
  2. Sub A()
    ' q7 z! l9 w& Z2 f. f1 J
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant
    2 H2 v/ O: l& r% {3 q6 }% Y
  4.     For Each E In ThisDrawing.ModelSpace
    $ Z& d, z, a& F. }8 |. E# g
  5.         If E.ObjectName = "AcDbBlockReference" Then
      F( J4 \2 e, @" t" E& u4 M8 v. a
  6.             Set BR = E; I! ?$ f. {: r9 V! Z* [
  7.             Atts = BR.GetAttributes
    , K3 T9 j. K/ ]% b  w6 Q+ M3 |
  8.             If UBound(Atts) >= 0 Then8 u9 W  a' M; g) t2 V* [& X
  9.                 B = True2 z- ^, u8 n3 q. _0 G; t- g
  10.                 Exit For; R7 m; T/ O; C
  11.             End If- F. D& X' @4 w3 ^% D
  12.         End If
    1 F; z, E# }# V
  13.     Next
    8 P/ a' P7 [9 ?) E1 ]1 t% {# n
  14.     If B Then( p. `' f: R. s1 U9 E  H
  15.         MsgBox "存在", C' ~6 H) c8 v; d. d6 K* `
  16.     Else1 ?+ ^9 d8 V0 u8 b1 u1 D& f
  17.         MsgBox "不存在"
    : |& p- X* |2 Z& B
  18.     End If
    / g: E3 d5 M' N! D
  19. End Sub5 t# h9 Z& x0 o, p
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia " \" R' Q0 j9 L$ Y$ w" D$ _0 q

  j7 J; _* I/ R. e/ {# S  B我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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