仅知道一定数量的字符时替换文本字符串

时间:2019-04-01 15:11:30

标签: excel vba

我有一个PO号列表。它们看起来像(4010059877-TUR36036133或TUR6039716 ## 4010073239)。我需要能够将单元格缩小到仅PO编号,即4010059877编号。我要排除的部分中唯一一致的部分是“ TUR #########”。

我已经研究了排除所有非数字字符的代码,但是某些单元格具有这些“ TUR#”。我进行了查找,并用通配符“ *”代替。我也在网上搜索,没有看到类似的东西。

查找并替换尝试的代码

Sub Replace()

    Columns("AJ").Replace What:="TUR*", _
                          Replacement:="", _
                          LookAt:=xlPart, _
                          SearchOrder:=xlByRows, _
                          MatchCase:=False, _
                          SearchFormat:=False, _
                          ReplaceFormat:=False 
End Sub

替换所有在TUR ##########后面留下多余数字的非数字字符

Dim finRow As String
finRow = Sheets("Data").Range("A20000").End(xlUp).Row

Set myRange = Sheets("Data").Range("AK2:AK" & finRow)
For Each myCell In myRange
    LastString = ""
    For I = 1 To Len(myCell.Value)
        mT = Mid(myCell.Value, I, 1)
        If mT Like "[0-9]" Then
            tString = mT
        Else
            tString = ""
        End If
        LastString = LastString & tString
    Next I
    myCell.Value = LastString
Next

我的预期结果是将TUR #########删除并替换为空。

2 个答案:

答案 0 :(得分:3)

您可以使用InStr()函数,然后使用它来支持Left,例如:

loc = instr(mycell,"TUR")
val = left(mycell.value,loc-1)

编辑1:

由于SJR的评论,将在位置1找到“ TUR”时添加处理该问题的示例。

loc = instr(mycell,"TUR")
if loc = 1 then
    val = ""
else
    val = left(mycell.value,loc-1)    
end if

编辑2:

Dim val as long 'assumes you will only have a number in the end
val = right(left(mycell.value,12),11)
mycell.value = val

这应该剪掉第一个括号,并且11位PO后的信息没有问题。这甚至可能特定于instr(mycell.value,“ TUR”)为true的情况(一个开关),以防您有其他可能的情况。

答案 1 :(得分:0)

我们也可以尝试进行正则表达式替换:

Dim Regex As System.Text.RegularExpressions.Regex
Dim input As String = "4010059877-TUR36036133"
Dim output As String = Regex.Replace(input, "([0-9]+)-TUR[0-9]+", "$1")
Console.WriteLine(output)

这将输出:4010059877