Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何从精确的单元格中检索所有六位数字?_Excel_Vba - Fatal编程技术网

Excel 如何从精确的单元格中检索所有六位数字?

Excel 如何从精确的单元格中检索所有六位数字?,excel,vba,Excel,Vba,例如,我们的单元格包含: EWFS 410461, 501498, EFW406160 所以,我需要一个公式 410461 501498 406160 使用Right()函数并获取最右边的6个字符。例如: Right(cell.Value, 6) 其中,单元格是一些寻址相关单元格的范围变量 比如说 Dim cell As Range For Each cell In Range("B2:D2") ' change "B2:D2" to your actual range woth val

例如,我们的单元格包含:

EWFS 410461, 501498, EFW406160
所以,我需要一个公式

410461 501498 406160
使用
Right()
函数并获取最右边的6个字符。例如:

 Right(cell.Value, 6)
其中,
单元格
是一些寻址相关单元格的
范围
变量

比如说

Dim cell As Range
For Each cell In Range("B2:D2") ' change "B2:D2" to your actual range woth values
    Debug.Print Right(cell.Value, 6)
Next

考虑以下用户定义的函数:

Public Function GetNumbers(s As String) As String
    Dim L As Long, i As Long, wf As WorksheetFunction
    Set wf = Application.WorksheetFunction

    L = Len(s)
    For i = 1 To L
        If Mid(s, i, 1) Like "[A-Z]" Or Mid(s, i, 1) = "," Then Mid(s, i, 1) = " "
    Next i

    GetNumbers = wf.Trim(s)

End Function

所有数字都将以空格分隔的字符串返回

如果“E”、“W”、“F”和“S”是唯一必须去掉的字母,则可以避免VBA并使用替换()函数:

=TRIM(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B2,"E",""),"W",""),"F",""),"S",""),",",""))

如果您有Office 365,则可以使用以下数组公式:

=TEXTJOIN(" ",TRUE,IF((ISNUMBER(--MID(A1,ROW($XFD$1:INDEX(XFD:XFD,LEN(A1)-5)),6)))*(NOT(ISNUMBER(--MID(A1&";",ROW($XFD$1:INDEX(XFD:XFD,LEN(A1)-5)),7)))),MID(A1,ROW($XFD$1:INDEX(XFD:XFD,LEN(A1)-5)),6),""))
作为数组公式,必须在退出编辑模式时使用Ctrl-Shift-Enter而不是Enter确认

NDIGIT(UDF) Excel程式 样本数据

VBA代码
'******************************************************************************
'用途:从字符串中,返回带分隔符的数字组(数字)
“绳子。
"投入,
'SourceString-必需。要检查数字的字符串。
'NumberofDigits-可选。数字组中的位数。如果为0,
'返回所有数字组。默认值:0。
'TargetDelimiter-可选。返回字符串的分隔符。
'默认值:“”(空格)。
'******************************************************************************
函数NDigits(ByVal SourceString作为字符串_
可选ByVal NumberOfDigits,长度为0_
可选ByVal TargetDelimiter作为字符串=”)作为字符串
Dim i As Long“源字符串字符计数器
Dim strDel作为字符串“当前目标字符串”
'检查SourceString是否为空(“”)。退出,如果。NDigits=”“。
如果SourceString=“”,则退出函数
'循环通过SourceString的字符。
对于i=1到Len(SourceString)
'检查当前字符是否不是数字(#),然后替换为“”。
如果不是Mid(SourceString,i,1),那么_
Mid(源字符串,i,1)=“”
下一个
'注意:当VBA的修剪函数删除字符串前后的空格时,
'Excel的修剪功能还删除了冗余空间,即。
在单词之间不允许有多个空格。
'删除SourceString中的所有空格,但单词之间的单个空格除外。
strDel=Application.WorksheetFunction.Trim(SourceString)
'检查当前TargetString是否为空(“”)。退出,如果。NDigits=”“。
如果strDel=“”,则退出函数
如果TargetDelimiter不同于
““”不是一个数字(#)。
如果TargetDelimiter“”而不是像“#”这样的TargetDelimiter,则
strDel=WorksheetFunction.Substitute(strDel,“,TargetDelimiter)
如果结束
'检查NumberOfDigits是否大于0。
如果NumberOfDigits>0,则
Dim vnt作为变量的位数数组(节点数组)
Dim k As Long“节点数组元素计数器
'将数字组从当前目标字符串写入(拆分)节点数组。
vnt=Split(strDel,TargetDelimiter)
'将节点数组元素计数器重置为-1,因为节点数组是基于0的。
k=-1
'循环节点数组的元素(数字组)。
对于i=0到UBound(vnt)
'检查当前元素是否具有字符数(位数)
'等于NumberOfDigits。
如果Len(vnt(i))=NumberOfDigits,那么
'计数节点数组元素,即准备写入。
k=k+1
'将NOD数组的第i个元素写入第k个元素。
'注意:数据(数字组)可能被覆盖。
vnt(k)=vnt(i)
如果结束
下一个
'检查是否未找到NumberOfDigits大小的数字组。
'如果有,请退出。NDigits=”“。
如果k=-1,则退出函数
'将节点数组调整为节点数组元素计数,可能更小,
'由于找到的数字组数量较少,其大小为NumberOfDigits。
ReDim保存vnt(k)
'将节点数组的元素连接到当前目标字符串。
strDel=Join(vnt,TargetDelimiter)
如果结束
'将当前目标字符串写入ndigit。
NDigits=strDel
端函数
'******************************************************************************
'备注:数字组是字符串中的连续数字,例如。
'字符串“123 sdf jk 23 4”中有三个数字组:
'第一个数字是123,NumberOfDigits=3,第二个数字是23,NumberOfDigits=3
'NumberOfDigits=2,最后是4,其中NumberOfDigits=1。自从
'它们都有不同的位数,都将返回
'如果NumberOfDigits为0或省略,否则将只显示一个
”他回答。
'******************************************************************************

加里学生答案的细微变化:

Public Function GetNumbers2(s As String) As String
    Dim i As Long, elem As Variant

    For Each elem In Split(s, ",")
        For i = 1 To Len(elem)
            If Mid(elem, i, 1) Like "[0-9]" Then Exit For
        Next i
        GetNumbers2 = GetNumbers2 & " " & Application.WorksheetFunction.Trim(Mid(elem, i))
    Next
    GetNumbers2 = Trim(GetNumbers)
End Function
这个答案并不比其他分数为正的答案好,但我更喜欢用它来处理字符串中的字符。这将启用使用
Select语句干净组织的范围。这对于拒绝来自像我父母这样的简单用户的字符特别有用(我没有给他们的孙子取名为“4”)

下面是一个适用于OP的UDF,但也显示了如何利用与a组合来处理、大写/小写或任何其他特定字符:

Public Function GiveTheNumbers(theINPUT As String) As String
Dim p As Long, aCode As Long

For p = 1 To Len(theINPUT)

    aCode = Asc(Mid(theINPUT, p, 1)) 'converts string to an ascii integer

    Select Case aCode

        '32 is the ascii code for space bar. 48 to 57 is zero to nine.
        Case 32, 48 To 57
            GiveTheNumbers = GiveTheNumbers & Chr(aCode) 'Chr() converts integer back to string


        'the rest of these cases are not needed for the OP but I'm including for illustration
        Case 65 To 90
            'all upper case letters

        Case 97 To 122
            'all lower case letters

        Case 33, 64, 35, 36, 37, 42
            'my favorite characters of: !@#$%*

        Case Else
            'anything else

    End Select

Next p

End Function

我不认为这会满足用户的需求。当我想要最左边的6个字符时,我使用左边(A1,6),当我想要最右边的6个字符时,我使用右边(A1,6)…@SolarMike,这是一个非常好的捕获。谢谢编辑。@DisplayName投票被否决的不是我。只是一个FYI@ScottCraner,你评论了帮助,我在评论的“评论和帮助一个好的答案”部分提到了你。它总是这样吗?如果是这样,你可以
Public Function GiveTheNumbers(theINPUT As String) As String
Dim p As Long, aCode As Long

For p = 1 To Len(theINPUT)

    aCode = Asc(Mid(theINPUT, p, 1)) 'converts string to an ascii integer

    Select Case aCode

        '32 is the ascii code for space bar. 48 to 57 is zero to nine.
        Case 32, 48 To 57
            GiveTheNumbers = GiveTheNumbers & Chr(aCode) 'Chr() converts integer back to string


        'the rest of these cases are not needed for the OP but I'm including for illustration
        Case 65 To 90
            'all upper case letters

        Case 97 To 122
            'all lower case letters

        Case 33, 64, 35, 36, 37, 42
            'my favorite characters of: !@#$%*

        Case Else
            'anything else

    End Select

Next p

End Function