QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑 ' P/ b. t3 I/ ~% e" j) l; m

& U* q9 Q" \* E" ~- W  l各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的
+ O! W( F; e0 b$ H1 `9 \
  1. '查找块
    8 L0 i; e2 }+ m9 `/ `; m
  2. Public Sub FindBlock()
    2 r0 A7 x+ J/ l( v" l) q

  3. ) H( J3 E, l7 s8 ~4 p6 w
  4. Dim Objblock As AcadBlockReference& Z1 Q/ Y: {  |+ m  _7 `: a* ]
  5. + r  f6 N, N8 [, [
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配& P( V/ Z- r! |
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then, {6 S' Q) O, Q3 Q5 m( t7 E, q; j# E
  8.      MsgBox "存在!"
    4 w6 L6 t3 k$ b. p* D. R$ A8 d
  9.   Else
    " o; D$ W5 q# p0 l% W; N# X
  10.      MsgBox "不存在!"
    4 v- _0 W  o, f( G" _1 I
  11.   End If# n' @5 D& p) m; B
  12. Next Objblock
    7 ~! L  ^- L8 M, b# X: W
  13.   U, e* g! G: s9 S
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码

  1. 2 k" N  \3 w# u+ u
  2. Sub A()
    1 _  R' Q& I0 S  u: G% Z
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean/ R0 }; Y* }1 i% K2 w+ {
  4.     For Each E In ThisDrawing.ModelSpace
    . i. G- o6 I5 O* {; Z% a* e
  5.         If E.ObjectName = "AcDbBlockReference" Then
    / R1 U  i' I4 {
  6.             Set BR = E
    , F( A* l/ {$ S! `
  7.             If BR.Name = "属性块" Then
    7 H. n$ \9 n# @
  8.                 B = True
    6 r0 ^- ^4 @" R/ M3 g2 x
  9.                 Exit For- m" X9 l" A4 M9 `4 ]
  10.             End If3 S' U6 \4 S- Z
  11.         End If
    9 B1 ?$ s' u1 `
  12.     Next. ~3 _- R* b( l% g
  13.     If B Then2 P( Z8 M# l2 q: \, r
  14.         MsgBox "存在"6 ~7 _' e# Y- z
  15.     Else8 o- v% Q1 ~/ Y2 z2 @# i
  16.         MsgBox "不存在"* {7 \! d- M2 `7 ?, U  o
  17.     End If
    ( ?8 I" w+ _& Q
  18. End Sub% X: ]2 {  E; R* l) R8 s
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".
- n1 }. ^+ Y/ U6 g8 J上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?  C- }) {/ A* C* I; o! n
如果是前者,上面的代码就可以了.如果是后者,要用下面的代码

  1. % _2 ?# Z( c$ d5 m
  2. Sub A()
    0 U4 c) V; [/ G
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant
    " ^' K' Y; Y' A
  4.     For Each E In ThisDrawing.ModelSpace; x4 u# N8 ^9 M+ T! i6 w! ^
  5.         If E.ObjectName = "AcDbBlockReference" Then
    * a! \: y7 ^& t' W  g
  6.             Set BR = E( ]1 t' E. S; u; s8 n" ~8 d. A
  7.             Atts = BR.GetAttributes' Z; I3 [2 ~# y8 [% B9 J
  8.             If UBound(Atts) >= 0 Then8 K: Q9 j- _% X' ?/ G) H* ?1 V
  9.                 B = True+ g7 t8 i# u- d6 o. F! O
  10.                 Exit For
    . R1 |& v( k! g) Q8 }6 s
  11.             End If$ ]8 R/ F6 O) a  ~# `; B
  12.         End If/ p4 |5 g2 _/ I) R; p  `9 J. o, {
  13.     Next+ a9 G$ l7 I7 d5 w
  14.     If B Then& w/ s' A+ `/ A# N9 C2 o
  15.         MsgBox "存在") D' r, h4 Z  g, c/ z/ \& I* B
  16.     Else
    , z0 ]3 }/ T0 C, j
  17.         MsgBox "不存在"
    3 O2 i$ z, t: ?" E% g/ e' [
  18.     End If
    ! o9 D& t* c8 k- F
  19. End Sub9 P* p9 s  U9 A4 ~1 h" z. f
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia , _+ P' q: E0 M9 U1 K' X
# f3 w- F3 F* q+ o+ Y' K; o
我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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