Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2010, 00:44   #1
Malyshka
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 16
Восклицание Обработка строк

Определить количество слов в заданном предложении, заканчивающихся заданной буквой.. Помогите, буду очень признательна
Malyshka вне форума Ответить с цитированием
Старый 13.12.2010, 01:07   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Sub LastChar()
  s = InputBox("предложение? ")
  ch = InputBox("последняя буква?")
  For i = 0 To UBound(Split(s, " "))
    If Right(Split(s, " ")(i), 1) = ch Then c = c + 1
  Next
  MsgBox c & " слов заканчивается на " & ch, vbOKOnly, "В преложении: " & s
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 13.12.2010, 01:09   #3
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Предложение в переменную, переменную в массив по пробелам (Split()), перебор - анализ буквы - счётчик.
Можно обойтись без переменной.

Добавлю - посмотрел код Игоря - если использовать InputBox, то без переменной не получится.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 13.12.2010 в 01:12.
Hugo121 вне форума Ответить с цитированием
Старый 13.12.2010, 01:24   #4
vikttur
Участник клуба
 
Регистрация: 16.05.2010
Сообщений: 1,249
По умолчанию

Формула массива:
Цитата:
{=СУММ(--(A2=ПСТР(A1;ПОИСК("/";ПОДСТАВИТЬ(A1&" ";" ";"/";СТРОКА(A1:ИНДЕКС(A1:A100;ДЛСТР(A1 )-ДЛСТР(ПОДСТАВИТЬ(A1;" ";""))+1))))-1;1)))}
А1 - текст, А2 - искомая буква.
vikttur вне форума Ответить с цитированием
Старый 13.12.2010, 02:11   #5
ZORRO2005
Форумчанин
 
Аватар для ZORRO2005
 
Регистрация: 26.11.2006
Сообщений: 584
По умолчанию

Еще вариант:
Вложения
Тип файла: rar Последн буква_2.rar (3.3 Кб, 26 просмотров)

Последний раз редактировалось ZORRO2005; 13.12.2010 в 02:29.
ZORRO2005 вне форума Ответить с цитированием
Старый 13.12.2010, 09:26   #6
vikttur
Участник клуба
 
Регистрация: 16.05.2010
Сообщений: 1,249
По умолчанию

Второй лучше
vikttur вне форума Ответить с цитированием
Старый 13.12.2010, 10:38   #7
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

А мне больше нравится вариант от IgorGO. Только я бы добавил удаление "лишних" пробелов:
Код:
s = Application.Trim(s)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 22.12.2010, 01:33   #8
Malyshka
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 16
По умолчанию

Благодарна за помощь, но мы не используем таких операторов и функций((( Вот пример похожей задачи. пробовала сделать по аналогии, но не получается(((
Предложением будем называть любой набор символов. «Слова» в
предложении разделяются пробелом. Найти первое слово, начинающееся заданной буквой.
Решение задачи основывается на поиске начала и конца «слова» в предложении.
Используется следующий алгоритм: (i+1)-й – номер первой буквы «слова» - это когда (i+1)-й
символ пробел, а i-й символ НЕ пробел; i-й – номер последней буквы «слова» - это когда i-й
символ НЕ пробел, а (i+1)-й символ пробел.
Private Sub CB_Res_Click()
Dim R_Str As String, Res As String
Dim Simb As String, rs As String
Dim N_Let As Integer, i As Integer
Dim k0 As Integer, k1 As Integer
Dim Ok As Boolean ' =True- слово найдено, False - нет
R_Str = TB_Str.Text
R_Str = LTrim(R_Str) ' Убираем пробелы в начале строки
R_Str = RTrim(R_Str) ' Убираем пробелы в конце строки
N_Let = Len(R_Str) ' Длина строки
Simb = TB_Simb.Text ' Буква для поиска
Ok = Mid(R_Str, 1, 1) = Simb ' Это буква первого слова?
If Ok Then
k0 = 1 ' Если - да, то k0 = 1
Else ' Просматриваем предложение и ищем начало слова
For i = 1 To N_Let - 1
If (Mid(R_Str, i, 1) = " ") And _
(Mid(R_Str, i + 1, 1) <> " ") Then ' Нашли начало слова
rs = Mid(R_Str, i + 1, 1) ' выделяем первую букву слова
Ok = rs = Simb ' Совпадение есть?
If Ok Then ' Если - да, то
k0 = i + 1 ' k0=i+1 - Номер буквы
Exit For ' Выход из цикла
End If
End If
Next i
End If
If Ok Then ' Если совпадение было, то ищем конец слова
For i = k0 + 1 To N_Let - 1
If Mid(R_Str, i, 1) <> " " And _
Mid(R_Str, i + 1, 1) = " " Then ' Нашли конец слова
k1 = i ' Номер буквы
If Ok Then Exit For
End If
Next i
End If
If Ok Then
If k1 = 0 Then k1 = N_Let ' т.е. это последнее слово
Res = Mid(R_Str, k0, k1 - k0 + 1)
TB_Res.Text = Res
Else
TB_Res.Text = "Нет такого слова"
End If
End Sub
Malyshka вне форума Ответить с цитированием
Старый 22.12.2010, 02:15   #9
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

я пугаюсь таких длинных процедур...
Код:
Sub start()
  Dim s As String, ch As String, n As Long
  s = "Благодарна за помощь, но мы не используем таких операторов и функций((( Вот пример похожей задачи. пробовала сделать по аналогии, но не получается((("
  ch = "а"
  MsgBox "Количество слов, которые закончилось на """ & ch & """ = " & CNT(1, s, ch)
End Sub

Function CNT(p1 As Long, s As String, c As String) As Long
  p1 = InStr(p1, s, " ")
  If p1 = 0 Then
    CNT = IIf(Right(s, 1) = c, 1, 0)
  Else
    CNT = IIf(Mid(s, p1 - 1, 1) = c, 1, 0) + CNT(p1 + 1, s, c)
  End If
End Function
у функции CNT один существенный недостаток, если слово заканчивается не пробелом, а каким-то знаком, то будет неправильно посчитано.
если в предложении из примера посчитать слова, которые закончились на "и", таких слов окажется 1 - это слово и, хотя в преложении есть слова задачи и аналогии, которые строго говоря следовало бы засчитать как соответствующие.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 22.12.2010 в 02:24.
IgorGO вне форума Ответить с цитированием
Старый 24.12.2010, 23:04   #10
EugeneS
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 472
По умолчанию

пример через регулярные выражения. Текст в ячейке А1

Код:
Sub RegExp_use5()
Dim obj As Object
Set obj = CreateObject("VBScript.regexp")
idata = Application.InputBox("Укажите букву", Type:=2)
If Len(idata) > 1 Then Exit Sub
With obj
    .Global = True
    .Pattern = "[а-яА-Я]+" & idata & "[^а-яА-Я]"
If obj.test([a1]) = True Then
    Set objmatch = obj.Execute([a1])
Else
    MsgBox "Не найдено ни одного слова оканчивающегося на букву " & idata
    Exit Sub
End If
MsgBox "В предложении найдено " & objmatch.Count & " слов(a) оканчивающихся на букву " & idata
End With: End Sub
EugeneS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка строк Тигран001 Помощь студентам 7 28.04.2010 23:42
Обработка строк Тигран001 Паскаль, Turbo Pascal, PascalABC.NET 2 24.04.2010 11:34
Обработка строк Vad56 Помощь студентам 1 03.12.2009 23:26
Обработка строк в C++ defol-777 Помощь студентам 1 12.03.2009 18:10