明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4285|回复: 11

[VBA]各种对象中的文字的替换方法。

  [复制链接]
发表于 2003-10-24 19:35:00 | 显示全部楼层 |阅读模式
有朋友提到的,如何在单行文字、多行文字、属性定义、属性引用(或参照)替换文字。


  1. Public Sub TextReplace()

  2.     '创建选择集,名称为TextReplace
  3.    
  4.     Dim SSetObj As AcadSelectionSet
  5.     On Error Resume Next
  6.     Set SSetObj = ThisDrawing.SelectionSets("TextReplace")
  7.     If Err Then
  8.         Err.Clear
  9.         Set SSetObj = ThisDrawing.SelectionSets.Add("TextReplace")
  10.     End If
  11.     SSetObj.Clear
  12.     On Error GoTo 0
  13.    
  14.     '创建过滤器,仅选择Text(单行文本)、Mtext(多行文本)、AttDef(属性定义)
  15.    
  16.     '关于过滤器的详细使用资料,请参考有关书籍
  17.    
  18.     Dim fType(0 To 0) As Integer
  19.     Dim fData(0 To 0) As Variant
  20.     fType(0) = 0
  21.     fData(0) = "Text,Mtext,AttDef"
  22.    
  23.     '选择全部的Text、Mtext、AttDef
  24.    
  25.     SSetObj.Select acSelectionSetAll, , , fType, fData
  26.    
  27.     Dim i As Integer
  28.     If SSetObj.Count <> 0 Then
  29.         For i = 0 To SSetObj.Count - 1
  30.             '在Text和Mtext中显示的是TextString,在AttDef中显示的是TagString
  31.             If TypeOf SSetObj(i) Is AcadAttribute Then
  32.                 If SSetObj(i).TagString = "ABC" Then SSetObj(i).TagString = "XYZ"
  33.             Else
  34.                 If SSetObj(i).TextString = "ABC" Then SSetObj(i).TextString = "XYZ"
  35.             End If
  36.         Next
  37.     End If
  38.    
  39.     '清空选择集中的数据,准备下一次操作
  40.    
  41.     SSetObj.Clear
  42.    
  43.     '创建过滤器,仅选择BlockRef(块引用)
  44.    
  45.     fType(0) = 0
  46.     fData(0) = "Insert"
  47.    
  48.     '选择全部的BlockRef
  49.    
  50.     SSetObj.Select acSelectionSetAll, , , fType, fData
  51.    
  52.     Dim v As Variant
  53.     Dim j As Integer
  54.     If SSetObj.Count <> 0 Then
  55.         For i = 0 To SSetObj.Count - 1
  56.             If SSetObj(i).HasAttributes Then
  57.                 v = SSetObj(i).GetAttributes
  58.                 For j = 0 To UBound(v)
  59.                     '在BlockRef中的AttRef中显示的是TextString
  60.                     If v(j).TextString = "ABC" Then v(j).TextString = "XYZ"
  61.                 Next
  62.             End If
  63.         Next
  64.     End If
  65.    
  66.     SSetObj.Clear
  67.    
  68.     SSetObj.Delete
  69.    
  70.     Set SSetObj = Nothing
  71. End Sub

评分

参与人数 1威望 +1 金钱 +5 贡献 +5 激情 +5 收起 理由
mccad + 1 + 5 + 5 + 5 【好评】好程序

查看全部评分

发表于 2003-10-24 19:44:00 | 显示全部楼层
best
发表于 2003-10-25 11:31:00 | 显示全部楼层
谢谢efan2000替我成功解答!
请问用VB怎么实现替换一个文件夹内中所有图形,最好是生成一个EXE文件,谢谢!!!
发表于 2003-10-26 13:31:00 | 显示全部楼层
不错!!
发表于 2003-10-28 16:41:00 | 显示全部楼层
If SSetObj(i).HasAttributes Then   '在选择集的对象中,这个属性代表却好象没有?
                v = SSetObj(i).GetAttributes   
                For j = 0 To UBound(v)             ’UBOUND()的用法是什么?什么意思呢?
                    If v(j).TextString = "ABC" Then v(j).TextString = "XYZ"
                Next
            End If


还望指教。
 楼主| 发表于 2003-10-28 18:37:00 | 显示全部楼层
不是选择集的, SSetObj(i),也即SSetObj.Item(i)的意思,代表选择集中的一个实体,而之前使用了过滤机制,只选择块,因而这个实体就是块引用对象。HasAttributes是块引用对象的属性,没有异议了吧。
UBound是取数组范围的上限,LBound是取数组范围的下限,一般数组的下限是从0开始的,那么数组的元素个数应该就是UBound(v)+1,如果不是从0开始的,则是UBound(v)-LBound(v)+1。
发表于 2003-10-29 09:43:00 | 显示全部楼层
谢谢指教,这次明白了。:)
发表于 2003-12-16 18:53:00 | 显示全部楼层
我有一问题,如果我只想替换掉“ABC”中的“AB”,在批量替换条件下,该怎样实现呢。
 楼主| 发表于 2003-12-16 19:41:00 | 显示全部楼层
这只是字符操作的问题,自己可更改为任意形式。
如:
If v(j).TextString = "ABC" Then v(j).TextString = "XYZ" & Mid(v(j).TextString, 3)
发表于 2003-12-16 20:35:00 | 显示全部楼层
哈哈 又学了一着啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 18:36 , Processed in 0.174489 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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