Vba 查找并替换范围内所有出现的字符串
我想基本上模拟VBA内部Excel中的“全部替换”功能,并将字符串03/01/2018(在本工作簿中存在10次)替换为01/03/2017。我已经知道如何对单个事件执行此操作,但不是对范围内的所有事件执行此操作 替换方法是否有类似findnext的内容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
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