1

我在单元格 A1 中有一个可变文本字段,其中包含以下内容:

文本;#Number;#Text;#Number

  • 这种格式可以不断重复,但模式始终是 Text;#Number。
  • 数字可以从 1 位到 n 位不等(限制 7)

例子:

原始值

MyName;#123;#YourName;#3456;#HisName;#78

所需值:

123, 3456, 78

根据我的理解,该字段对于 excel 公式来说太易变了。

我尝试使用正则,但在编码方面我是初学者。如果您可以用一些解释文本分解代码,将不胜感激。

我已经尝试了下面的一些建议,它们工作得很好。还有一个问题。

现在我可以从文本中拆分数字,有什么方法可以利用下面的代码并添加另一层,我们将数字拆分为 x 个单元格。

例如:一旦我们运行函数,如果我们在同一个单元格中得到 1234、567,则函数会将 1234 放在单元格 B2 中,将 567 放在单元格 C2 中。这将不断更新同一行中的所有单元格,直到字符串用尽从函数中检索到的所有数字。

谢谢

4

4 回答 4

2

如果模式是固定的,并且数字的位置永远不会改变,您可以假设数字将位于字符串中的偶数位置。这意味着在对源字符串进行拆分的数组结果中,您可以使用结果数组的奇数索引。例如在这个字符串 "Text;# Number ;#Text;# Number " 数组索引 1、3 将是数字 ("Text(0);# Number(1) ;#Text(2);# Number(3) ”)。如果模式确实是固定的,我认为这种方法使用起来更容易、更安全,因为它避免了验证数据类型的需要。

Public Function GetNums(src As String) As String
    Dim arr
    Dim i As Integer
    Dim result As String
    arr = Split(src, ";#") ' Split the string to an array.
    result = ""
    For i = 1 To UBound(arr) Step 2 ' Loop through the array, starting with the second item, and skipping one item (using Step 2).
        result = result & arr(i) & ", "
    Next
    If Len(result) > 2 Then
        GetNums = Left(result, Len(result) - 2) ' Remove the extra ", " at the end of the the result string.
    Else
        GetNums = ""
    End If
End Function
于 2016-05-02T23:17:09.837 回答
2

这是约翰科尔曼建议的方法:

Public Function GetTheNumbers(st As String) As String
    ary = Split(st, ";#")
    GetTheNumbers = ""

    For Each a In ary
        If IsNumeric(a) Then
            If GetTheNumbers = "" Then
                GetTheNumbers = a
            Else
                GetTheNumbers = GetTheNumbers & ", " & a
            End If
        End If
    Next a
End Function
于 2016-05-02T21:57:25.673 回答
2

数字可以从 1 位到 n 位不等(限制 7位)

其他响应似乎都没有考虑提供的参数,因此我将一个真正的解决方案组合在一起。

Option Explicit
Option Base 0    '<~~this is the default but I've included it because it has to be 0

Function numsOnly(str As String, _
                  Optional delim As String = ", ")
    Dim n As Long, nums() As Variant
    Static rgx As Object, cmat As Object

    'with rgx as static, it only has to be created once; beneficial when filling a long column with this UDF
    If rgx Is Nothing Then
        Set rgx = CreateObject("VBScript.RegExp")
    End If
    numsOnly = vbNullString

    With rgx
        .Global = True
        .MultiLine = False
        .Pattern = "[0-9]{1,7}"
        If .Test(str) Then
            Set cmat = .Execute(str)
            'resize the nums array to accept the matches
            ReDim nums(cmat.Count - 1)
            'populate the nums array with the matches
            For n = LBound(nums) To UBound(nums)
                nums(n) = cmat.Item(n)
            Next n
            'convert the nums array to a delimited string
            numsOnly = Join(nums, delim)
        End If
    End With
End Function

      numsOnly

于 2016-05-02T23:43:53.310 回答
1

使用的正则表达式选项Replace

Sub Test()
Debug.Print StrOut("MyName;#123;#YourName;#3456;#HisName;#78")
End Sub

功能

Option Explicit
Function StrOut(strIn As String) As String
Dim objRegex As Object
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
    .Pattern = "(^|.+?)(\d{1,7})"
    .Global = True
    If .Test(strIn) Then
        StrOut = .Replace(strIn, "$2, ")
        StrOut = Left$(StrOut, Len(StrOut) - 2)
    Else
        StrOut = "Nothing"
    End If
End With
End Function
于 2016-05-03T03:36:17.467 回答