将手机号码提取到excel中的其他单元格

将手机号码提取到excel中的其他单元格,excel,excel-formula,vba,Excel,Excel Formula,Vba,我在一些单元格A1、A2、A3、A4中有非结构化数据,希望提取不同单元格中的手机号码 --------------------------(A)-------------------------- (1) `ABCDEFG CFGHJKL 9810642882 9212451029 9818682274` (2) `ABCDERFT 9910077711 9811195125 9999966744` (3) `ADFRTYU.9810851029 9818218521 9

我在一些单元格A1、A2、A3、A4中有非结构化数据,希望提取不同单元格中的手机号码

    --------------------------(A)--------------------------
(1)   `ABCDEFG CFGHJKL 9810642882 9212451029 9818682274`
(2)   `ABCDERFT 9910077711 9811195125 9999966744`  
(3)   `ADFRTYU.9810851029 9818218521 9811056189`  
(4)   `ADFGT FTYUH 9873155802`  
来自单元格A1的结果:

      ----(A)---   ----(B)---  ----(C)---
(1)   9810642882   9212451029  9818682274

您可以为此使用Excel内置的“文本到列”功能

突出显示列
A
并转到数据>>文本到列。选择“分隔符”,然后选择“空格”作为分隔符。单击finish,它将按空间分割数据并将其写入相邻列


对于VBA UDF,您可以使用超级方便的
SPLIT()
string方法,该方法将通过分隔符将字符串拆分为数组。然后选择您需要的位置:

Public Function strtok(strIn As String, delim As String, token As Integer) As String
    'Split the <strIn> by the <delim> outputting the string at position <token>
    strtok = Split(strIn, delim)(token - 1)    
End Function
按空格拆分时,将返回
A1
值第一个位置的字符串。如果将其放入
B1
中,则可以使用
Column()
使其更具动态性,以便只需将公式左右拖动即可:

=strtok($A1," ",Column()-1)
=TRIM(MID(SUBSTITUTE(TRIM(MID($A1,MIN(FIND({1,2,3,4,5,6,7,8,9,0},$A1&1234567890)),999))," ",REPT(" ",999)),999*(COLUMN(A1)-1)+1,999))

以下是对上述函数的编辑,该函数将由delim拆分,然后仅使用拆分中的数值重建数组,然后输出从数值数组请求的令牌:

Public Function strtok(strIn As String, delim As String, token As Integer) As String
    'Split the strIn by the delim outputting the string at position <token>

    Dim strArr As Variant 'array to split the initial string
    Dim numArr() As Double 'array to hold just numeric values
    Dim arrEl As Variant 'Element for the array

    'fill strArr
    strArr = Split(strIn, delim)

    'initial numArr()
    ReDim numArr(0 To 0)

    'Loop through each element in the strArr
    For Each arrEl In strArr
        If IsNumeric(arrEl) Then

            'resize the numArr to hold a new value
            If numArr(0) <> 0 Then ReDim Preserve numArr(0 To UBound(numArr) + 1)

            'write the value
            numArr(UBound(numArr)) = arrEl
        End If
    Next arrEl

    strtok = numArr(token - 1)

End Function
公共函数strtok(strIn作为字符串,delim作为字符串,token作为整数)作为字符串
'通过delim在位置处输出字符串来拆分strIn
Dim strArr As Variant数组以拆分初始字符串
Dim numArr()作为双精度数组,只保存数值
Dim arrEl作为数组的变量元素
“加油
strArr=拆分(strIn,delim)
'初始努马尔()
雷迪姆·努马尔(0到0)
'通过strArr中的每个元素循环
对于strArr中的每个arrEl
如果是数字(arrEl),则
'调整numArr的大小以保留新值
如果numArr(0)0,则ReDim Preserve numArr(0到UBound(numArr)+1)
'写入值
努马尔(乌邦(努马尔))=arrEl
如果结束
下一个阿雷尔
strtok=numArr(令牌-1)
端函数

您可以为此使用Excel内置的“文本到列”功能

突出显示列
A
并转到数据>>文本到列。选择“分隔符”,然后选择“空格”作为分隔符。单击finish,它将按空间分割数据并将其写入相邻列


对于VBA UDF,您可以使用超级方便的
SPLIT()
string方法,该方法将通过分隔符将字符串拆分为数组。然后选择您需要的位置:

Public Function strtok(strIn As String, delim As String, token As Integer) As String
    'Split the <strIn> by the <delim> outputting the string at position <token>
    strtok = Split(strIn, delim)(token - 1)    
End Function
按空格拆分时,将返回
A1
值第一个位置的字符串。如果将其放入
B1
中,则可以使用
Column()
使其更具动态性,以便只需将公式左右拖动即可:

=strtok($A1," ",Column()-1)
=TRIM(MID(SUBSTITUTE(TRIM(MID($A1,MIN(FIND({1,2,3,4,5,6,7,8,9,0},$A1&1234567890)),999))," ",REPT(" ",999)),999*(COLUMN(A1)-1)+1,999))

以下是对上述函数的编辑,该函数将由delim拆分,然后仅使用拆分中的数值重建数组,然后输出从数值数组请求的令牌:

Public Function strtok(strIn As String, delim As String, token As Integer) As String
    'Split the strIn by the delim outputting the string at position <token>

    Dim strArr As Variant 'array to split the initial string
    Dim numArr() As Double 'array to hold just numeric values
    Dim arrEl As Variant 'Element for the array

    'fill strArr
    strArr = Split(strIn, delim)

    'initial numArr()
    ReDim numArr(0 To 0)

    'Loop through each element in the strArr
    For Each arrEl In strArr
        If IsNumeric(arrEl) Then

            'resize the numArr to hold a new value
            If numArr(0) <> 0 Then ReDim Preserve numArr(0 To UBound(numArr) + 1)

            'write the value
            numArr(UBound(numArr)) = arrEl
        End If
    Next arrEl

    strtok = numArr(token - 1)

End Function
公共函数strtok(strIn作为字符串,delim作为字符串,token作为整数)作为字符串
'通过delim在位置处输出字符串来拆分strIn
Dim strArr As Variant数组以拆分初始字符串
Dim numArr()作为双精度数组,只保存数值
Dim arrEl作为数组的变量元素
“加油
strArr=拆分(strIn,delim)
'初始努马尔()
雷迪姆·努马尔(0到0)
'通过strArr中的每个元素循环
对于strArr中的每个arrEl
如果是数字(arrEl),则
'调整numArr的大小以保留新值
如果numArr(0)0,则ReDim Preserve numArr(0到UBound(numArr)+1)
'写入值
努马尔(乌邦(努马尔))=arrEl
如果结束
下一个阿雷尔
strtok=numArr(令牌-1)
端函数

对于纯配方溶液,在单元格B1中,反复复制:

=strtok($A1," ",Column()-1)
=TRIM(MID(SUBSTITUTE(TRIM(MID($A1,MIN(FIND({1,2,3,4,5,6,7,8,9,0},$A1&1234567890)),999))," ",REPT(" ",999)),999*(COLUMN(A1)-1)+1,999))

对于纯配方溶液,在单元格B1中,反复复制:

=strtok($A1," ",Column()-1)
=TRIM(MID(SUBSTITUTE(TRIM(MID($A1,MIN(FIND({1,2,3,4,5,6,7,8,9,0},$A1&1234567890)),999))," ",REPT(" ",999)),999*(COLUMN(A1)-1)+1,999))

您可以使用excel中的“文本到列”功能,方法是使用tab或“.”分隔符,而不是编写宏。尽管如前所述,“文本到列”可能是一个好主意(您似乎将空格和冒号作为分隔符…还有其他吗??)。。。什么是有效的手机号码。。。任何数字字符串。。。只有那些不是以9999开头的。。。其他?您可以使用excel中的“文本到列”功能,方法是使用tab或“.”分隔符,而不是编写宏。尽管如前所述,“文本到列”可能是一个好主意(您似乎将空格和冒号作为分隔符…还有其他吗??)。。。什么是有效的手机号码。。。任何数字字符串。。。只有那些不是以9999开头的。。。其他?是否可以编辑代码以仅保留数字字符串?所以,
=strtok(A1,“,1)
将导致9810642882,`strtok(A3,”,1)将返回9910077711?两个数字都是数字而不是字符串?喜欢编辑。当他们请求一个数组中不存在的数字时会发生什么?ie=strtok(A4,“,3)?最后一行会出错。如果ubound(numArr)<(token-1)然后/strtok=“”/Else/strtok=numArr(token-1)/End If失败时,您可以输入类似的内容,不输出任何内容。是否可以编辑代码以仅保留数字字符串?所以,
=strtok(A1,“,1)
将导致9810642882,`strtok(A3,”,1)将返回9910077711?两个数字都是数字而不是字符串?喜欢编辑。当他们请求一个数组中不存在的数字时会发生什么?ie=strtok(A4,“,3)?最后一行会出错。如果ubound(numar)<(token-1)然后/strtok=“”/Else/strtok=numar(token-1)/End If,则可以加入类似的内容,以便在失败时不输出任何内容