找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 642|回复: 11

[原创]:通配符替换程序

[复制链接]
发表于 2004-7-3 07:42:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
Public Sub SuperReplace()
'支持通配符*格式的替换
'例:*(*)->*
  • 或A*B*->B*C*
    '保证替换前后*的数量相同
    On Error Resume Next
        Dim ss As AcadSelectionSet
        Dim str As String
        Dim pStart As String, pEnd As String
        Dim i As AcadEntity, j
        Dim ft(1) As Integer, fd(1)
        Dim pSS, pES
        Dim pStrs() As String
        Dim pSpec As String

        ThisDrawing.SelectionSets("*TlsText*").Delete
        Set ss = ThisDrawing.SelectionSets.Add("*TlsText*")
       
        pStart = Trim(ThisDrawing.Utility.GetString(False, "替换前:"))
        pEnd = Trim(ThisDrawing.Utility.GetString(False, "替换后:"))
        pSS = Split(pStart, "*")
        pES = Split(pEnd, "*")
       
        pSpec = Replace(pStart, "`", "``")
        pSpec = Replace(pSpec, "[", "`[")
        pSpec = Replace(pSpec, "]", "`]")
        pSpec = Replace(pSpec, ",", "`,")
        pSpec = Replace(pSpec, "@", "`@")
        pSpec = Replace(pSpec, "~", "`~")
        pSpec = Replace(pSpec, ".", "`.")
        pSpec = Replace(pSpec, "?", "`?")
        ft(0) = 0: fd(0) = "*Text"
        ft(1) = 1: fd(1) = pSpec
        ss.Select acSelectionSetAll, , , ft, fd
       
       
        For Each i In ss
       
            str = i.TextString
            
            ReDim pStrs(UBound(pSS) + 1) As String
            For j = 0 To UBound(pSS)
                pStrs(j) = LeftStr(str, pSS(j)) & pES(j)
                str = RightStr(str, pSS(j))
            Next j
            
            pStrs(UBound(pSS) + 1) = str
            i.TextString = Join(pStrs, "")
            
        Next i
       
        ThisDrawing.SelectionSets("*TlsText*").Delete

    End Sub

    Public Function LeftStr(ByVal String1 As Variant, ByVal String2 As Variant)
    On Error Resume Next
        LeftStr = Left(String1, InStr(String1, String2) - 1)
        If Err Then LeftStr = ""
    End Function

    Public Function RightStr(ByVal String1 As Variant, ByVal String2 As Variant)
    On Error Resume Next
        RightStr = Right(String1, Len(String1) - Len(String2) - InStr(String1, String2) + 1)
        If Err Then RightStr = ""
    End Function
  • 论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    发表于 2004-7-3 12:11:09 | 显示全部楼层
    好程序,L兄这个就是个通用版本了~~~
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2004-7-9 18:41:03 | 显示全部楼层
    升级版,支持输入空格,应该是说消除Bug,支持替换前后*的数量不等
    Public Sub SuperReplace()
    On Error Resume Next
        Dim ss As AcadSelectionSet
        Dim str As String
        Dim pStart As String, pEnd As String
        Dim i As AcadEntity, j
        Dim ft(1) As Integer, fd(1)
        Dim pSS, pES
        Dim pStrs() As String
        Dim pSpec As String

        ThisDrawing.SelectionSets("*TlsText*").Delete
        Set ss = ThisDrawing.SelectionSets.Add("*TlsText*")
       
        pStart = Trim(ThisDrawing.Utility.GetString(True, "替换前:"))
        pEnd = Trim(ThisDrawing.Utility.GetString(True, "替换后:"))
        pSS = Split(pStart, "*")
        pES = Split(pEnd, "*")
        pSpec = Replace(pStart, "`", "``")
        pSpec = Replace(pSpec, "[", "`[")
        pSpec = Replace(pSpec, "]", "`]")
        pSpec = Replace(pSpec, ",", "`,")
        pSpec = Replace(pSpec, "@", "`@")
        pSpec = Replace(pSpec, "~", "`~")
        pSpec = Replace(pSpec, ".", "`.")
        pSpec = Replace(pSpec, "?", "`?")
        ft(0) = 0: fd(0) = "*Text"
        ft(1) = 1: fd(1) = pSpec
        ss.SelectOnScreen ft, fd
       
       
        For Each i In ss
        If UBound(pES) = 0 Then
            i.TextString = pEnd
        Else
            str = i.TextString
            ReDim pStrs(UBound(pSS) + 1) As String
            For j = 0 To UBound(pSS)
                pStrs(j) = LeftStr(str, pSS(j)) & pES(j)
                str = RightStr(str, pSS(j))
            Next j
            
            pStrs(UBound(pSS) + 1) = str
            i.TextString = Join(pStrs, "")
        End If
        Next i
       
        ThisDrawing.SelectionSets("*TlsText*").Delete

    End Sub
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

    发表于 2004-7-10 21:01:14 | 显示全部楼层
    在VBA 高级开发指南 中有,  这个*字符英文叫法好象是 Token之类吧
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

    发表于 2006-7-1 12:18:51 | 显示全部楼层
    用不了,支持cad2002吗?再问个很菜问题,怎么把上述文字加载到cad里
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2006-7-1 14:52:55 | 显示全部楼层
    [工具]->[宏]->[VB编辑器]->双击[Thisdrawing]
    把代码Copy到右边
    运行vbarun命令
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

    发表于 2006-7-1 18:04:52 | 显示全部楼层
    不行啊,cad2002下提示子过程或函数未定义,加载一楼未升级版本就行,请教原因?
    另外,命令好像全部替换,不支持选择范围或单个替换?如果那样局限太大,期待改进
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2006-7-1 18:29:11 | 显示全部楼层
    添加下列代码:
    Public Function LeftStr(ByVal String1 As Variant, ByVal String2 As Variant)
    On Error Resume Next
    LeftStr = Left(String1, InStr(String1, String2) - 1)
    If Err Then LeftStr = ""
    End Function

    Public Function RightStr(ByVal String1 As Variant, ByVal String2 As Variant)
    On Error Resume Next
    RightStr = Right(String1, Len(String1) - Len(String2) - InStr(String1, String2) + 1)
    If Err Then RightStr = ""
    End Function
    选择范围或单个替换的你可以自己试试:)
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

    发表于 2006-7-1 19:15:26 | 显示全部楼层
    不行啊,版主,我把以上代码添加到最后,提示找不到工程或库
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

    发表于 2006-7-2 11:06:53 | 显示全部楼层
    好东东,学了一招!
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

    发表于 2006-7-2 17:58:18 | 显示全部楼层
    奇怪,重启cad后又得了,
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

    发表于 2006-7-2 18:45:09 | 显示全部楼层
    PKPM版本中提供了一个“ETR.LSP”就是一个这样的修改程序的。
    还有CHTEXT.LSP也可以完成这工作的。
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

    GMT+8, 2024-11-22 15:34 , Processed in 0.199290 second(s), 54 queries , Gzip On.

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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