使用文本从单元格中获取数字并生成包含所有这些数字的列表

时间:2016-10-25 14:47:03

标签: regex excel vba excel-vba excel-formula

我在一个电子表格中给我一栏,看起来像这样: enter image description here

我需要的是获取所有引用,方括号中的引用,以向用户提供完整列表: enter image description here

...然后获取所有参考文献的完整列表,如下所示:

enter image description here

有没有人知道如何使用任何Excel公式/过滤或VBA来做到这一点?

3 个答案:

答案 0 :(得分:1)

本网站上的文字中有许多号码解析¹的例子。从叙事文本中提取数字是构建的更简单的正则表达“模式”之一;特别是如此,无论分隔符或分组字符如何,都有固定的数字。

将以下内容放入标准模块代码表中。

=numberParse(A2)

使用A2中的模糊,将以下内容放入B2,

=numberParse(A$2, ROW(1:1))

使用A2中的模糊,将以下内容放入A4并填充,

{{1}}

您的结果应类似于以下内容,

numberParse

¹以上内容是根据我在Excel UDF for capturing numbers within characters中的回复修改而来的。

²有关详细信息,请参阅How to use Regular Expressions (Regex) in Microsoft Excel both in-cell and loops

答案 1 :(得分:1)

假设:

  • 以“压力”命名的工作表

  • 列“A”,其中的单元格可以从

  • 中获取引用
  • 列“B”在

  • 中写入相应的提取参考文献
  • 列“C”写下

  • 中所有参考文献的完整列表

你可以试试这个

Option Explicit

Sub main()
    Dim cell As Range
    Dim references As String
    Dim referencesArr As Variant

    With Worksheets("pressure") '<-- change "pressure" to your actual worksheet name
        For Each cell In .Range("A1", .Cells(.Rows.Count, 1).End(xlUp))
            references = references & GetReferences(cell) & "; "
        Next cell
        If references <> "" Then
            referencesArr = Split(Left(references, Len(references) - 2), ";")
            .Range("C1").Resize(UBound(referencesArr)).Value = Application.Transpose(referencesArr)
        End If
    End With
End Sub

Function GetReferences(rng As Range) As String
    Dim arr As Variant, iElem As Long
    Dim strng As String

    With rng
        arr = Split(Replace(Replace(.Value, "[", "|["), "]", "]|"), "|")
        For iElem = 1 To UBound(arr) - 1 Step 2
            strng = strng & Mid(CStr(arr(iElem)), 2, Len(CStr(arr(iElem))) - 2) & "; "
        Next iElem
    End With
    If strng <> "" Then
        GetReferences = Left(strng, Len(strng) - 2)
        rng.Offset(, 1) = GetReferences
    End If
End Function

答案 2 :(得分:0)

为了快速入门,您可以使用=MID(A1,SEARCH("[",A1)+1,SEARCH("]",A1)-SEARCH("[",A1)-1)提取括号之间的文本。然后你留下一个用分号分隔的字符串。

然后,您可以运行此子程序(最有可能进行调整,以缩小范围):

Sub splitSemiColons()
Dim myArray() As String
Dim colToUse As Long
colToUse = 3
myArray = Split(Range("B1"), ";")

Dim i As Long
For i = LBound(myArray) To UBound(myArray)
    Cells(i + 1, colToUse).Value = myArray(i)
Next i

End Sub

或者,您可以避免使用此宏,只需使用数据 - &gt;文字到列 - &gt;使用;分隔符,然后复制并粘贴转置。