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

时间:2018-03-05 00:17:31

标签: excel vba excel-vba

我想基本上模拟在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

2 个答案:

答案 0 :(得分:2)

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

  

您需要设置对 Microsoft VBScript正则表达式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/

答案 1 :(得分:2)

是的 FindNext Range.FindNext Method (Excel)

要查找某个范围内的所有文字实例,您可以将 FindNext Find 一起使用,以下示例说明如何使用 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.