ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 13360|回复: 23

[分享]关于查找与替换效率研讨

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-1-28 06:54 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

关于查找与替换效率研讨

查找与替换是Word非常显著的一个功能特点,使用Word的前台功能,其效率很高,而使用VBA时,相对较慢。本文就先前论坛常用方法进行研讨。

1        测试文档:

全文52536个文字,41页,为RAND()虚拟函数所得,通篇文字均为那只敏捷的棕毛狐狸跃过那只懒狗。文档中共包括2985"敏捷".

2        测试电脑:

DELL INSPIRON 700m1.7GCPU512M内存,WINXP+OFFICE2003_SP2.

代码平均运行3次。

Zdr1L05B.rar (11.59 KB, 下载次数: 234)
[此贴子已经被作者于2008-1-28 7:00:20编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-1-28 06:54 | 显示全部楼层

1.1    Selection对象的Find对象

'* +++++++++++++++++++++++++++++

'* Created By SHOUROU@ExcelHome 2008-1-28 6:25:33

'仅测试于System: Windows NT Word: 11.0 Language: 2052

' 0316^The Code CopyIn [ThisDocument-ThisDocument]^'

'* -----------------------------

Sub Get_Finds1()

' 用时:3.826172 , 3.826172,3.59375

    Dim N As Long, StartTime As Single, EndTime As Single

    StartTime = VBA.Timer

    Selection.HomeKey wdStory

    Do

        With Selection.Find

            .Text = "敏捷"

            .Wrap = wdFindStop

            .Forward = True

            If .Execute = False Then Exit Do

            N = N + 1

        End With

    Loop

    EndTime = VBA.Timer

    Debug.Print EndTime - StartTime

    MsgBox "Word共用时" & EndTime - StartTime & "找到了" & N & "项目!", vbInformation

End Sub

'----------------------

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-1-28 06:55 | 显示全部楼层

1.1    Range对象的Find对象

略,参考REPLACE对象

1.2    正则表达式regexp对象

' 0317^The Code CopyIn [ThisDocument-ThisDocument]^'

'* -----------------------------

Sub Get_Finds2()

'用时0.05078125,0.0507125,0.04882813

'请在VBE中引用 Microsoft VBScript Regular Expressions 5.5

'本程序适用于取得匹配查找内容的数量

    Dim myRegEx As New VBScript_RegExp_55.RegExp    '定义一个新的正则表达式对象

    Dim Matches As Object, strSource As String, strFindText As String

    Dim StartTime As Single, EndTime As Single, N As Long

    StartTime = VBA.Timer

    strSource = ActiveDocument.Content.Text

    strFindText = "敏捷"

[此贴子已经被作者于2008-1-28 6:57:29编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-1-28 06:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

    myRegEx.IgnoreCase = True    ' 不区分大小写

    myRegEx.Global = True    ' 搜索全部

    myRegEx.Pattern = strFindText    '设置模式表达式

    Set Matches = myRegEx.Execute(strSource)

    N = Matches.Count    '返回匹配查找内容的数量

    EndTime = VBA.Timer

    Debug.Print EndTime - StartTime

    MsgBox "Word共用时" & EndTime - StartTime & "找到了" & N & "项目!", vbInformation

End Sub

'----------------------

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

使用正则表达式对象RegExp取得2985个查找内容(项目)的平均用时0.050107293s,使用Selection对象的Find对象的平均用时为3.748698s,使用Range对象的Find对象更慢一些。前者是后者的74倍,比Word前台的查找还快。

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-1-28 06:59 | 显示全部楼层
4 查找并替换次数(非全部替换)
4.1 Selection对象的Find对象
'* +++++++++++++++++++++++++++++
'* Created By SHOUROU@ExcelHome 2008-1-28 6:35:07
'仅测试于System: Windows NT Word: 11.0 Language: 2052
'№ 0318^The Code CopyIn [ThisDocument-ThisDocument]^'
'* -----------------------------
Sub my_Find1()
'用时8.644531,8.402344,8.433594
    Dim N As Long, StartTime As Single, EndTime As Single
    StartTime = VBA.Timer
    Selection.HomeKey wdStory
    Do
        With Selection.Find
            .Text = "敏捷"
            .Wrap = wdFindStop
            .Forward = True
            If .Execute = False Then Exit Do
            Selection.Text = "Excelhome_Word" & N
            Selection.Collapse wdCollapseEnd
            N = N + 1
        End With
    Loop
    EndTime = VBA.Timer
    Debug.Print EndTime - StartTime
    MsgBox "Word共用时" & EndTime - StartTime & "完成了" & N & "次替换!", vbInformation
End Sub
'----------------------
4.2 Range对象的Find对象
'* +++++++++++++++++++++++++++++
'* Created By SHOUROU@ExcelHome 2008-1-28 6:36:08
'仅测试于System: Windows NT Word: 11.0 Language: 2052
'№ 0319^The Code CopyIn [ThisDocument-ThisDocument]^'
'* -----------------------------
Sub my_Find2()
'用时12.26563,12.21875,12.33984
    Dim myRange As Range, N As Long
    Dim StartTime As Single, EndTime As Single
    StartTime = VBA.Timer
    Set myRange = ActiveDocument.Range(0, 0)
    Do
        With myRange.Find
            .Text = "敏捷"
            .Wrap = wdFindStop
            .Forward = True
            If .Execute = False Then Exit Do
            N = N + 1
            myRange.Text = "Excelhome_Word" & N
            myRange.Collapse wdCollapseEnd
        End With
    Loop
    EndTime = VBA.Timer
    Debug.Print EndTime - StartTime
    MsgBox "Word共用时" & EndTime - StartTime & "完成了" & N & "次替换!", vbInformation
End Sub
'----------------------
4.3 Range对象的Find对象(Setrange方法)
'* +++++++++++++++++++++++++++++
'* Created By SHOUROU@ExcelHome 2008-1-28 6:38:52
'仅测试于System: Windows NT Word: 11.0 Language: 2052
'№ 0320^The Code CopyIn [ThisDocument-ThisDocument]^'
'* -----------------------------
Sub my_Find3()
'用时12.56641,12.46875,12.51563
    Dim myRange As Range, N As Long
    Dim StartTime As Single, EndTime As Single
    StartTime = VBA.Timer
    Set myRange = ActiveDocument.Content
    Do
        With myRange.Find
            .Text = "敏捷"
            If .Execute = False Then Exit Do
            N = N + 1
            myRange.Text = "Excelhome_Word" & N
            myRange.SetRange myRange.End, ActiveDocument.Content.End
        End With
    Loop
    EndTime = VBA.Timer
    Debug.Print EndTime - StartTime
    MsgBox "Word共用时" & EndTime - StartTime & "完成了" & N & "次替换!", vbInformation
End Sub
'----------------------
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
在非全部替换中,往往需要使用缩减查找区域。使用Selection对象的Find对象时,比使用Range对象更快一些(前者平均用时8.493489667S,后者平时用时(12.395835S),而在Range对象的Find对象中,使用Collapse方法(12.27474S)优于SetRange的方法(12.51693S)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2008-1-28 07:04 | 显示全部楼层

谢谢守柔版主提供,已收下,学习中...........

TA的精华主题

TA的得分主题

发表于 2008-1-29 08:29 | 显示全部楼层
谢谢老大分享,好好学习,天天向上。

TA的精华主题

TA的得分主题

发表于 2008-1-29 12:50 | 显示全部楼层

我对查找替换还很雾,慢慢学习.

TA的精华主题

TA的得分主题

发表于 2008-1-31 09:26 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2008-1-31 13:10 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-24 10:35 , Processed in 0.048459 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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