Страница: 1 |
Страница: 1 |
Вопрос: Помощь. Макрос, сравнение текст. ячеек в Excel
Добавлено: 05.10.04 20:07
Автор вопроса: alexey1729
Не программист, пишу, как понимаю.
В наследство досталась програмка-макрос в Excel где с помощью функции TRIM сравнивается содержимое текстовых ячеек (на предмет "эквивалентности"). Хотелось бы сделать усовершенствование, чтоб при сравнении идущие подряд пробелы считались за один. То есть:
"мама мыла раму"="мама мыла раму". В самом Excel есть функция СЖПРОБЕЛЫ, но макрос ее "не понимает".
Можно ли ее вызвать из тела макроса и как? Или может в VBA есть что-то подобное, какой-нибудь "усовершенствованный TRIM"?
Посоветуйте, если не сложно.
Спасибо.
Ответы
Всего ответов: 6
Номер ответа: 1
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #1
Добавлено: 05.10.04 23:32
1.Trim$ не является оператором сравнения. Он всего лишь удаляет пробелы в начале и конце предложения.
Тебе помогут 2 функции.. Для удобства они разбиты на 2 отдельные. Думаю, разберешься..
[CODE]Function dhTrimAll(ByVal strText As String, Optional fRemoveTabs As Boolean = True) As _
String
' Удаление лишних пробелов
Dim strTemp As String
Dim strOut As String
Dim intI As Integer
Dim strCh As String * 1
If fRemoveTabs Then
strText = dhTranslate(strText, vbTab, " ")
End If
strTemp = Trim(strText)
For intI = 1 To Len(strTemp)
strCh = Mid$(strTemp, intI, 1)
If Not (strCh = " " And Right$(strOut, 1) = " ") Then
strOut = strOut & strCh
End If
Next intI
dhTrimAll = strOut
End Function
Function dhTranslate(ByVal strIn As String, ByVal strMapIn As String, ByVal strMapOut _
As String, Optional fCaseSensitive As Boolean = True) As String
'Преобразует одни символы в другие
Dim intI As Integer
Dim intPos As Integer
Dim strChar As String * 1
Dim strOut As String
Dim intMode As Integer
If Len(strMapIn) > 0 Then
If fCaseSensitive Then
intMode = vbBinaryCompare
Else
intMode = vbTextCompare
End If
If Len(strMapOut) > 0 Then
strMapOut = Left$(strMapOut & String(Len(strMapIn), Right$(strMapOut, 1)), _
Len(strMapIn))
End If
For intI = 1 To Len(strIn)
strChar = Mid$(strIn, intI, 1)
intPos = InStr(1, strMapIn, strChar, intMode)
If intPos > 0 Then
strOut = strOut & Mid$(strMapOut, intPos, 1)
Else
strOut = strOut & strChar
End If
Next intI
End If
dhTranslate = strOut
End Function[/CODE]
Номер ответа: 2
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #2
Добавлено: 05.10.04 23:43
В результате вызова dhTrimAll(" Дядя Вася " - получишь "Дядя Вася". Также обрати внимание на регистр. Возможно, тебе еще понадобятся UCase$ или LCase$
И еще.. насколько я помню, в VBA все макросы имееют английское название. Именно его и надо вызывать в своем проекте. А русские названия встроенных макросов он не понимает.
Номер ответа: 3
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #3
Добавлено: 06.10.04 20:03
Чтобы узнать английское имя функции =СЖПРОБЕЛЫ() включи запись макроса, введи эту функцию, останови запись макроса, потом в редакторе VBA в тексте модуля, куда записался твой макрос, посмотри назвавние функции...
Номер ответа: 4
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #4
Добавлено: 06.10.04 20:15
У-у-у-пс! Эта встроенная функция Excel и называется TRIM, отсюда вся путаница и непонимание... В нормальном VB эта функция означает совсем не то, что =СЖПРОБЕЛЫ() alexey1729, если не найдется хорошего способа (в коде), то хотя-бы создавай макросом эту формулу на листе - в нужных местах...
Cells(1,1).FormulaR1C1 = "=TRIM(RC[1])"
Номер ответа: 5
Автор ответа:
alexey1729
Вопросов: 1
Ответов: 1
Профиль | | #5
Добавлено: 07.10.04 09:43
Спасибо за письмо.
Ваш вариант работает. Еще мне предложили такой, более короткий:
Function of_TrimAll(ByVal as_Text As String) As _
String
 im ls_Out As String
 im ll_pos As Long
ls_Out = Trim(as_Text)
ll_pos = InStr(ls_Out, " "
While (ll_pos > 0)
ls_Out = Replace(ls_Out, " ", " "
ll_pos = InStr(ls_Out, " "
Wend
of_TrimAll = ls_Out
End Function
Номер ответа: 6
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #6
Добавлено: 08.10.04 00:42
Если ты внимательно присмотришься,то поймешь,что мои пример имеет явное преимущество.
Он удаляет кроме пробелов еще и символы ТАВ,которые тоже могут присутствовать в исходной строке и выглядеть как обычные пробелы.