计算单元格中的特定字符数-Excel

计算单元格中的特定字符数-Excel,excel,vba,Excel,Vba,我想计算单元格中的所有特殊字符(!%*?+-,) 例如: 使用这个公式,=LEN(D2)-LEN(替换为(D2;“!”;”)我只能数一个字符,但我需要在单个单元格中数多个字符……有没有办法调整 谢谢你的帮助 以下是我创建的一个简单版本: Function CountSpecialCharacters(rng As Range) As String Dim regEx As New RegExp, matches As MatchCollection With regEx

我想计算单元格中的所有特殊字符(!%*?+-,)

例如:

使用这个公式,
=LEN(D2)-LEN(替换为(D2;“!”;”)
我只能数一个字符,但我需要在单个单元格中数多个字符……有没有办法调整


谢谢你的帮助

以下是我创建的一个简单版本:

Function CountSpecialCharacters(rng As Range) As String
    Dim regEx As New RegExp, matches As MatchCollection

    With regEx
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .Pattern = "[^a-zA-Z0-9]" '~~~> this counts any character not a to z or a number
    End With

    Set matches = regEx.Execute(rng)

    CountSpecialCharacters = matches.Count
End Function
两点:

  • 在VBA编辑器中,需要设置
    References>Microsoft VBScript正则表达式5.5
  • 您可以在电子表格上调用该函数,例如,
    =CountSpecialCharacters(A2)

  • =8*LEN(D2)-LEN(代换)(D2;“!”;”)-LEN(代换)(D2;“%”;”)-LEN(代换)(D2;“*”;”)-LEN(代换)(D2;“?”;”)-LEN(代换)(D2;“+”;)-LEN(代换)(D2;“-”;)-LEN(代换)(D2;“;”,“;”)/p>仅使用公式,不使用VBA,以下两种方法是可行的:

    考虑
    A1
    中的文本:

    第一种方法:

    多个嵌套的
    替换

    =LEN(A1)-LEN(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,",",""),"-",""),"+",""),"?",""),"*",""),"_",""),"%",""),"!",""))
    
    第二种方法:

    使用
    SUMPRDUKT
    获取数组上下文中的
    MID
    函数,以获取
    A1
    中字符串的每个字符,并与每个特殊字符进行比较:

    =SUMPRODUCT(--(MID(A1,ROW($1:$1000),1)={"!","%","_","*","?","+","-",","}))
    

    您可以使用简单的数组公式执行此操作:

    =SUM(LEN(A2) - LEN(SUBSTITUTE(A2,Special_Characters,"")))
    
    特殊字符
    是列出所有特殊字符的范围。如果愿意,可以手动将其作为数组常量输入:

    =SUM(LEN(A2) - LEN(SUBSTITUTE(A2,{"%";"_";"*";"?";"+";"-";",";"!"},"")))   
    
    但命名范围似乎更简单


    数组,请在输入后输入公式 将公式输入单元格或公式栏,按住 按住ctrl+shift键的同时按enter键。如果你这么做了 正确地说,Excel将在公式周围放置大括号

    如果您喜欢VBA解决方案,我建议使用下面的代码。您需要修改
    .Pattern
    ,以包含任何其他不想计数的字符。在下面的代码中,任何不是大写或小写字母或数字的字符都将被视为特殊字符

    Option Explicit
    Function SpecialChars(S As String) As Long
        Dim RE As Object
    Set RE = CreateObject("vbscript.regexp")
    With RE
        .Global = True
        .Pattern = "[^A-Za-z0-9]"
        SpecialChars = Len(S) - Len(.Replace(S, ""))
    End With
    End Function
    

    你考虑过正则表达式吗?请参阅,以了解一个很好的起点…例如使用静态数组listGood非VBA解决方案的sumproduct选项。请参阅以获取允许的特殊字符(不确定OP是否只想计算他指定的字符数…)您好@AxelRichter,您是否测试了第二个公式?这对我不起作用。我建议
    =SUMPRODUCT({1}*NOT(匹配(中间(A1,行($1:$1000),1),{“!”,“%,”,“?”,“+”,“-”,“,“},0)))
    @Ulli Schmid:是的,我已经测试过了,它可以工作。用德文Excel,它是:
    =SUMMENPRODUKT(--)(TEIL(A6;ZEILE($1:$1000);1)={“!”%.”“+”,“}”)
    。注意,数组文字必须是行向量。啊,是的,这很有意义。谢谢。{“!”\“%“\”*“\”?“\”+“\”-“\”,“}为我工作。