QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
查看: 3403|回复: 3
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑   b' g  w6 k( m, X
5 R( ?0 ]) `4 I3 @$ D- \$ Q
各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的
, g7 b9 h8 _/ S3 I
  1. '查找块
    7 E( q! W4 P+ ~
  2. Public Sub FindBlock()5 S& W0 F  g( t% q: y+ d6 _6 M* V

  3. 1 w7 `4 W3 p' @2 K' ]' M2 ?
  4. Dim Objblock As AcadBlockReference
    - H" a4 P" I9 i& S7 n5 z% b# o

  5. 2 _' O& @  k, Y+ a6 ~( S2 U; _
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配
    ) |0 ^' h( k' c, L
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then
    0 a# H/ d* I, j
  8.      MsgBox "存在!"
    ) G0 X! u: L! w' q: u$ s
  9.   Else& ^, l, c- ?; u7 Y$ |4 w+ N$ r1 }/ u, x
  10.      MsgBox "不存在!"& B3 B5 i$ {! n$ x+ K. C
  11.   End If# s1 a9 N  |! U& s' D8 H
  12. Next Objblock9 s( _+ b! b( s- x$ }0 N& c
  13. 5 W+ t/ k- l$ U+ m
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码

  1. 3 S0 Q6 w: p4 Y" N6 L
  2. Sub A()
    $ j5 P* m/ N- e
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean
    9 ^0 Z( C. l( m7 Z( P- s. e
  4.     For Each E In ThisDrawing.ModelSpace6 h( I& s, j- l4 O  S8 l
  5.         If E.ObjectName = "AcDbBlockReference" Then
    + ^( W# n& K9 c' u$ ]2 o
  6.             Set BR = E( c8 g! ^: Q4 H8 k. W/ ~
  7.             If BR.Name = "属性块" Then
    6 q2 N1 N0 S, B! h* s" _
  8.                 B = True
    5 ?8 c. t( V  S
  9.                 Exit For
    4 n2 ^7 e; M8 [, L
  10.             End If1 V3 W: k4 X# G4 f
  11.         End If9 q. m3 y% o" J4 {1 v2 t" H
  12.     Next4 o, V, Y0 Z0 A! O# U8 E/ s
  13.     If B Then
    ; ~# f  z  O5 K/ K
  14.         MsgBox "存在"
    : {) h8 H# l5 ^
  15.     Else
    % k: k- {% @# O, {3 Q
  16.         MsgBox "不存在"
    5 ~3 ]( E' }) v/ x9 ?
  17.     End If' ^9 x6 d9 A. {7 q2 ]
  18. End Sub
    ! W1 N0 Z0 P9 v! l1 y9 r% ~$ y
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".8 i( {: i) {1 U9 }/ y0 T
上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?
: {0 p" o9 k2 d+ X% W& A5 f如果是前者,上面的代码就可以了.如果是后者,要用下面的代码

  1. . t" f# n# y0 f9 a6 J% b
  2. Sub A()
    1 H) L% P0 \2 m7 Q/ S
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant
    . ?0 q# q* @% ^3 b
  4.     For Each E In ThisDrawing.ModelSpace
    2 ]: V+ S, N  D0 m7 G/ e
  5.         If E.ObjectName = "AcDbBlockReference" Then( d8 m. o" `+ d
  6.             Set BR = E- z. G. L- a0 \7 ^! f' U
  7.             Atts = BR.GetAttributes, I8 {. M( k, f9 h  u) |+ N9 E6 h+ E
  8.             If UBound(Atts) >= 0 Then0 [+ t, \$ o% Y% g( D, P, x, O5 M
  9.                 B = True& z. F2 n$ C8 H! V9 ]
  10.                 Exit For" j4 L1 ^- ^+ `5 \
  11.             End If
    3 L+ g  E8 t  G. G: ?, ?3 Z$ w/ c
  12.         End If
    + b+ E, b3 a2 x  Y
  13.     Next, E# S; T7 l5 ^( J$ f$ _
  14.     If B Then: }# S4 q. F. I. @& b
  15.         MsgBox "存在"3 M! M2 s! G; q  B, @
  16.     Else
    - p- m7 m& D7 @# w  ~/ M
  17.         MsgBox "不存在"
    7 f, m! J# @$ V; \
  18.     End If" G- t, b& \2 z! J, }
  19. End Sub
    # B# }9 A# o3 g( p+ X: }
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia 0 z" }. L# [. r% j7 J; n# n4 S
7 u, ^* o- z% c4 u* G. h
我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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