QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑 ! E* S4 y, r3 J2 u/ g3 U  W

6 s! R% Z/ @. n1 K; E1 e各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的
  _" }8 h- {0 A& D6 ?# `
  1. '查找块
    - z0 a- A4 X; i- A7 M$ G' n) c- f
  2. Public Sub FindBlock()% U# `# g7 k/ s% M

  3. ) L+ t1 }1 G) @  u, M2 k7 ^
  4. Dim Objblock As AcadBlockReference
    # C! H* T$ w6 R: W

  5. 9 Y; s. X' _9 a, x* s
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配$ g0 r  X' s: A0 _9 T- X' g( A7 K
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then3 m6 N0 i5 o, V0 s6 [( F$ j
  8.      MsgBox "存在!"; E. E4 D. T# F( P8 `1 D
  9.   Else1 z) J5 X' Y; \$ h. F2 O
  10.      MsgBox "不存在!"
    8 V: S7 l, g- c3 @# Y5 q- V" e
  11.   End If
    3 P0 g% ~+ q  [  s) M: K
  12. Next Objblock
    6 P' z  `* B7 O6 i* V+ P
  13. 7 s& z5 a2 M* b) z, O" N, E
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码
  1. $ n  o& F' z3 g! W7 ]& y
  2. Sub A(); I# x" v/ l7 [0 b) J7 Q, H% E
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean
    ! G/ @% B; Z$ r+ [
  4.     For Each E In ThisDrawing.ModelSpace4 J0 n6 x1 T1 Y
  5.         If E.ObjectName = "AcDbBlockReference" Then9 l7 m4 A2 L6 k& k. Q
  6.             Set BR = E
    1 v% U9 R7 g& Z0 i
  7.             If BR.Name = "属性块" Then
    & m; `" _+ F& h" s
  8.                 B = True( A) q8 b- {1 ~7 S* p% O1 J" J
  9.                 Exit For
    & A0 |  L; |! @! X
  10.             End If
    & z( g6 E7 |- m: }( e; c
  11.         End If5 J' k5 R4 j5 R
  12.     Next% T- h: J# T' z3 x; Z" V* O) B8 O
  13.     If B Then' q# l* R5 j7 \* R4 H4 y
  14.         MsgBox "存在"! b5 y' y- r; {/ u  e1 Q
  15.     Else
    ) S7 ~' D. n& m* d4 C2 F: g* W
  16.         MsgBox "不存在"& t% l7 z& `+ O% K! M/ ]% e2 Q1 C
  17.     End If4 `0 X) K$ L! J" I
  18. End Sub
    0 `, m' \, F- Q. T- [4 _' v- ~
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".3 k" m. J( |" Z9 Q/ U' Q
上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?
- F1 Y8 c2 }$ E& D, h$ z6 x如果是前者,上面的代码就可以了.如果是后者,要用下面的代码

  1. . J1 o3 p+ A. D0 f. |+ r
  2. Sub A()7 w3 F3 U% H9 m8 g# H) }) f
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant
    - }( _4 r$ ^/ e7 c$ G2 r2 ^; Z1 l
  4.     For Each E In ThisDrawing.ModelSpace
    ( V  g5 c+ d9 `  ~5 {2 k* \2 y
  5.         If E.ObjectName = "AcDbBlockReference" Then, t  o8 i* @0 D
  6.             Set BR = E* k2 V" `) c. }
  7.             Atts = BR.GetAttributes0 \  x- N/ c5 m  u! q7 j* A
  8.             If UBound(Atts) >= 0 Then% K2 z3 I# w2 i; o1 O5 u* P) V
  9.                 B = True' m  o0 r# q/ V
  10.                 Exit For; J8 H. z7 O1 T$ d: t  `9 ^+ T
  11.             End If1 E  R# t5 h  B$ \  Q* [6 K2 f( O
  12.         End If
    5 d3 s; [& v7 a8 S1 R" p# w# d
  13.     Next
    ) U0 o, s; n/ }( ]" J
  14.     If B Then
    8 V+ m7 X9 O  `! {
  15.         MsgBox "存在"
    / ~7 i# E# z  e, a# B$ L" o; a3 _
  16.     Else
    & v) n( u: n" z2 d. H; S5 Y
  17.         MsgBox "不存在") k: |2 L% ?( \0 d1 |( {: i. m. v
  18.     End If, J, c& A+ O7 |5 Q, p
  19. End Sub! h8 t4 b! J! x) u4 C# q2 {
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia
5 S' m  a% S" A6 a
" h9 o  H* H) _5 x! S, C& r1 H# D我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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