【问题标题】:Find and replace all occurences of a string in a range查找和替换范围内所有出现的字符串
【发布时间】:2018-03-05 00:17:30
【问题描述】:

我想基本上在 VBA 中模拟 Excel 中的全部替换功能,并将字符串 03/01/2018(在本工作簿中存在 10 次)替换为 01/03/2017 我已经想出了如何做到这一点单个出现,但不是一个范围内的所有出现。

是否有 findnext 之类的替换方法?

Sub findandreplacedate()
    Workbooks("01 .xlsx").Sheets(1).usedrange.Replace What:="*03/01/2018*", _
    Replacement:="01/03/2017", LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False
end sub

【问题讨论】:

  • 当我尝试重现此内容时,我会在字符串中的任何位置获取 03/01/2018 的所有单元格,并替换(使用您的宏和 excel 2016)。我还建议在此示例中使用 RegEx 将所有日期从 dd/mm 交换为 mm/dd 或类似的。

标签: vba excel


【解决方案1】:

你可以试试这个。这使用 RegEx (正则表达式) 来检查您的日期。

您需要设置对 Microsoft VBScript 正则表达式 x.x

的引用

Sub ChangeDates()

    Dim RegEx As New RegExp, rng As Range, i As Long, s As String
    Dim tempArr() As String, bFlag As Boolean

    With RegEx
        .Pattern = "(\d{2})/(\d{2})/(\d{4})"
        For Each rng In ActiveSheet.UsedRange
            tempArr = Split(rng.Text)
            bFlag = False
            For i = 0 To UBound(tempArr)
                If .test(tempArr(i)) Then
                    s = tempArr(i)

                    'Subtract 1 year from original date
                    s = Format(DateAdd("YYYY", -1, CDate(s)), "MM/DD/YYYY")

                    'Swap month and day field
                    tempArr(i) = Format(DateSerial(.Replace(s, "$3"), _
                            .Replace(s, "$2"), .Replace(s, "$1")), "mm/dd/yyyy")

                    'Tell VBA that the string has change and to update sheet
                    bFlag = True
                End If
            Next
            If bFlag = True Then rng.Value = Join(tempArr)
        Next rng
    End With

End Sub  


分解正则表达式模式:(\d{2})/(\d{2})/(\d{4})

这个表达式分为三组:(\d{2})(\d{2})(\d{4})

第 1 组和第 2 组查找任意两个 ({2}) 数字 (\d),后跟正斜杠 /

第 3 组正在寻找任何四个 ({4}) 数字 (\d) 出现在正斜杠 /

之后

【讨论】:

    【解决方案2】:

    是的,有 FindNext Range.FindNext Method (Excel)

    要查找范围内的所有文本实例,您可以将 FindNextFind 结合使用,以下示例显示了如何使用 FindNext.

    Option Explicit
    Public Sub Example()
        Dim rng As Range
        Set rng = ThisWorkbook.Worksheets(1).UsedRange _
                              .Find("03/01/2018", LookIn:=xlValues)
    
        If rng Is Nothing Then
            Debug.Print "Not Found"
            Exit Sub
        End If
    
        Dim firstAdd As String
        firstAdd = rng.Address
    
        Do ' Print address
            DoEvents
            Debug.Print rng.Address
            ' Find next item
            Set rng = ThisWorkbook.Worksheets(1).UsedRange.FindNext(rng)
        Loop Until rng Is Nothing Or firstAdd = rng.Address
    End Sub
    

    其他信息

    DoEvents 对于允许用户在进程启动后取消进程(例如搜索文件)最有用。对于长时间运行的进程,让处理器更好地通过使用计时器或将任务委托给 ActiveX EXE 组件来完成。在后一种情况下,任务可以完全独立于您的应用程序继续进行,并且操作系统会处理多任务和时间片。


    Debug.Print Immediate Window 用于调试和评估表达式、执行语句、打印变量值等。它允许您在调试期间输入要由开发语言评估或执行的表达式。要显示即时窗口,请打开一个项目进行编辑,然后从调试菜单中选择 Windows 并选择即时,或按 CTRL+ALT+I。

    【讨论】:

    • 您能解释一下为什么将 DoEvents 添加到循环中吗?
    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 2013-12-22
    • 1970-01-01
    • 2016-12-11
    • 2016-02-03
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多