如何在Excel中使用VBA和RegExreplace数据?

我有一个很大的.csv文件(〜600k行,56Mo),里面有数据库行(每行有一个id,一个客户端名称,一个客户端地址,一个客户端生日date等)。 问题是,在一些行上,一些数据写得不好(逗号不应该在那里,搞砸了列)。

我猜想,我不得不做一些RegEx检测有问题的行,并用短划线或任何东西来replace错误的逗号。 我跟着这篇文章 ,经过一番尝试后,我让他发现了这些混乱的线条。

Private Sub simpleRegex() Dim strPattern As String: strPattern = "[^a-zA-Z0-9_,\-]([Az]+)\,[^a-zA-Z0-9_,\-]([Az]+)" Dim strReplace As String: strReplace = "[^a-zA-Z0-9_,\-][Az]+\-[^a-zA-Z0-9_,\-][Az]" Dim regEx As Object Set regEx = CreateObject("VBScript.RegExp") Dim strInput As String Dim Myrange As Range Set Myrange = ActiveSheet.Range("A1:A2000") For Each cell In Myrange If strPattern <> "" Then strInput = cell.Value With regEx .Global = True .MultiLine = True .IgnoreCase = False .Pattern = strPattern End With If regEx.Test(strInput) Then MsgBox (regEx.Replace(strInput, strReplace)) Else End If End If Next End Sub 

问题是,如果我想用一个唯一的值,一个预定义的string(如strReplace =“replacement words”)来更改cibled行,这个解决scheme就可以工作。 我想要的是能够针对一系列匹配我的模式的字符,并只replace其中的一个字符(逗号)。 一个例子是:

 728,"HAY,HAYE",Marie,François,RAUTUREAU,85,29/05/1856,68; 

进入:

 728,"HAY-HAYE",Marie,François,RAUTUREAU,85,29/05/1856,68; 

你有解决scheme吗?

(对不起,如果英文不好,这不是我的母语)。

如果我得到了你的正确,那么根本就不需要正则Regex

用一个简单的Split你也可以做到这一点。

 Private Sub simpleReplace() Dim str() As String, cell As Variant, Myrange As Range, i As Long Set Myrange = ActiveSheet.Range("A1:A2000") For Each cell In Myrange str = Split(cell.Value, """") If UBound(str) Then For i = 1 To UBound(str) Step 2 str(i) = Replace(str(i), ",", "-") Next cell.Value = Join(str, """") End If Next End Sub 

这将分裂你的728,"HAY,HAYE",Marie,François,RAUTUREAU,85,29/05/1856,68; 成:

 (0) 728, (1) HAY,HAYE (2) ,Marie,François,RAUTUREAU,85,29/05/1856,68; 

现在Split (奇数)的每一个第二部分通常都会被包含在" 。所以剩下的就是把逗号Replace成那个,再把它推入单元格。

如果没有"find,那么它会跳过这一行(因为上界是0)

如果你仍然有任何问题,或者如果这不是你正在寻找,请告诉:)

您可以使用(?<=(Your Word))来捕捉特定单词之后的特定字符。 在你的情况下,这段代码将帮助你find逗号:

 (?<=(HAY))\, 

更新:

试试这个,我也更新了演示:

 ,(?=[^"]+") 

演示: https //regex101.com/r/0rtcFt/6

这里的正确方法(因为你认为双引号只能作为字段分隔符出现)是将双引号的子string与一个简单的"[^"]+"正则expression式匹配,并且只在匹配内部用逗号replace逗号。

这是一个示例代码:

 Sub CallbackTest() Dim rxStr As RegExp Dim s As String Dim m As Object s = """SOME,MORE,HERE"",728,""HAY,HAYE"",Marie,François,RAUTUREAU,85,29/05/1856,68;" Set rxStr = New RegExp rxStr.pattern = """[^""]+""" rxStr.Global = True For Each m In rxStr.Execute(s) s = Left(s, m.FirstIndex) & Replace(m.Value, ",", "-") & Mid(s, m.FirstIndex + Len(m.Value) + 1) Next m Debug.Print s ' Print demo results ' => "SOME-MORE-HERE",728,"HAY-HAYE",Marie,François,RAUTUREAU,85,29/05/1856,68; End Sub