QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑 8 h& @& j: T5 P6 O0 ?& K4 g" r  R+ z
: x( l4 P1 ]7 P! @; G
各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的
8 H/ [* ^' `. ~) E' F; @, K! s
  1. '查找块8 h* ^" f+ v7 |6 x5 z
  2. Public Sub FindBlock()
    % p, [& X7 b1 P  r* @' P) }

  3. ) j, v6 M; V9 Y7 P% ^9 A
  4. Dim Objblock As AcadBlockReference) f: {& |$ o4 s  R' d

  5. % T' b$ q+ E9 k" W, d
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配9 H6 U* u" i3 u& {
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then
    " L* h* C( ~& \) Y% n7 p
  8.      MsgBox "存在!"
    3 q) T: x0 D! r+ @% }: X& L! x
  9.   Else9 |, z0 ?5 E* p! s; x
  10.      MsgBox "不存在!"; v1 Q1 J; c: I0 r1 _7 h
  11.   End If0 Q! r/ p5 W1 ~
  12. Next Objblock! B  E2 l4 G0 n9 v, R6 M* N

  13. ( [# v& t" z# Q; \5 Q% |. m6 ~2 J
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码

  1. * D- p; s, q' }
  2. Sub A()
    3 g( ^" V9 @9 q. ~
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean
    + {5 f5 J  ^' O
  4.     For Each E In ThisDrawing.ModelSpace
    1 i4 _! g! L- V8 C0 t) L+ p
  5.         If E.ObjectName = "AcDbBlockReference" Then
    + t8 I' o' O5 a1 a) K$ \" p
  6.             Set BR = E
    % j. j% t) I* ?3 \. G
  7.             If BR.Name = "属性块" Then' r! U& ~: R5 y$ v* n7 S
  8.                 B = True
    - n# X$ B0 E6 l2 i
  9.                 Exit For
    ' ]9 S! w- T" T
  10.             End If
    6 G6 a( x& K/ }2 g! M0 n' F! h
  11.         End If" @( r2 Z) ]+ j! O$ u
  12.     Next/ H" X: c& e( T; s8 Y% W
  13.     If B Then% L! `+ g2 X$ y5 Q
  14.         MsgBox "存在"
    , s+ G' i6 \1 a. t
  15.     Else
    - n! q8 w& g* r8 x8 v8 |9 F$ f
  16.         MsgBox "不存在"' W9 e. ^* S7 a' n
  17.     End If
    $ ~) f5 |: h8 F+ G3 h% h
  18. End Sub
    5 }8 T6 W3 t4 M
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant"./ [& S8 X8 C/ W, `. `
上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?
- _; ~" [' A) Z) ~4 a/ W如果是前者,上面的代码就可以了.如果是后者,要用下面的代码

  1. 7 y- L0 j7 T& z: o' Y' E
  2. Sub A()
    + q$ s* i  X5 D$ s+ S- Q. I9 S
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant
    , d1 p, k/ s! u$ Y- _: X% A
  4.     For Each E In ThisDrawing.ModelSpace
    ' g* B0 X" t2 x9 l6 Z; u
  5.         If E.ObjectName = "AcDbBlockReference" Then
    $ Q+ E$ n9 a7 }+ n- G# p7 }) R
  6.             Set BR = E
    9 H  D* X0 r1 B  v9 b* U8 o
  7.             Atts = BR.GetAttributes2 Z. ?0 A, {% S2 ]; \( k
  8.             If UBound(Atts) >= 0 Then
    1 L) C* }7 @0 o8 c! [" y; j
  9.                 B = True
    ( `: D% F- Y' m  H1 W! R
  10.                 Exit For2 {6 T) v' d! g
  11.             End If
    6 p8 @3 a- j) |1 a
  12.         End If
    : |" R6 V! d% F2 z& P8 {0 ^
  13.     Next
    - a2 H7 m* m8 L0 N# f# V$ [
  14.     If B Then
    " x' C6 [/ V/ x- H2 D
  15.         MsgBox "存在"
    $ K- n& \# Y! a9 I
  16.     Else" V( @7 r( Z  k6 J: U# B
  17.         MsgBox "不存在") ^$ _; g$ a" e/ S/ y1 ~& A8 Z
  18.     End If- @  @# R. B1 S7 B! l# `
  19. End Sub
    2 j, l  f* V- B) D, W
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia
6 n/ ^$ `# t- q3 U3 L2 N' e: j5 g/ q/ J
& c. d8 a. h9 D我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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