是否有内置的excel函数可用于检查:“;10“;(或任何数字)在;1,3,5-9,13,16-20,23“;?

是否有内置的excel函数可用于检查:“;10“;(或任何数字)在;1,3,5-9,13,16-20,23“;?,excel,count,Excel,Count,正如标题中提到的,我想知道是否有任何方法可以使用excel中的内置函数来查看单元格是否包含特定的数字,并计算单元格中的总数。该单元格可以包含由comas分隔的数字列表,例如,“1,4,7”或范围“10-25”或两者的组合。查看打印屏幕 不,没有,但你可以这样做,比如: 函数NumberInValues(数字为字符串,值为字符串)为布尔值 作为整数的Dim n n=CInt(数字) 将部分()设置为字符串 零件=拆分(值,“,”) 对于i=LBound(零件)至UBound(零件) 零件(i)=替

正如标题中提到的,我想知道是否有任何方法可以使用excel中的内置函数来查看单元格是否包含特定的数字,并计算单元格中的总数。该单元格可以包含由comas分隔的数字列表,例如,“1,4,7”或范围“10-25”或两者的组合。查看打印屏幕


不,没有,但你可以这样做,比如:

函数NumberInValues(数字为字符串,值为字符串)为布尔值
作为整数的Dim n
n=CInt(数字)
将部分()设置为字符串
零件=拆分(值,“,”)
对于i=LBound(零件)至UBound(零件)
零件(i)=替换(零件(i),“”,“”)
下一个
Dim p()作为字符串
首先将Dim设置为整数
最后变暗为整数
将tmp设置为整数
对于i=LBound(零件)至UBound(零件)
p=拆分(第(i)部分,“-”)
'如果只有一个条目,请检查是否相等:
如果UBound(p)-LBound(p)=0,则
如果n=CInt(p(LBound(p)),那么
NumberInValues=True
退出功能
如果结束
其他的
'对照值的范围进行检查:假设该条目是第一个,而不是最后一个
'检查最后一个>第一个。
first=CInt(p(LBound(p)))
last=CInt(p(UBound(p)))

如果n>=first和nNo,则没有,但您可以这样做,例如:

函数NumberInValues(数字为字符串,值为字符串)为布尔值
作为整数的Dim n
n=CInt(数字)
将部分()设置为字符串
零件=拆分(值,“,”)
对于i=LBound(零件)至UBound(零件)
零件(i)=替换(零件(i),“”,“”)
下一个
Dim p()作为字符串
首先将Dim设置为整数
最后变暗为整数
将tmp设置为整数
对于i=LBound(零件)至UBound(零件)
p=拆分(第(i)部分,“-”)
'如果只有一个条目,请检查是否相等:
如果UBound(p)-LBound(p)=0,则
如果n=CInt(p(LBound(p)),那么
NumberInValues=True
退出功能
如果结束
其他的
'对照值的范围进行检查:假设该条目是第一个,而不是最后一个
'检查最后一个>第一个。
first=CInt(p(LBound(p)))
last=CInt(p(UBound(p)))

如果n>=first和n实现这一点的关键部分是创建一个包含第一列中表示的所有数字的单个数字列表或数组

一旦完成,检查包含的内容或进行计数就变得很简单了

此VBA例程返回一个数字列表

Option Explicit
Function createNumberList(s)
    Dim AL As Object
    Dim v, w, x, y, I As Long
    
Set AL = CreateObject("System.Collections.ArrayList")

v = Split(s, ",")
For Each w In v

'If you need to avoid duplicate entries in the array
'uncomment the If Not lines below and remove the terminal double-quote

    If IsNumeric(w) Then
        'If Not AL.contains(w) Then _"
        AL.Add CLng(w)
    Else
        x = Split(w, "-")
        For I = x(0) To x(1)
            'If Not AL.contains(I) Then _"
            AL.Add I
        Next I
    End If
Next w
createNumberList = AL.toarray
End Function
如果您的数值范围可能重叠,则需要创建一个唯一的数组。您可以通过更改
AL.Add
函数来首先检查列表中是否包含该数字。在上面的代码中,您可以看到该修改的说明

然后,您可以在表中使用此自定义项:

C2: =OR($B2=createNumberList($A2))
D2: =COUNT(createNumberList($A2))

实现这一点的关键部分是创建一个包含第一列中表示的所有数字的单个数字列表或数组

一旦完成,检查包含的内容或进行计数就变得很简单了

此VBA例程返回一个数字列表

Option Explicit
Function createNumberList(s)
    Dim AL As Object
    Dim v, w, x, y, I As Long
    
Set AL = CreateObject("System.Collections.ArrayList")

v = Split(s, ",")
For Each w In v

'If you need to avoid duplicate entries in the array
'uncomment the If Not lines below and remove the terminal double-quote

    If IsNumeric(w) Then
        'If Not AL.contains(w) Then _"
        AL.Add CLng(w)
    Else
        x = Split(w, "-")
        For I = x(0) To x(1)
            'If Not AL.contains(I) Then _"
            AL.Add I
        Next I
    End If
Next w
createNumberList = AL.toarray
End Function
如果您的数值范围可能重叠,则需要创建一个唯一的数组。您可以通过更改
AL.Add
函数来首先检查列表中是否包含该数字。在上面的代码中,您可以看到该修改的说明

然后,您可以在表中使用此自定义项:

C2: =OR($B2=createNumberList($A2))
D2: =COUNT(createNumberList($A2))

下面是一个可能的公式解决方案,如注释中所建议的使用filterxml:

=LET(split,FILTERXML("<s><t>+"&SUBSTITUTE(A2,",","</t><t>+")&"</t></s>","//s/t"),
leftn,LEFT(split,FIND("-",split&"-")-1),
rightn,IFERROR(RIGHT(split,LEN(split)-FIND("-",split)),leftn),
SUM(rightn-leftn+1))
因为问题中的所有范围都与Excel范围完全相同,不是吗

和(包括一页)


下面是一个可能的公式解决方案,如注释中所建议的使用filterxml:

=LET(split,FILTERXML("<s><t>+"&SUBSTITUTE(A2,",","</t><t>+")&"</t></s>","//s/t"),
leftn,LEFT(split,FIND("-",split&"-")-1),
rightn,IFERROR(RIGHT(split,LEN(split)-FIND("-",split)),leftn),
SUM(rightn-leftn+1))
因为问题中的所有范围都与Excel范围完全相同,不是吗

和(包括一页)


不,在新的LAMBDA之外,没有一个内置的函数组合可以实现这一点。我说“也许”是因为如果是的话,我无法理解。但对于任何其他标准公式都绝对不可能。您可以使用VBA或Power QueryI我猜您可以使用filterxml在逗号上拆分它,然后在连字符上再次拆分,这些行上的某些内容没有内置的函数组合可以在新的LAMBDA之外执行此操作。我说“也许”是因为如果是的话,我无法理解。但对于任何其他标准公式都是绝对不可能的。您可以使用VBA或Power Query。我猜您可以使用filterxml在逗号上拆分它,然后在连字符上再次拆分,这些行上的某些内容非常感谢!非常感谢你!妈的,真了不起!非常感谢。我尝试使用内置公式构建自己的解决方案,但当我意识到它将有10亿个“字符”长时,我放弃了。谢谢Karl!我想这是公式和VBA之间的一个转折点。该死,太令人印象深刻了!非常感谢。我尝试使用内置公式构建自己的解决方案,但当我意识到它将有10亿个“字符”长时,我放弃了。谢谢Karl!我想是在公式和VBA之间。
Function includes(s As String, m As String) As Boolean

Dim isect As Range
    
s = Replace(s, ",", ",A")

s = Replace(s, "-", ":A")

s = "A" & s

Set isect = Application.Intersect(Range(s), Range("A" & m))

includes = Not (isect Is Nothing)

End Function