【问题标题】:VBA - find second occurrence of substring "TL" and delete everything afterVBA - 找到第二次出现的子字符串“TL”并删除之后的所有内容
【发布时间】:2015-09-19 01:32:34
【问题描述】:

它的作用:我有一段代码在单元格中找到一个子字符串 TL,并通过在“TL- ”。 (即TL-00072 -> TL-000072TL-034 -> TL-000034TL-000000789 -> TL-000789

我想要它做什么: 但是,有时一个单元格中有多个 TL 值。我需要查找是否有第二次出现 TL,如果是,则删除第二次出现及其后的所有内容。

例子:

Start:                           Output:
TL-000789 TL-000187 TL-000773  ->   TL-000789
TL-000689 TL -000787           ->   TL-000689
TL-000982 TL - 980819          ->   TL-000982

这是我一直在使用 split 处理的代码(不正确且不工作)的尝试(也许 trim 也可以工作?)会发现 TL 的第二次出现并删除它之后的所有内容。下面是完整的工作代码。

当前的代码尝试

Dim splitValues As Variant
        If Str(str, "TL" + 1) 'do not know how to get SECOND occurrence
            splitValues = Split(theValue, "TL")
            theValue = splitValues(0)
        End If

工作代码

[将在开头添加新代码](问题顶部的解释)

注意:StartSht 是值和代码所在的工作簿。 所有被更改的值都在“C”列中

'force length of TL/CT to be 6/4 numbers long, eliminate spaces
    Dim str As String, ret As String, tmp As String, j As Integer, k As Integer
    For k = 2 To StartSht.Range("C2").End(xlDown).Row
        ret = ""
        str = StartSht.Range("C" & k).Value
        'for TL numbers

 ''''''''''''''new code goes here''''''''''''''''''

        If InStr(str, "TL") > 0 Then
            For j = 1 To Len(str)
                tmp = Mid(str, j, 1)
                If IsNumeric(tmp) Then ret = ret + tmp
            Next j
            'force to 6 numbers if too short; add 0s immediately after "TL-"
            For j = Len(ret) + 1 To 6
                ret = "0" & ret
            Next j
            'force to 6 numbers if too long; eliminate 0s immediately after "TL-"
            If Len(ret) > 6 Then
                Debug.Print Len(ret)
                For j = Len(ret) To 7 Step -1
                If Mid(ret, 1, 1) = "0" Then
                    ret = Right(ret, j - 1)
                End If
                Next j
            End If
            'eliminate superfluous spaces around "TL-"
            ret = "TL-" & ret
            StartSht.Range("C" & k).Value = ret
        'for CT numbers
        ElseIf InStr(str, "CT") > 0 Then
            For j = 1 To Len(str)
                tmp = Mid(str, j, 1)
                If IsNumeric(tmp) Then ret = ret + tmp
            Next j
        'force to 4 numbers if too short; add 0s immediately after "CT-"
        For j = Len(ret) + 1 To 4
            ret = "0" & ret
        Next j
        'force to 4 numbers if too long; eliminate 0s immediately after "CT-"
        If Len(ret) > 4 Then
            Debug.Print Len(ret)
            For j = Len(ret) To 5 Step -1
            If Mid(ret, 1, 1) = "0" Then
                ret = Right(ret, j - 1)
        End If
        Next j
    End If
    'eliminate superfluous spaces around "CT-"
    ret = "CT-" & ret
    StartSht.Range("C" & k).Value = ret
 End If
Next k

【问题讨论】:

  • Can't you just use 例如:strKeepLeft=LEFT(TextToSearch,Mid(TextToSearch,"TL",3)-1)Mid 在字符串中找到一个字符串的出现,所以我们告诉它从位置 3 开始(假设第一个 TL 出现总是在 1,2 位置)... 出错时,我们采用整个 TextToSearch 字符串,因为没有第二条 TL 语句。
  • 看起来很有道理,但我不确定如何实现它。我尝试使用set 和您的代码,但不确定以后如何引用它...我是 VBA 新手,所以我仍然不确定如何调用所有内容 @xQbert

标签: excel vba split substring


【解决方案1】:

如果您找到第二个“TL”,您似乎可以重新定义 str 。行后:
If InStr(str, "TL") > 0 Then
添加另一个 IF 语句:
If InStr(3, str, "TL") > 0 Then str = Mid(str, 1, Instr(3, str, "TL") - 2)

然后使用新的str 继续编写其余代码。

【讨论】:

  • 哇好漂亮!谢谢@tmh8885。如果您有时间解释一下,3 和 -1 做了什么来消除这些值?
  • 当然。在str 中查找字符串“TL”时,我们希望从 3 开始以避免第一个实例。至于 -1,我将其编辑为改为 -2,这是我的疏忽。它所做的是找到“TL”的第二个实例并将其从str 中排除。但是我们想要排除的不仅仅是从“TL”开始,我们还想排除空格,给我们一个修剪过的str
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 2017-07-07
  • 2021-11-14
  • 1970-01-01
  • 2010-11-11
相关资源
最近更新 更多