【发布时间】:2015-09-19 10:12:41
【问题描述】:
我在替换包含 cmets 的数据范围内的部分字符串时遇到问题。
身份证号码出现的地方,我需要把身份证号码的中间换成X(例如423456789变成423xxx789)。 ID 仅以 4 或 5 开头,任何其他数字都应忽略,因为它可能用于其他目的。
遗憾的是,由于这些是 cmets,因此数据格式不一致,这增加了一定程度的复杂性。
代表性数据如下所示:
523 123 123
523123123
ID 545 345 345 is Mr. Jones
Primary ID 456456456 for Mrs. Brown
Mr. Smith's Id is 567567567
我只需要代码来替换 ID 号的中间 3 位数字,并保持单元格的其余部分完好无损,以便
ID 545 345 345 is Mr. Jones
Primary ID 456456456 for Mrs. Brown
变为(Xs 周围有或没有空格)
ID 545 xxx 345 is Mr. Jones
Primary ID 456xxx456 for Mrs. Brown
我拥有的正则表达式可以成功找到带有 ID 的行,并且可以很好地用于没有其他文本的单元格。可悲的是,对于其他单元格,它不会只替换需要替换的 3 位数字,并且会使单元格的数据变得混乱。我下面的代码适用于上面的前两个单元格,然后对其余的单元格效果不佳。请帮忙。
Sub FixIds()
Dim regEx As New RegExp
Dim strPattern As String: strPattern = "([4][0-9]{2})([^a-zA-Z0-9_]?[0-9]{3})([^a-zA-Z0-9_]?[0-9]{3})|([5][0-9]{2})([^a-zA-Z0-9_]?[0-9]{3})([^a-zA-Z0-9_]?[0-9]{3})"
Dim strReplace As String: strReplace = ""
Dim strInput As String
Dim Myrange As Range
Dim NewPAN As String
Dim Aproblem As String
Dim Masked As Long
Dim Problems As Long
Dim Total As Long
'Set RegEx config/settings/properties
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern ' sets the regex pattern to match the pattern above
End With
Set Myrange = Selection
MsgBox ("The macro will now start masking IDs identified in the selected cells only.")
' Start masking the IDs
For Each cell In Myrange
Total = Total + 1
' Check that the cell is long enough to possibly be an ID and isn't already masked
Do While Len(cell.Value) > 8 And Mid(cell.Value, 5, 1) <> "x" And cell.Value <> Aproblem
If strPattern <> "" Then
cell.NumberFormat = "@"
strInput = cell.Value
NewPAN = Left(cell.Value, 3) & "xxx" & Right(cell.Value, 3)
strReplace = NewPAN
' Depending on the data, fix it
If regEx.Test(strInput) Then
cell.Value = NewPAN
Masked = Masked + 1
Else
' Adds the cell value to a variable to allow the macro to move past the cell
Aproblem = cell.Value
Problems = Problems + 1
' Once the macro is trusted not to loop forever, the message box can be removed
' MsgBox ("Problem. Regex fail? Bad data = " & Aproblem)
End If
End If
Loop
Next cell
' All done
MsgBox ("IDs are now masked" & vbCr & vbCr & "Total cells highlighted (including blanks) = " & Total & vbCr & "Cells masked = " & Masked & vbCr & "Problem cells = " & Problems)
End Sub
【问题讨论】:
-
需要替换的行是否总是包含“ID”或其他字符串?它们总是采用“123456789”或“123 456 789”的形式吗?