我的字符串提取代码是否有修复程序?

时间:2019-05-10 08:56:18

标签: excel vba string loops extraction

我试图从不同的字符串中提取一个位置随机的子字符串。取代不是固定值,而是“ T”,然后是四个数字,例如T6000。

Please see this image.

您可以在此图像中看到许多机器名称,其中大多数包含T号。在几乎所有情况下,T值也都不同。机器名称的列为“ E”。第一个数字(T6000)在E16中,最后一个在E25中。

使用我的代码:

For Ipattern = 16 To NumofMachines + 15 Step 1
    TNUMcell = Dsht.Range("E" & Ipattern).Value
    'Verify if string contains a Tnum
    TNUMLikeBoolean = TNUMcell Like "*T###*"

    If TNUMLikeBoolean = True Then
        Do Until TNUMdone = True
            TNUMchar1 = InStr(TNUMcell, "T") + 1
                TNUMcharV = Mid(TNUMcell, TNUMchar1)
                TNUMchecknum = IsNumeric(TNUMcharV)
                    If TNUMchecknum = True Then
                        Dsht.Range("F" & Ipattern).Value = "T" & Mid(TNUMcell, TNUMchar1, 5)
                        TNUMdone = True
                    End If
        Loop
    Else
        Dsht.Range("F" & Ipattern).Value = "NO T"
    End If
Next Ipattern

它仅填充“导出”范围(F16:F25)的第一个和最后一个单元格。

我一直在寻找答案。因为我(显然)不是VBA专家。

我在做什么错?为什么不填写其他值?

谢谢, 伍特J

2 个答案:

答案 0 :(得分:4)

尝试此代码

Sub Test()
Dim r As Range, i As Long, c As Long

With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "T\d{4}"

    For Each r In Range("E16", Range("E" & Rows.Count).End(xlUp))
        c = 6
        If .Test(r.Value) Then
            For i = 0 To .Execute(r.Value).Count - 1
                Cells(r.Row, c).Value = .Execute(r.Value)(i)
                c = c + 1
            Next i
        End If
    Next r
End With
End Sub

答案 1 :(得分:1)

问题出在您的变量TNUMdone上。

在循环的第一次迭代中将其设置为True,然后再也不会将其设置为False,因此Do Until TNUMdone = True之后的代码不再运行。

在循环开始时,只需将TNUMdone设置为False,它应该可以工作:

For Ipattern = 16 To NumofMachines + 15 Step 1
    TNUMdone = False
    TNUMcell = Dsht.Range("E" & Ipattern).Value
    ...