Подсчёт количества слов (регистр)

Программирование на Visual Basic for Applications
Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Подсчёт количества слов (регистр)

Сообщение Терминатор » 19.09.2005 (Пн) 12:44

До этого количество слов в ячейке, подсчитывал
с помощью формулы.
=ДЛСТР(СЖПРОБЕЛЫ(A1))-ДЛСТР(ПОДСТАВИТЬ(СЖПРОБЕЛЫ(A1);" ";""))+1
то есть, если между слов есть пробел, значить слова два.
например. Коля Дима - два слова.
Но пользователь начал писать так - КоляДима.
Теперь думаю, как же это подсчитать количество
заглавных букв?
То есть если есть две буквы верхнего
регистра, значить слова два. Как решить, пусть хоть формулой, хоть VBA?

Ну а на тот случай если пользователь начнёт вообще писать
Колядима - тогда уж нет, пусть сам разгребает...
Hasta la vista, baby!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.09.2005 (Пн) 12:49

Формулами Excel наверное не обойтись.
Если писать макрос, то самый простой способ следующий:
1. Определить строковую константу, в которой будут перечислены все символы, которыми начинаются слова. Типа Const strWords As String = " ,.:;-()_АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ".
2. Пройтись циклом по всей строке, перебирая символы. Если InStr(strWords, Mid$(Text, Pos, 1))>0, то увеличить счетчик cntWords на один.
2.1. Чтобы исключить подсчет слов, если разделители слов идут подряд, можно создать переменную posPrev, которая будет ссылаться на последний разделитель (позиция символа). Если posPrev = Pos-1, то не считать.
3. Значение cntWords будет равно количеству слов в тексте.

Можно оптимизировать пункт 2, перебирая не все символы, а находя один из strWords, но это необязательно.
Lasciate ogni speranza, voi ch'entrate.

K.Sergey
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 11.10.2004 (Пн) 0:42
Откуда: Санкт-Петербург

Сообщение K.Sergey » 19.09.2005 (Пн) 13:01

Эта функция возвращает количество символов верхнего регистра в ячейке (строке):
Код: Выделить всё
Function ZZZ(MyString As String)
Dim i As Integer
Dim Col As Byte
For i = 1 To Len(MyString)
    If Mid(MyString, i, 1) = UCase(Mid(MyString, i, 1)) Then Col = Col + 1
Next i
ZZZ = Col
End Function
Life is what happens to us when we are planning to do something else...

Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Сообщение Терминатор » 19.09.2005 (Пн) 14:23

K.Sergey, спасибо, функция это то что надо.
Alibek, я рад, что Вы уделили внимание, но Ваш вариант всё-таки выглядит громоздко.
Hasta la vista, baby!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.09.2005 (Пн) 14:45

Смотря как ее написать.
Код: Выделить всё
Function WordCount(ByVal Text As String) As Long
Const strWords As String = " ,.:;-()_АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim Pos As Long, Pos0 As Long, Counter As Long, C As String
Pos0 = -1
For Pos = 1 To Len(Text)
  C = Mid$(Text, Pos, 1)
  If InStr(strWords, C) > 0 Then
    If Pos0+1 < Pos Then Counter = Counter + 1
    Pos0 = Pos
  End If
Next Pos
WordCount = Counter
End Function
Lasciate ogni speranza, voi ch'entrate.

K.Sergey
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 11.10.2004 (Пн) 0:42
Откуда: Санкт-Петербург

Сообщение K.Sergey » 19.09.2005 (Пн) 15:07

Терминатор, подставь в мою функцию любой знак, не являющийся буквой (точку, тире, цифру, пробел и т.д.). Результат - фукция распознает его как заглавную букву (только сейчас дошло что у символов нет верхнего регистра :idea: ). В этом плане код, который предложил alibek более гибкий (если можно так сказать) - поддается настройке.
Life is what happens to us when we are planning to do something else...

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 19.09.2005 (Пн) 15:24

Можно написать Mid(MyString, i, 1) <> LCase(Mid(MyString, i, 1)) :)
Быть... или не быть. Вот. В чём вопрос?

K.Sergey
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 11.10.2004 (Пн) 0:42
Откуда: Санкт-Петербург

Сообщение K.Sergey » 19.09.2005 (Пн) 15:38

uhm писал(а):Можно написать Mid(MyString, i, 1) <> LCase(Mid(MyString, i, 1)) :)

Старею, видимо...
Life is what happens to us when we are planning to do something else...

Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Сообщение Терминатор » 19.09.2005 (Пн) 15:59

Ты смотрика, Mid(MyString, i, 1) , а я то ходил всё вокруг да около!

Alibek,, я должен оговориться, что это для меня было бы громоздко, а для Вас, как говорится - "дело мастера боится."
Hasta la vista, baby!


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 81

    TopList  
cron