查找并替换范围中所有出现的字符串

问题描述 投票:2回答:2

我想基本上模拟在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
excel vba excel-vba
2个回答
2
投票

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

您需要设置对Microsoft VBScript Regular Expressions x.x的引用

enter image description here

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  

打破RegEx模式:(\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对于简单的事情非常有用,例如允许用户在启动后取消进程,例如搜索文件。对于长时间运行的进程,通过使用Timer或将任务委派给ActiveX EXE组件可以更好地完成处理器的处理。在后一种情况下,任务可以完全独立于您的应用程序继续,并且操作系统采用多任务处理和时间切片。


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

© www.soinside.com 2019 - 2024. All rights reserved.