Страницы: 1
RSS
Подсчет заданной комбинации символов в ячейке
 
Всем здрасти, надеюсь Вы поможите разобраться.  
Обрисую что нужно - есть ячейка с данными, которые к примеру помечены "*" или "**", и нужно вот чтоб excel сам просчитал сколько таких совпадений в данной ячейке будет.    
Что касается когда помечено только одним символом, то в прикрепленном файле считает, но он не понимает если задать комбинацию символов ("**"), помогите плиз.
 
счет букв "п"  
=ДЛСТР(A4)-ДЛСТР(ПОДСТАВИТЬ(A4;"п";))  
Счет сочетания "про":  
=ДЛСТР(A4)-ДЛСТР(ПОДСТАВИТЬ(A4;"про";))/3  
 
В общем случае:  
=(ДЛСТР(A4)-ДЛСТР(ПОДСТАВИТЬ(A4;ссылка;)))/ДЛСТР(ссылка),  
где "ссылка" - ссылка на ячейку с искомым.  
 
Аккуратнее со знаками "*" и "?". В Excel эти символы служат знаками подстановки и обозначают:  
"?" - один любой символ;  
"*" - все символы.  
Например:  
"??п" - саП, коП, пуП;  
"п*" -Поп, Получка, Перекатиполе.  
"*уп?" - крУПа, пУПс.
 
А в виде макроса не подскажите как это реализовать мою задачку и именно чтоб подсчитывались либо спецсимволы "*;" или "**;", как показано в примере. Мне не нужно искать какие-то буквы, именно загвоздка в том, чтоб найти и посчитать совпадения, отмеченные каким-либо спецсимволом (к примеру с помощью *)
 
Function LetterNum&(rng As Range, lett$)  
   LetterNum = UBound(Split(rng.Value, lett))  
End Function
 
Хотя * найдёт и в **... Не годятся такие пометки. Или на regexp нужно делать.  
Я пас.
 
В примере: "необходимо чтоб подсчет велся только нужной комбинации символов"  
НУЖНАЯ комбинация - это какая?
 
можно с помощью instr, она не понимает спецсимволы.
Я сам - дурнее всякого примера! ...
 
Я так понял Вам надо было строчку  
Mid(rng.Value, i, 1)  
заменить на  
Mid(rng.Value, i, Len(lett$))  
 
но решение Hugo просто класс - такого подхода я еще не встречал. +1  
________________________  
khafizovtt@gmail.com
Учимся сами и помогаем другим...
 
Да не, подход со сплитом давно известен.  
Но в этом случае  не годится, не отличает один символ от двух.
 
На регулярных  
Private Const regSymbols As String = "\^$*+-?.()|{},[]"
Private FRegExp As Object  
 
Public Function SymbolCount(ByVal Text As String, ByVal Symbol As String, ByVal Repeat As Long) As Long  
   Symbol = Trim$(Symbol): If Len(Symbol) > 1 Then Err.Raise vbObjectError + 1  
   If FRegExp Is Nothing Then  
       Set FRegExp = CreateObject("VBScript.RegExp")  
       FRegExp.Global = True  
   End If  
   If InStr(regSymbols, Symbol) > 0 Then Symbol = "\" & Symbol  
   FRegExp.Pattern = Symbol & "{" & CStr(Repeat) & "}"  
   SymbolCount = FRegExp.Execute(Text).Count  
End Function  
 
Пример для использования  
=SymbolCount(A4;"*";2)
 
Function LetterNum&(rng As Range, lett$)  
   Dim c&, i&  
   On Error Resume Next  
   s = rng.Value  
   c = 0  
   Do While InStr(Mid(s, 2), lett) > 0  
       If InStr(Mid(s, 2), lett + lett) = InStr(Mid(s, 2), lett) Then  
           s = Mid(s, InStr(Mid(s, 2), lettlett + lett) + 2 * Len(lett))  
       Else  
           s = Mid(s, InStr(Mid(s, 2), lett) + Len(lett))  
           c = c + 1  
       End If  
   Loop  
 
   LetterNum = c  
End Function  
________________________  
khafizovtt@gmail.com
Учимся сами и помогаем другим...
 
Увы, для одиночного символа вариант не учёл  
Private Const regSymbols As String = "\^$*+-?.()|{},[]"
Private FRegExp As Object  
 
Public Function SymbolCount(ByVal Text As String, ByVal Symbol As String, ByVal Repeat As Long) As Long  
   Dim sPattern As String  
   Symbol = Trim$(Symbol): If Len(Symbol) > 1 Then Err.Raise vbObjectError + 1  
   If FRegExp Is Nothing Then  
       Set FRegExp = CreateObject("VBScript.RegExp")  
       FRegExp.Global = True  
   End If  
   If InStr(regSymbols, Symbol) > 0 Then Symbol = "\" & Symbol  
   If Repeat = 1 Then  
       sPattern = "[^" & Symbol & "]" & Symbol & "[^" & Symbol & "]"
   Else  
       sPattern = Symbol & "{" & CStr(Repeat) & "}"  
   End If  
     
   FRegExp.Pattern = sPattern  
   SymbolCount = FRegExp.Execute(Text).Count  
End Function
 
Почему-то одиночную "р" считает верно, а с "*" врёт! Пишет 3 - а ведь их 4!
 
видимо последнюю звездочку не считает
Учимся сами и помогаем другим...
 
Хотя помоголо  
SymbolCount = FRegExp.Execute(Text & " ").Count  
:)
 
Упс, тогда вот так поменяем, чтоб и в начале и в конце работало  
   If Repeat = 1 Then  
       sPattern = "(^|[^" & Symbol & "])" & Symbol & "([^" & Symbol & "]|$)"
   Else  
       sPattern = Symbol & "{" & CStr(Repeat) & "}"  
   End If
 
Если речь только о звездочках:  
Function FindSymb(ByVal txt$, ByVal CountSymb&) As Long  
   With CreateObject("VBScript.regexp"): .Global = True  
   .Pattern = "(^|[^\*])\*{" & CountSymb & "}([^\*]|$)"
   FindSymb = IIf(.test(txt$), .Execute(txt$).Count, 0)  
   End With  
End Function
Я сам - дурнее всякого примера! ...
Страницы: 1
Читают тему
Наверх