QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑
% o' U4 A& |! z4 ^5 r
% d5 _- ^2 j$ D3 l各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的
1 B7 V& H* l& I) a
  1. '查找块
    % @5 d1 ~. Y. P) y5 H; k' h) k; z
  2. Public Sub FindBlock()+ E; K. n' j5 v+ a: g% M

  3. ! h- R7 M1 o% g! h+ z+ c' W7 m1 t
  4. Dim Objblock As AcadBlockReference0 `% B& }6 o6 h6 T+ j
  5. 2 h0 l/ d+ \' b% B2 ~1 H) h+ X
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配8 M  q( z' r' Z% F0 |
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then" q! l7 Y* {  F" ?) B% x
  8.      MsgBox "存在!"8 Q7 Y2 O3 L- v1 i3 e0 k/ l, S
  9.   Else  r6 a1 V3 N: l0 q
  10.      MsgBox "不存在!"
    9 `- F  V7 o8 y% a- \
  11.   End If
    2 q& H! ?. u  H. e
  12. Next Objblock
      V6 e! z" n" O5 Q0 W. N
  13. 8 o% U8 U3 A) D; _0 \6 V. x
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码
  1. ; K# `/ k, I9 B4 S8 u
  2. Sub A()
    ) S" u/ J$ t9 |. {( F
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean
    " B1 T- g0 A  _1 L! u7 U
  4.     For Each E In ThisDrawing.ModelSpace! t8 Y* K6 ], t% s& C8 W
  5.         If E.ObjectName = "AcDbBlockReference" Then
    * p( `) i8 b$ Z1 a! I
  6.             Set BR = E2 i" M% g$ W" G! n0 p& C$ J$ b- Q
  7.             If BR.Name = "属性块" Then
    ) b7 l$ Y9 G7 v* [9 ^1 m5 ^% P7 f) o
  8.                 B = True
    & z+ B: i+ L1 f7 V, C9 E) ?: i* r
  9.                 Exit For$ Q4 V2 w+ v. V3 D4 O
  10.             End If0 u, o' u, Y1 C+ L
  11.         End If
    3 J. M4 |1 y. _+ ^6 Y- A
  12.     Next
    1 i& Z+ M+ T& A
  13.     If B Then
    ' e. E( w+ s7 I, M8 C% N
  14.         MsgBox "存在"4 {$ j' a" g+ j/ z' @
  15.     Else( S0 f# \7 k: P9 K
  16.         MsgBox "不存在"
    ; A! W# A# e  a$ }, Z0 I
  17.     End If
    ! o! n  ^$ A( f; g2 p7 x7 b
  18. End Sub
    5 ?: v" U! X( H4 d% b9 {9 R. s3 o( F
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".6 J, z- F+ L1 p& T( T- T0 b
上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?
/ K  H  N" r/ H4 l& G- \6 P如果是前者,上面的代码就可以了.如果是后者,要用下面的代码

  1. ( |9 u4 Z. {! X6 m: E0 A* f7 p
  2. Sub A()* p) ~( c8 D5 a% a2 u) h- w3 W1 E
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant
    ' u0 e  k* ^% R# s  X
  4.     For Each E In ThisDrawing.ModelSpace( g# K: |' x: Y* Z  K" ?0 A
  5.         If E.ObjectName = "AcDbBlockReference" Then4 R# Z4 @+ h0 Z% i
  6.             Set BR = E; L! r, A1 x% t' x
  7.             Atts = BR.GetAttributes7 n. x2 l  ?/ V3 F* o
  8.             If UBound(Atts) >= 0 Then# c5 ~3 ?" N" Z) m' G3 ~  [; E
  9.                 B = True- {4 D: E0 a! q  y3 [1 [/ f2 Q
  10.                 Exit For% O9 Q3 v3 R1 e, g- B( [2 H
  11.             End If' D* @; j5 a& `! T: [$ j: p
  12.         End If
    ( V5 J# Z4 x. \; y' F6 b" U
  13.     Next
    6 ?3 d2 o0 {- [' O
  14.     If B Then, }4 Y4 b$ h4 O
  15.         MsgBox "存在"
    4 k# U2 [. l" F- ^* _8 B
  16.     Else
    - V, i9 f% A7 C  ?" h. ?8 [
  17.         MsgBox "不存在"$ w/ q5 w1 B" ^! P
  18.     End If
    ' i1 j+ K. V* J  k% u4 s' ]" Y
  19. End Sub+ r& ^3 Z& r6 j4 h7 V' y6 `
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia 3 L+ \/ U5 N6 O9 D

# e8 ]1 ^/ n2 i9 R" {) k, Z我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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