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

Vba 查找并替换范围内所有出现的字符串,vba,excel,Vba,Excel,我想基本上模拟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

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

你可以试试这个。这使用正则表达式来检查日期

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


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

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

第3组正在查找正斜杠后的任何四位(
{4}
)数字(
\d

是的,存在

要查找某个范围内的所有文本实例,可以使用
FindNext
查找
一起使用
FindNext
,下面的示例演示了如何使用
FindNext


其他信息

对于一些简单的事情非常有用,例如允许用户在进程启动后取消进程,例如搜索文件。对于长时间运行的进程,最好使用计时器或将任务委托给ActiveX EXE组件来生成处理器。。在后一种情况下,任务可以完全独立于您的应用程序继续执行,操作系统采用多任务和时间切片的方式


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


当我尝试复制时,我会将2018年1月3日的所有单元格替换为字符串中的任意位置(使用宏和excel 2016)。我还建议在本例中使用RegEx将所有日期从dd/mm交换到mm/dd或类似的日期。您能解释一下为什么要将DoEvents添加到循环中吗?
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  
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