Excel VBA如何将数字后跟随的Chr(25)替换为双引号

需求
将数字后跟随的不可打印字符Chr(25)替换为双引号,保留原有数字内容。
现存问题
异常字符Chr(25)出现无固定规律:
- 可能出现在数字之后,连续出现1次或2次
- 可能出现在数字加双引号
"的后方 - 直接使用Excel
CLEAN函数会直接删除所有Chr(25),无法实现替换为双引号的需求,示例代码:
Range("C2") = WorksheetFunction.Clean(Range("B2"))
- 固定替换连续2个
Chr(25)的Replace写法适配性差,当Chr(25)仅出现单次时会重复添加双引号,示例代码:
Range("C2") = Replace(Range("B2"), Chr(25) & Chr(25), """")
解决方案
方案1:正则匹配(代码简洁,处理效率高)
通过正则全局匹配数字后跟随的1个或多个连续Chr(25),统一替换为单个双引号;如果数字后已经存在双引号,直接清除后续跟随的Chr(25)即可,不会出现重复加引号的问题。
Sub ReplaceChr25() Dim regEx As Object Dim sourceRng As Range, cell As Range ' 按需修改处理范围,示例为B列数据,处理结果输出到C列 Set sourceRng = Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row) Set regEx = CreateObject("VBScript.RegExp") With regEx .Global = True ' 匹配规则:捕获数字、数字后连续的1个及以上Chr(25)、Chr(25)后可能存在的双引号 .Pattern = "(\d)" & Chr(25) & "+(""?)" For Each cell In sourceRng ' 替换时保留原数字、原有双引号,仅补1个双引号替换所有连续Chr(25) cell.Offset(0, 1).Value = .Replace(cell.Value, "$1""$2") Next End With Set regEx = Nothing Set sourceRng = Nothing End Sub
方案2:逐字符处理(无需启用正则,逻辑直观)
如果不想依赖正则对象,可以先把所有连续的Chr(25)合并为单个,消除出现次数不固定的影响,再逐字符判断位置做替换:
Sub ReplaceChr25NoReg() Dim sourceStr As String Dim sourceRng As Range, cell As Range Set sourceRng = Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row) For Each cell In sourceRng sourceStr = cell.Value ' 第一步:所有连续Chr(25)合并为单个,解决出现1次/2次的适配问题 Do While InStr(sourceStr, Chr(25) & Chr(25)) > 0 sourceStr = Replace(sourceStr, Chr(25) & Chr(25), Chr(25)) Loop ' 第二步:逐字符判断替换 Dim i As Long, resStr As String resStr = "" For i = 1 To Len(sourceStr) If Mid(sourceStr, i, 1) = Chr(25) Then ' 仅当前一个字符是数字、且结果末尾还没有双引号时,才补双引号 If i > 1 And IsNumeric(Mid(sourceStr, i - 1, 1)) And Right(resStr, 1) <> """" Then resStr = resStr & """" End If ' 非数字后的Chr(25)、数字后已经加过引号的Chr(25)直接删除 Else resStr = resStr & Mid(sourceStr, i, 1) End If Next cell.Offset(0, 1).Value = resStr Next End Sub
两种方案都可以覆盖所有提到的异常场景,直接运行即可。
内容的提问来源于stack exchange,提问作者Waleed
相关产品推荐
相关产品推荐

