如何从Excel单元格中提取仅为5位数字的字符串?

4
我有一堆数据,其中包含任意数量的五位数字符串,格式完全不一致,我想要提取这些五位数字符串(加粗部分)。我不在意包含少于或多于五位数字的字符串。例如,这是我文件中的数据类型:
Cell A1: "1. 76589 - 批发活动。2. 33476 - 通用" Cell A2: "批发活动(76589)。运输(12235)。房地产活动(67333)" Cell A3: "1. 33476 通用。658709年公路。未知563"
我尝试了常规的SEARCH/FIND、MIN、LEFT/RIGHT/MID函数,但不确定如何获得所需的结果,即使使用文本转列也无法得到干净的结果。
提前感谢。

1
单元格A1包含两个5位数字。您希望输出的格式是什么? - Gowtham Shiva
嗨,Gowtham Shiva,理想情况下,我希望每个5位数字字符串都能被提取到后续的列中。在上面的例子中,这意味着B1: "76589",C1: "33476" - vrgl
你需要在VBA中使用正则表达式。尝试一些答案。在你的问题中添加Excel-VBA和正则表达式标签。 - Gowtham Shiva
3个回答

2

这里有一个宏,可以按照您的要求将行分成列。

正在处理的范围是您选择的任何内容。结果将写入同一行上相邻的列。

根据您的工作表设置,可能需要在执行提取代码之前“清除”结果所在的行。

您还可以编写代码以自动选择要处理的数据。此论坛上有很多示例。


Option Explicit
Sub Extract5Digits()
    Dim R As Range, C As Range
    Dim RE As Object, MC As Object, M As Object
    Dim I As Long

Set R = Selection
Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .Pattern = "\b\d{5}\b"
    For Each C In R
        If .test(C.Text) = True Then
            I = 0
            Set MC = .Execute(C.Text)
            For Each M In MC
                I = I + 1
                C.Offset(0, I) = M
            Next M
        End If
    Next C
End With
End Sub

enter image description here


嗨Ron,非常感谢。这正是我需要的。它还向我展示了我应该在我的原始问题中添加一些免责声明 - 我真的很菜,所以我需要非常具体、逐步的说明。你的答案为像我这样的初学者提供了所有必要的东西,让它能够工作。 - vrgl

0

仅使用Excel函数是不可能的。

对于您来说,最好的方法是使用VBA中的Regex 55库。

让我们考虑这个例子:

+---+--------------------------------------------------------------+
|   |                              A                               |
+---+--------------------------------------------------------------+
| 1 | Cell A3: "1. 33476 General. 658709 annual road. Unknown 563" |
| 2 | 33476                                                        |
+---+--------------------------------------------------------------+

从Excel文件中按下Alt + F11,然后转到“工具”=>“引用”,选择“Microsoft VBScript Regular Expression 5.5”。
然后您可以使用以下函数定义:
Public Function Get5DigitsNumer(search_str As String)
Dim regEx As New VBScript_RegExp_55.RegExp
Dim matches
    GetStringInParens = ""
    regEx.Pattern = "[0-9]{5}"
    regEx.Global = True
    If regEx.test(search_str) Then
        Set matches = regEx.Execute(search_str)
        GetStringInParens = matches(0).SubMatches(0)
    End If
End Function

此时您可以使用以下代码:

Sub PatternExtractor()
    Range("A2").Value = Get5DigitsNumer(Range("A1"))
End Sub

提取单元格A1的5位数字,然后将结果保存到单元格A2中。

目前我不知道这段代码如何处理同一单元格包含多个值的情况;例如在你的示例中,“单元格A1:‘1. 76589 - 批发活动。2. 33476 - 一般’”。

我建议您查看this answer。虽然模式不同,但问题与您的非常相似。


由于OP想要确切地五个数字,我建议您将单词边界标记添加到您的正则表达式模式中。 - Ron Rosenfeld
嗨,Nicolaesse,非常感谢您详细的回复。一旦我回到我的工作文件,我会尝试您的建议。嗨,Ron Rosenfeld,感谢您的建议。我的VBA知识相当基础。在Nicolaesse的代码中应该在哪里添加单词边界标记? - vrgl
嗨nicolaesse,再次感谢您的回复。不幸的是,我无法使您的代码工作。我99%确定是因为我对这个领域的了解不足导致我实现错误。 - vrgl

0
唯一的方法是在 VBA 中编写正则表达式。我建议你查看这个 question

嗨Gorkem,谢谢你提供的链接。我会看一下的。 - vrgl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接