【问题标题】:Extracting substring based on different criterias and placing the extracted string in another cell of same row根据不同的条件提取子字符串并将提取的字符串放在同一行的另一个单元格中
【发布时间】:2017-05-28 06:54:32
【问题描述】:

我有一个 excel 文件,其中有一列包含特定的字符串。该字符串不遵循任何特定模式。我的要求是提取一个子字符串(产品 ID),它是 8 个连续数字的集合,必须在前面/后面跟任何字符,或者必须在开头或结尾 的字符串。

以下是一些示例。

场景 1:

产品编号以#开头

Id#53298632/BS TVR:003519

excel中用到的函数

=MID(N88,FIND("#",N88)+1,8)

* 结果:53298632 *

场景 2:

产品ID在开头

53298632:003519

excel中用到的函数

=MID(A1,1,8)

* 结果:53298632 *

一开始我只需要处理场景 1,因此使用了指定的公式。现在有一天,字符串不遵循任何特定模式,但我的产品 ID 仍然是 8 位连续数字。我搜索了一个合适的解决方案,发现了这个公式(我不太清楚)。

=LOOKUP(10^8,MID(N132,ROW(INDIRECT("1:"&LEN(N132)-7)),8)+0)

这在大多数情况下确实有效,但在某些情况下会失败

例如

Pdr#53298632/数量编号 1031949

这里的结果是 1031949,这绝对不是我想要的。结果应该是 53298632

请帮我解决这个问题。这可以使用 VBA 宏来完成吗?我对此类 Excel 函数 VBA 和宏完全陌生。

任何帮助将不胜感激!

提前致谢。

【问题讨论】:

  • 您对正则表达式 (regex) 的熟悉程度如何?
  • @gabor 谢谢我不熟悉 vba 中的正则表达式。根据你的建议,我查了一下,很有帮助

标签: vba excel excel-formula


【解决方案1】:

如果您愿意将 Microsoft RegEx 模块专门包含到您的 Excel 项目中,正则表达式将很快解决这个问题。

要添加 RegEx 函数以在 Excel 宏中使用,请在 Excel 中选择“开发人员”菜单并启动 Visual Basic 编辑器。在 VBA for Applications 窗口中,选择 Tools->References 并选择 Microsoft VBScript Regular Expressions 5.5。

为您的 VBAProject 创建一个新模块(在项目树中右键单击您的 Excel 文件名,然后单击“插入”->“模块”)

双击新建的Module(在项目树中),在Module1(Code)窗口中输入以下代码:

Public Function getProductCode(source As String) As String
    Dim strPattern As String: strPattern = "(\d{8})"
    Dim result As String: result = ""
    Dim results As Object
    Dim regEx As New RegExp
    With regEx
        .Global = True
        .MultiLine = False
        .IgnoreCase = False
        .Pattern = strPattern
    End With
    If regEx.Test(source) Then
        Set results = regEx.Execute(source)
        If (results.Count <> 0) Then
           result = results.Item(0)
        End If
    End If
    getProductCode = result
End Function

现在可以从 Excel 中的相关单元格调用宏:

=getProductCode(A1)

【讨论】:

  • 非常感谢您拯救了我的一天!
【解决方案2】:

我想你也可以修改原来的公式来选择一个 8 位数字的第一个匹配项

=MID(A1,MATCH(TRUE,ISNUMBER(MID(A1,ROW(INDIRECT("1:"&LEN(A1)-7)),8)+0),0),8)

(必须使用 CtrlShiftEnter 作为数组公式输入)。

【讨论】:

  • 感谢您分享公式,这确实有效,但并不能真正实现我的目的,因为它不是我需要的第一个匹配项。
猜你喜欢
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
相关资源
最近更新 更多