QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑   E/ V' H5 \# H% [; g
5 N) s6 a) }: e8 U" K, U
各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的, ?0 K) a: K" i' m1 Q  e2 p
  1. '查找块
    7 Y, u5 D6 L/ f: f- H) o
  2. Public Sub FindBlock()
    $ K, W" {7 v/ s

  3. # ?2 M0 g) |4 [9 g) V3 C2 K* k
  4. Dim Objblock As AcadBlockReference
    * p( g7 Z. f6 L* k

  5. ; e  t) D' I$ F* a" L
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配& k4 y+ l# H! J8 y% O8 \4 y& d
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then
    8 p! M7 W1 ?) _% ^' c- m
  8.      MsgBox "存在!"
    9 Z  C) M0 D# s# s
  9.   Else5 A( v4 w- y) g- m
  10.      MsgBox "不存在!"
    * a1 T8 X; s4 ~9 T# X& H
  11.   End If
    3 s6 t+ v: `7 e4 Z2 M
  12. Next Objblock) j' K: q4 [# L0 V
  13. ( k# u# J5 e. T5 M/ w
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码
  1. + q: g3 x( t% F+ [
  2. Sub A()  a* d0 g* P2 R, O/ Y0 ~( o6 ?
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean
    3 p4 h1 _5 o" L: \6 T/ i, o1 a" A
  4.     For Each E In ThisDrawing.ModelSpace- T2 g7 u7 U) X& @
  5.         If E.ObjectName = "AcDbBlockReference" Then; M0 P: G+ b5 V) c3 `! x7 H0 L
  6.             Set BR = E9 b: H! M# {' B8 o* M$ E7 ?' N# m  X
  7.             If BR.Name = "属性块" Then
    4 H, ~: P0 U. a* y: @
  8.                 B = True
    ( P9 j/ f/ v, w/ Z
  9.                 Exit For3 p1 Y# n& c* e6 D
  10.             End If
    2 `/ v5 [# T% T% Y' a+ W7 t
  11.         End If9 k  s) ^& {& v/ f
  12.     Next* \! N  T! o% W0 a
  13.     If B Then
    ) ~+ A/ q; h1 r4 |' G8 t
  14.         MsgBox "存在"1 \; N5 n5 {& J3 x
  15.     Else* @- `& X- k( q* _: C5 i
  16.         MsgBox "不存在"
    4 }! e! W$ |' G/ O$ V) C% s
  17.     End If" y0 n8 g6 s/ N+ o5 F8 E6 n, ^
  18. End Sub
    6 W. a; F& K8 |
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".
( P8 K, v( ]% {! @. A% [( h# |* q上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?) F% z) z0 i( m+ b8 @& x
如果是前者,上面的代码就可以了.如果是后者,要用下面的代码

  1. % L* {7 Y* v0 o
  2. Sub A()
    7 `% T! d$ z- i7 B
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant  t3 o! C& ^9 x% D. t& o# {
  4.     For Each E In ThisDrawing.ModelSpace7 x' g/ q" m5 a0 }: F
  5.         If E.ObjectName = "AcDbBlockReference" Then# d8 K0 h- F2 l9 ^  P: s
  6.             Set BR = E
    . X9 r0 ^- A/ @) {, w1 n
  7.             Atts = BR.GetAttributes
      H% X; d/ n/ L) [
  8.             If UBound(Atts) >= 0 Then" ^; z& s  J3 \  R' e
  9.                 B = True
    7 v: b3 B- [& e- S' q+ M# q
  10.                 Exit For& v+ K0 J# y4 R
  11.             End If0 O0 d- y  q" s. o
  12.         End If7 ?# K4 K+ \. d8 t
  13.     Next8 B$ _. _7 V# g8 T: `2 H
  14.     If B Then
    9 d6 Y5 e6 v6 s
  15.         MsgBox "存在"
    : j: b) c6 k! Y9 B. r- M# n
  16.     Else7 H# Y# d8 S: G4 ]
  17.         MsgBox "不存在"/ ?' @( Q$ s1 f" D- b
  18.     End If3 z2 V* ?/ X5 G) F7 q8 v
  19. End Sub6 U- k/ C. f+ T
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia
/ @/ ?" H1 o9 I1 F
2 d6 n2 M8 c1 a5 ^; J我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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