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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2011, 08:23   #1
agregator
Форумчанин
 
Аватар для agregator
 
Регистрация: 09.05.2009
Сообщений: 369
По умолчанию Укоротить запись поиска позиции слов в ячейке.

Здравствуйте уважаемые программисты. Написал код, который меняет определённые слова (ТО-, гур, акб, кпп, рдв, гтр, рвд, гтк, мод, ртс, цом и т.д.) на заглавные (и первую букву в строке на заглавную).
Подскажите как можно укоротить запись поиска позиции этих слов.
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim oCell As Range
For Each oCell In Target
On Error GoTo NoText
x = InStr(oCell, "то-")
If x = 0 Then x = InStr(oCell, "гур")
If x = 0 Then x = InStr(oCell, "двс")
If x = 0 Then x = InStr(oCell, "акб")
If x = 0 Then x = InStr(oCell, "кпп")
If x = 0 Then x = InStr(oCell, "рдв")
If x = 0 Then x = InStr(oCell, "гтр")
If x = 0 Then x = InStr(oCell, "рвд")
If x = 0 Then x = InStr(oCell, "гтк")
oCell = UCase(Left(oCell.Text, 1)) & Right(oCell.Text, Len(oCell.Text) - 1)
oCell = Mid(oCell, 1, x - 1) & UCase(Mid(oCell, x, 3)) & Right(oCell.Text, (Len(oCell.Text) - x - 2))
Next
Application.EnableEvents = True
Exit Sub
NoText:
Application.EnableEvents = True
Exit Sub
End Sub
agregator вне форума Ответить с цитированием
Старый 08.04.2011, 09:33   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Не нравится...
Слов типа АйГУР не будет заводится?
Может лучше Splitом бить и перебирать по списку соответствия?
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 08.04.2011, 09:39   #3
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Можно так:
Код:
For Each x In Array("ТО-", "ГУР", "АКБ", "КПП", "РДВ", "ГТР", "РВД", "ГТК")
    Target.Replace x, x
Next
Но если, например, в ячейке будет написано "огурец", то получится "оГУРец". Это нормально?
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 08.04.2011, 09:40   #4
agregator
Форумчанин
 
Аватар для agregator
 
Регистрация: 09.05.2009
Сообщений: 369
По умолчанию

Hugo121, АйГУР не бедет.
agregator вне форума Ответить с цитированием
Старый 08.04.2011, 10:02   #5
agregator
Форумчанин
 
Аватар для agregator
 
Регистрация: 09.05.2009
Сообщений: 369
По умолчанию

SAS888, пока проблем не было (записываю работы по ремонту автомобилей). А можно этого избежать ("оГУРец")?
agregator вне форума Ответить с цитированием
Старый 08.04.2011, 10:09   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Можно - с помощью SAS888:
Код:
Option Explicit
Option Compare Text

Private Sub Worksheet_Change(ByVal Target As Range)
Dim a, xx, x

Application.EnableEvents = False
a = Split(Target)
For xx = 0 To UBound(a)
For Each x In Array("ТО-", "ГУР", "АКБ", "КПП", "РДВ", "ГТР", "РВД", "ГТК")
If a(xx) = x Then a(xx) = x
Next
Next
a(0) = Application.Proper(a(0))
Target = Join(a, " ")

Application.EnableEvents = True
End Sub
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 08.04.2011 в 10:15. Причина: Добавил (и первую букву в строке на заглавную).
Hugo121 вне форума Ответить с цитированием
Старый 08.04.2011, 10:29   #7
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Hugo121
1. Вы подразумеваете, что Target есть одна ячейка? Иначе, a = Split(Target) использовать не получится.
2. Вся прелесть предложенного мной кода именно в том, что не нужно перебирать все ячейки, входящие в диапазон Target.
3. Где гарантия, что, например, "ТО-" (как и другее фрагменты) отделено пробелами?

agregator
Цитата:
А можно этого избежать ("оГУРец")?
На этот вопрос ответ известен только Вам, т.к. данных, для предотвращения данной ситуации мало. Нужны доп. критерии оценки.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 08.04.2011, 10:32   #8
agregator
Форумчанин
 
Аватар для agregator
 
Регистрация: 09.05.2009
Сообщений: 369
По умолчанию

Hugo121, здорово. Я сам попробовал, но остановился, т.к. не знал как узнать сколько элементов в масиве (UBound). Может посоветуете какой нибудь справочник. Типа этого.
agregator вне форума Ответить с цитированием
Старый 08.04.2011, 10:33   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Да, точно, это упустил... Но это можно добавить в обработку, если нужно. Зато "оГУРецов и айГУРов" не будет.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 08.04.2011, 14:07   #10
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
Зато "оГУРецов и айГУРов" не будет.
Да. Не будет. Но зато останутся "то-123" (вместо желаемого "ТО-123") и т.п.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Фокусировка на ячейке после поиска sergantikus Microsoft Office Excel 7 17.02.2011 20:27
программа ассоциативного поиска вхождений слов Тант Зин Помощь студентам 0 26.05.2010 14:37
Укоротить запись условия. agregator Microsoft Office Excel 2 14.04.2010 17:52
Как вернуть значение, используя функцию поиска позиции и смещения? PARTOS Microsoft Office Excel 7 28.12.2009 12:18
помогите с организацией поиска слов в richedit BuT@JL Общие вопросы Delphi 1 30.04.2009 15:23