2016-08-14 16 views
2

Я хотел бы сосчитать все специальные символы (!% _ *? + -,) в ячейке.Учет конкретных символов в ячейке - Excel

Например:

enter image description here

С помощью этой формулы =LEN(D2)-LEN(SUBSTITUTE(D2;"!";"")) я могу рассчитывать только на один символ, но мне нужно рассчитывать несколько символов в одной ячейке ... есть способ, как настроить это?

Спасибо за помощь!

+0

Считаете ли вы «Регулярным»? См. [This] (http://stackoverflow.com/questions/22542834/how-to-use-regular-expressions-regex-in-microsoft-excel-both-in-cell-and-loops) для отличной отправной точки ... –

ответ

5

Использование только формул, а не VBA, это возможно с помощью следующие два подхода:

Рассмотрим текст в A1:

Первый подход:

Multiple вложенная SUBSTITUTE:

=LEN(A1)-LEN(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,",",""),"-",""),"+",""),"?",""),"*",""),"_",""),"%",""),"!","")) 

Второй подход:

Использование SUMPRDUKT для получения функции MID в контексте массива, чтобы каждый отдельный charachter строки в A1 по сравнению с каждым одним специальным символом:

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

как опция sumproduct со статическим массивом –

+0

Хорошее решение, отличное от VBA. См. [This] (https://www.owasp.org/index.php/Password_special_characters) для допустимых специальных символов (не уверен, что OP только хочет подсчитать символы, которые он задает ...) –

+0

Спасибо, его работа! – makaroN

0

Вот простой вариант я создал:

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 

Две точки:

  1. В редакторе VBA вам нужно установить References > Microsoft VBScript Regular Expressions 5.5
  2. Вы вызываете функцию в таблице, например, =CountSpecialCharacters(A2)
0

= 8 * LEN (D2) -LEN (ПОДСТАВИТЬ (D2; "!"; "")) - LEN (ПОДСТАВИТЬ (D2; "%"; "")) - LEN (ПОДСТАВИТЬ (D2, «ЗАКЛЮЧЕНИЕ (D2;« * »;« »)) -LEN (ЗАМЕЩЕНИЕ (D2;«? »;« »)) - LEN (ЗАМЕЩЕНИЕ (D2;« + »; ")) - LEN (ЗАМЕЩЕНИЕ (D2;" - ";" ")) - LEN (ЗАМЕЩЕНИЕ (D2;", ";" "))

5

Вы можете сделать это с помощью простой формулы массива:

=SUM(LEN(A2) - LEN(SUBSTITUTE(A2,Special_Characters,""))) 

Special_Characters - это список всех ваших специальных символов. Вы можете вручную ввести их в качестве константы массива, если вы предпочитаете:

=SUM(LEN(A2) - LEN(SUBSTITUTE(A2,{"%";"_";"*";"?";"+";"-";",";"!"},""))) 

но именованный диапазон кажется проще.


Для массива введите формула, после ввода формулу в ячейки или формулы бар, удерживая Ctrl + сдвига во время удара ввести.Если вы правильно это сделали , Excel поместит фигурные скобки {...} вокруг формулы.

enter image description here

Если вы предпочитаете решение 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