【问题标题】:Split the content of cells in a column using regex使用正则表达式拆分列中单元格的内容
【发布时间】:2014-03-19 18:00:33
【问题描述】:

这是我到现在为止的代码,它实际上删除了单元格中的所有内容,但数字除外。这看起来像这样:

Sub myTest()

   Dim myCel As Range
   Dim i As Integer
    i = 0
'copier le contenu de la colonne A dans la colonne B

   Columns("A:A").Select
    Selection.Copy
    Columns("B:B").Select
    ActiveSheet.Paste

'on supprime tout ce qui n'est pas un nombre

   With CreateObject("VBScript.Regexp")
         .Global = True
         .Pattern = "\D+"
  For Each myCel In Range("B1:B900")
           myCel.Value = .Replace(myCel.Value, "")
  Next
  End With
End Sub

它工作正常...现在,我想要做的实际上是将单元格的内容分成 3 个单元格:一个包含数字之前的所有内容,一个包含数字,一个包含数字之后的内容。我有这样的专栏:

<g0 t="bold">
</g0>
<g1>
</g1>
<g2>
</g2>
<g3>
</g3>
<g4>
</g4>
<i5 t="lb"/>
<i6 t="lb"/>
<g7>
</g7>
<g8>
</g8>
<i9 t="lb"/>
<i10 t="lb"/>
<i11 t="lb"/>

我想得到这样的东西:(在 NP++ 中,正则表达式是 (<.>?)([0-9]{1,3})(.>) 然后替换为 \1\t\2\t\3。嗯,在 VBA 中它更复杂,我想在这个问题上寻求帮助......希望有人有一个想法:)

<g  0    t="bold">
</g 0   >
<g  1   >
</g 1   >
<g  2   >
</g 2   >
<g  3   >
</g 3   >
<g  4   >
</g 4   >
<i  5    t="lb"/>
<i  6    t="lb"/>
<g  7   >
</g 7   >
<g  8   >
</g 8   >
<i  9    t="lb"/>
<i  10   t="lb"/>
<i  11   t="lb"/>

现在我的问题不是关于正则表达式本身(我对正则表达式非常满意),而是 VBA 代码允许我真正拆分单元格并将 3 个部分发送到循环中的 3 个不同单元格...

【问题讨论】:

    标签: regex vba excel


    【解决方案1】:

    你已经很接近正则表达式了,我不得不做一个小修改。

    首先,确保在您的 VBA 模块中添加对“Microsoft VBScript 正则表达式 5.5”的引用(请参阅link 了解如何执行此操作)。

    Private Sub TestRegex()
        Dim regEx As New RegExp
        Dim strPattern As String
        Dim strInput As String
        Dim strRaplace As String
        Dim strOutput As String
        Dim Myrange As Range
    
        Set Myrange = ActiveSheet.Range("B1:B19")
    
        For Each C In Myrange
            strPattern = "(\<.?.?)([0-9]{1,3})(.*>)"
    
            If strPattern <> "" Then
                strInput = C.Value
                strReplace = "$1"
    
                With regEx
                    .Global = True
                    .MultiLine = True
                    .IgnoreCase = False
                    .Pattern = strPattern
                End With
    
                If regEx.Test(strInput) Then
                    C.Offset(0, 1) = regEx.Replace(strInput, "$1")
                    C.Offset(0, 2) = regEx.Replace(strInput, "$2")
                    C.Offset(0, 3) = regEx.Replace(strInput, "$3")
                Else
                    C.Offset(0, 1) = "(Not matched)"
                End If
            End If
        Next
    End Sub
    

    我的输入在 B 列中,输出在 C、D 和 E 列中显示

    【讨论】:

    • 太棒了!干净的代码,很快解决了我的问题,太棒了:) 现在我只改变了一个小东西:strPattern = "(\)" 因为否则,如果您查看最后的条目,则数字被切成两半。这样我使用了一个非贪婪的公式,我得到了完美的结果:)
    【解决方案2】:

    不使用正则表达式,选择您的单元格并:

    Sub parser101()
    Dim r As Range, v As String, L As Long
    Dim I As Long, N1 As Long, N2 As Long
    N1 = 0
    N2 = 0
    For Each r In Selection
        v = r.Text
        L = Len(v)
        For I = 1 To L
            If IsNumeric(Mid(v, I, 1)) Then
                N1 = I
                GoTo escape101
            End If
        Next I
        '
    escape101:
        '
        For I = N1 To L
            If Not IsNumeric(Mid(v, I, 1)) Then
                N2 = I
                GoTo escape102
            End If
        Next I
        '
    escape102:
        '
        r.Offset(0, 1) = Mid(v, 1, N1 - 1)
        r.Offset(0, 2) = Mid(v, N1, N2 - N1)
        r.Offset(0, 3) = Mid(v, N2)
    Next r
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2021-04-23
      • 2020-08-07
      • 2013-06-21
      • 2020-08-25
      • 2020-03-06
      • 2020-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多