首页 > 解决方案 > 使用 VBA 正则表达式删除模式中的空格

问题描述

我对 VBA 很陌生,我正在处理来自化学仪器的数据,该仪器输出的值没有统一分隔并包含特殊字符。我正在尝试将这些值导入到 excel 中,并且已经解决了几乎所有的问题,除了一个。当我将这些值导入 excel 时,它们会逐行读取。读入的每一行都包含在 A 列中自己的单元格中。可以有 50 到大约 1000 列数据,上面有相关的标识符和元数据。下面是前 5 行数据的复制/粘贴。

1 7.724 1190 1231 1292 PV 4 724391 121434659 49.60% 9.688%
2 9.272 1451 1481 1484 VB 3961552 186833117 76.32% 14.905%
3 10.968 1732 1754 1816 VV 2673526 111034313 45.36% 8.858%
4 15.249 2382 2445 2453 PV 296082 33844178 13.82% 2.700%
5 15.384 2453 2466 2500 VV 219908 14461812 5.91% 1.154%

我遇到的问题是,有时有多个峰组成一个值并记录为 2 个字母一个空格和一到两个数字(0-9),而只有一个峰的峰类型只有两个字母. 例如,请查看第 1 行的“PV 4”。我正在尝试使用正则表达式遍历 A 列,从第 18 行开始到第 1000 行结束,以查找字母和相关数字,并删除间隙空间,使单元格看起来像这样:

1 7.724 1190 1231 1292 PV4 724391 121434659 49.60% 9.688%

一旦采用这种形式,我就可以使用空格分隔符来分隔单元格,而无需对具有多个峰值类型的单元格进行帧移动。

这是我到目前为止编写的代码,但我不确定如何继续:

Sub PKTYRegexRemoveSpace()

Dim StrPattern As String: StrPattern = "[A,B,H,M,N,P,S,T,U,V,X,\+][A,B,H,M,N,P,S,T,U,V,X,\+]\s[0-9]{1,2}\s"
Dim StrInput As String
Dim MyRange As Range
Dim regEx As New RegExp
Dim Cell As Range



Set MyRange = ActiveSheet.Range("A22:A24")

For Each Cell In MyRange
    If StrPattern <> "" Then
        StrInput = Cell.Value

    With regEx
        .Pattern = StrPattern
        .Global = False
        .IgnoreCase = False
    End With
    
    If regEx.Test(StrInput) Then
        MsgBox (regEx.Replace(StrInput, *this is where I need help*))
    Else
        MsgBox ("Not matched")
    End If
    
End If
Next
End Sub

我在开发过程中使用了一个 msgbox,以避免每次失败的替换尝试都必须重新导入文件。

任何帮助将不胜感激!

标签: excelvbaregexp-replace

解决方案


我建议更改正则表达式模式以使用捕获组和单词边界标记

\b([A,B,H,M,N,P,S,T,U,V,X,\+][A,B,H,M,N,P,S,T,U,V,X,\+])\s([0-9]{1,2})\b

然后,对于替换字符串:

$1$2

推荐阅读