近期使用Excel比较多,有一些匹配和替换的内容。平常涉及的比较简单,也就使用If或者VLOOKUP之类的函数。这次使用到正则表达式和VBA,在此记录一下,以防忘记。
打开文件一定要选择EXCEL打开,按住ALT+F11,右键文件选择“查看代码”,输入代码:
Private Sub RegExp_Replace()
Dim RegExp As Object
Dim SearchRange As Range, Cell As Range
'此处定义正则表达式
Set RegExp = CreateObject("vbscript.regexp")
RegExp.Pattern = "^[A-Za-z0-9]+(\-)?[0-9]?$"
#此处匹配所有以字母或数字开头的单元格(比如A01,或者A01-1)
'此处指定查找范围
Set SearchRange = ActiveSheet.Range("A3:A1008")
'遍历查找范围内的单元格
For Each Cell In SearchRange
Set Matches = RegExp.Execute(Cell.Value)
If Matches.Count >= 1 Then
Set Match = Matches(0)
Cell.Value = RegExp.Replace(Cell.Value, "16S")
#此处将单元格的内容完全替换成16S
End If
Next
End Sub
点击
image
执行代码,即可完成所需功能。
image.png
但是遇到不匹配的模式则提示
image.png
另辟途径解决,还是回归到我熟悉的IF函数。虽然有点曲折,但总算解决了我的问题:
反其道儿行知,不匹配的单元格都是#N/A(使用VLOOKUP匹配没有结果的单元格),将匹配这个的单元格记录为“no”;不匹配的单元格记录为“yes”。
IF(COUNTIF(A2,"#N/A"),"no","yes")
#COUNTIF是对满足条件的单元格计数
#理解为如果A2单元格满足条件,则COUNTIF(A2,"#N/A")返回值为1,
#则满足了IF的条件,返回值为“no”,反之返回值为“yes”。