efan2000 发表于 2003-10-24 19:35:00

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

有朋友提到的,如何在单行文字、多行文字、属性定义、属性引用(或参照)替换文字。


Public Sub TextReplace()

    '创建选择集,名称为TextReplace
   
    Dim SSetObj As AcadSelectionSet
    On Error Resume Next
    Set SSetObj = ThisDrawing.SelectionSets("TextReplace")
    If Err Then
      Err.Clear
      Set SSetObj = ThisDrawing.SelectionSets.Add("TextReplace")
    End If
    SSetObj.Clear
    On Error GoTo 0
   
    '创建过滤器,仅选择Text(单行文本)、Mtext(多行文本)、AttDef(属性定义)
   
    '关于过滤器的详细使用资料,请参考有关书籍
   
    Dim fType(0 To 0) As Integer
    Dim fData(0 To 0) As Variant
    fType(0) = 0
    fData(0) = "Text,Mtext,AttDef"
   
    '选择全部的Text、Mtext、AttDef
   
    SSetObj.Select acSelectionSetAll, , , fType, fData
   
    Dim i As Integer
    If SSetObj.Count <> 0 Then
      For i = 0 To SSetObj.Count - 1
            '在Text和Mtext中显示的是TextString,在AttDef中显示的是TagString
            If TypeOf SSetObj(i) Is AcadAttribute Then
                If SSetObj(i).TagString = "ABC" Then SSetObj(i).TagString = "XYZ"
            Else
                If SSetObj(i).TextString = "ABC" Then SSetObj(i).TextString = "XYZ"
            End If
      Next
    End If
   
    '清空选择集中的数据,准备下一次操作
   
    SSetObj.Clear
   
    '创建过滤器,仅选择BlockRef(块引用)
   
    fType(0) = 0
    fData(0) = "Insert"
   
    '选择全部的BlockRef
   
    SSetObj.Select acSelectionSetAll, , , fType, fData
   
    Dim v As Variant
    Dim j As Integer
    If SSetObj.Count <> 0 Then
      For i = 0 To SSetObj.Count - 1
            If SSetObj(i).HasAttributes Then
                v = SSetObj(i).GetAttributes
                For j = 0 To UBound(v)
                  '在BlockRef中的AttRef中显示的是TextString
                  If v(j).TextString = "ABC" Then v(j).TextString = "XYZ"
                Next
            End If
      Next
    End If
   
    SSetObj.Clear
   
    SSetObj.Delete
   
    Set SSetObj = Nothing
End Sub

neteasy 发表于 2003-10-24 19:44:00

best

tukuitk 发表于 2003-10-25 11:31:00

谢谢efan2000替我成功解答!
请问用VB怎么实现替换一个文件夹内中所有图形,最好是生成一个EXE文件,谢谢!!!

myfreemind 发表于 2003-10-26 13:31:00

不错!!

XJ_HE 发表于 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


还望指教。

efan2000 发表于 2003-10-28 18:37:00

不是选择集的, SSetObj(i),也即SSetObj.Item(i)的意思,代表选择集中的一个实体,而之前使用了过滤机制,只选择块,因而这个实体就是块引用对象。HasAttributes是块引用对象的属性,没有异议了吧。
UBound是取数组范围的上限,LBound是取数组范围的下限,一般数组的下限是从0开始的,那么数组的元素个数应该就是UBound(v)+1,如果不是从0开始的,则是UBound(v)-LBound(v)+1。

XJ_HE 发表于 2003-10-29 09:43:00

谢谢指教,这次明白了。:)

gjliang 发表于 2003-12-16 18:53:00

我有一问题,如果我只想替换掉“ABC”中的“AB”,在批量替换条件下,该怎样实现呢。

efan2000 发表于 2003-12-16 19:41:00

这只是字符操作的问题,自己可更改为任意形式。
如:
If v(j).TextString = "ABC" Then v(j).TextString = "XYZ" & Mid(v(j).TextString, 3)

bluemoon 发表于 2003-12-16 20:35:00

哈哈 又学了一着啊
页: [1] 2
查看完整版本: [VBA]各种对象中的文字的替换方法。