Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Нужна функция, убирающая ненужные данные из ячейки Excel / 25 сообщений из 29, страница 1 из 2
31.10.2006, 11:02:46
    #34093340
Гость123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
Добрый день, всем!
Помогите пожалуйста с кодом. В ячейке в Excel есть текст, к примеру МБП (ТЕХ),
нужна такая функция, которая оставит в этой ячейке только то, что в скобках, т.е. в данном случае должно получиться ТЕХ.
Наполнение ячеек каждый раз разное, единственное, текст в скобках будет всегда.
Очень давно работала со строковыми функциями, поэтому подзастряла. :(
...
Рейтинг: 0 / 0
31.10.2006, 12:06:28
    #34093658
Ivan33
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
Данные - Текст по столбцам - Указать разделитель "(" и сделать второй раз так, но для разделитея ")".
...
Рейтинг: 0 / 0
31.10.2006, 12:23:32
    #34093734
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
Вставьте в книгу модуль и туда эту функцию
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Public Function InBrackets(strValue$) As String
    On Error Resume Next
    Dim intPos1%, intPos2%, strResult$
    intPos1 = InStr( 1 , strValue, "(")
    intPos2 = InStr( 1 , strValue, ")")
    InBrackets = Mid(strValue, intPos1 +  1 , intPos2 - intPos1 -  1 )
End Function
Хотя наверно можно и строковыми функциями самого Excel'а, но я не знаю аналога Mid в Excel, поэтому и VBA
...
Рейтинг: 0 / 0
31.10.2006, 12:32:50
    #34093776
Гость123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
orunbek
Вы меня спасли, просто супер, то что и нужно было. :))
Спасибо огромное.

Ivan33
Даже не задумалась о таком варианте... ;)) Правда, мне больше подходит вариант orunbek -а. Но все равно, спасибо.
...
Рейтинг: 0 / 0
31.10.2006, 15:46:27
    #34094725
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
Есть еще такая вещь как Regular Expressions - мощная, но сложная для изучения:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/2380d458-3366-402b-996c-9363906a7353.asp

Например, пишем след. функцию в стандартном модуле:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Function ClearName(ByVal strText As String, ByVal strPattern As String) As String
    Dim RegExp As Object
    Set RegExp = CreateObject("vbscript.regexp")
    With RegExp
        .Pattern = strPattern
        .Global = True
        ClearName = .Replace(Trim(strText), "")
    End With
End Function

И используем так:

1. на листе (где [A1] содержит "МБП (ТЕХ)")

=ClearName(A1, "(.{1,}\()|(\))" )

2. в коде

Код: plaintext
x = ClearName(Range("A1"), "(.{1,}\()|(\))")

Получается универсальная функция на все случаи жизни... остается только научиться писать "паттерны".

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
31.10.2006, 16:37:03
    #34095002
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
KL (XL)

1. на листе (где [A1] содержит "МБП (ТЕХ)")

=ClearName(A1, "(.{1,}\()|(\))" )

2. в коде

Код: plaintext
x = ClearName(Range("A1"), "(.{1,}\()|(\))")

Получается универсальная функция на все случаи жизни... остается только научиться писать "паттерны".

KL
[MVP - Microsoft Excel]
Можешь пояснить почему маска "(.{1,}\()|(\))"
для данного случая я бы написал так ".+\(.+\)"
.+ - любое количество любого символа
\( - символ "("
...
Рейтинг: 0 / 0
31.10.2006, 17:16:36
    #34095200
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
vkodorМожешь пояснить почему маска "(.{1,}\()|(\))"
для данного случая я бы написал так ".+\(.+\)"
.+ - любое количество любого символа
\( - символ "("1. я не специаллист в Regular Expressions
2. твоя маска уничтожит весь стринг, т.к. условие выполняется для всего стринга
3. моя маска была сделана наспех путем переделки уже существовавшей и она явно не оптимальна
4. моя маска состоит из двух альтернативных масок (.{1,}\() и (\)) разделенных символом | соответствующим "или"
5. если не ошибаюсь, предложенный тобой .+ точно эквивалентен .{1,} , но покороче и означает не любое количество любого символа, а от одного любого символа и более
6. при ближайшем рассмотрении я склоняюсь к др. версии маски "(.{0,}\()|(\).{0,})"

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
31.10.2006, 17:24:26
    #34095247
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
KL (XL)6. при ближайшем рассмотрении я склоняюсь к др. версии маски "(.{0,}\()|(\).{0,})"

Ну или следуя твоей логике (упрощения): "(.*()|(\).*)"

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
31.10.2006, 17:27:22
    #34095263
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
Предыдущее сообщение получилось внутри цитаты:

Ну или следуя твоей логике (упрощения): "(.*()|(\).*)"

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
31.10.2006, 18:14:29
    #34095452
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
KL (XL)1. я не специаллист в Regular ExpressionsЭто заметно :)
KL (XL)6. при ближайшем рассмотрении я склоняюсь к др. версии маски "(.{0,}\()|(\).{0,})" Тоже не верно.


Во первых, надо переписать макрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Function ClearName(ByVal strText As Range, ByVal strPattern As String, ByVal intSection As Integer) As String
    Dim RegExp As Object
    Set RegExp = CreateObject("vbscript.regexp")
    With RegExp
        .Pattern = strPattern
        .Global = True
        ClearName = .Replace(strText, "$" & intSection)
    End With
End Function
А во вторых, запускать так:
Код: plaintext
=ClearName(A1, "(.+)\((.+)\)",  2 )
Это если с минимальными переделками исходного макроса. А если делать его универсальным, то делать надо так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Function RegExpReplace(ByVal rCell As Range, ByVal rPattern As String, ByVal rReplaceWith As String) As String
    Dim RegExp As Object
    Set RegExp = CreateObject("vbscript.regexp")
    With RegExp
        .Pattern = rPattern
        .Global = True
        RegExpReplace = .Replace(rCell, rReplaceWith)
    End With
End Function
Ну и для взятия первого текста в скобках запускать соответственно:
Код: plaintext
=RegExpReplace(A1, "^(.+)\((.+)\)", "$2")
...
Рейтинг: 0 / 0
31.10.2006, 18:38:23
    #34095530
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
White OwlВо первых, надо переписать макрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Function ClearName(ByVal strText As Range, ByVal strPattern As String, ByVal intSection As Integer) As String
    Dim RegExp As Object
    Set RegExp = CreateObject("vbscript.regexp")
    With RegExp
        .Pattern = strPattern
        .Global = True
        ClearName = .Replace(strText, "$" & intSection)
    End With
End Function
Надо - слово красивое, а чем вызвано это "надо"? Есть сбои в работе функции? Неэффективное расходование ресурсов? Что?

White OwlА во вторых, запускать так:
Код: plaintext
=ClearName(A1, "(.+)\((.+)\)",  2 )
И опять-таки, чем конкретно не угодил подход с "(.*()|(\).*)" ?

White OwlЭто если с минимальными переделками исходного макроса. А если делать его универсальным, то делать надо так:Имелась ввиду универсальность очистки а не замены. Но, конечно, чем универсальней, тем лучше :-)

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
31.10.2006, 18:55:12
    #34095573
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
KL (XL)Надо - слово красивое, а чем вызвано это "надо"? Есть сбои в работе функции?Ага :)
Запусти свою функцию на такие тексты:
AAA (BBB)
AAA (BBB
AAA BBB)
AA(A (BBB)
И посмотри в каких случаях она вернет BBB а когда она вернет что-то иное.

KL (XL)И опять-таки, чем конкретно не угодил подход с "(.*()|(\).*)" ?Этот паттерн вообще не расшифровывается в что-то осмысленное :)
А если имелся в виду "(.*\()|(\).*)", то это расшифровывается в поиск строки завершающейся символом ( или поиск строки завершающеейся симовлом ) . Причем жадный поиск.
В любом случае, к задаче поиска текста в скобках этот паттерн тоже не имеет отношения.
...
Рейтинг: 0 / 0
31.10.2006, 19:32:09
    #34095649
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
White OwlЗапусти свою функцию на такие тексты:
AAA (BBB)
AAA (BBB
AAA BBB)
AA(A (BBB)
И посмотри в каких случаях она вернет BBB а когда она вернет что-то иное.Ну ты уж тогда, на всякий пожарный, запусти свое решение с этими и с этим:
(ТЕХ)
если перед скобкой ничего нет, то твоя маска проигнорирует скобки. Так что в этом случае мне больше нравится: "(.*)\((.*)\)"

White OwlЭтот паттерн вообще не расшифровывается в что-то осмысленное :)
А если имелся в виду "(.*\()|(\).*)", то это расшифровывается в поиск строки завершающейся символом ( или поиск строки завершающеейся симовлом ) . Причем жадный поиск.
В любом случае, к задаче поиска текста в скобках этот паттерн тоже не имеет отношения.Мне почему-то начинает казаться, что ты мне друг по несчастью (в смысле не специалист по Regular Expressions) ;-)

здесь http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/2380d458-3366-402b-996c-9363906a7353.asp написано:

* Matches the preceding character or subexpression zero or more times. For example, zo* matches "z" and "zoo". * is equivalent to {0,}.

И что самое смешное, работает прекрасно. А жадный поиск так по-моему здесь как раз к месту.

И еще к разговору об универсальности...

1. Похоже, твой код позволяет выбирать одну маску за раз, а в моем проще работать с альтернативными масками. Но я наверняка просто не нашел как это делать в твоем решении.

2. Если третий параметр (intSection) ошибочный, то твой код возвращает нонсенс, а не ошибку.

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
31.10.2006, 20:49:07
    #34095765
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
White OwlAAA (BBB
AAA BBB)

Пожалуй, если рассматривать задачу, как оставить то, что внутри скобок (как у автора), то тут твой подход лучше. Я как-то зафиксировался на удалении всего, что за скобками, поэтому при эксперименте с примерами я видел все как в верхней части прилагаемой картинки :-) Остальные пункты пока в силе.
...
Рейтинг: 0 / 0
31.10.2006, 21:36:13
    #34095831
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
KL (XL)(ТЕХ)
если перед скобкой ничего нет, то твоя маска проигнорирует скобки.Она не проигнорирует, она просто не найдет искомого. Впрочем, если исправить мой паттерн на ^(.*)\((.+)\) то оно и с (ТЕХ) справится правильно :)

KL (XL) Так что в этом случае мне больше нравится: "(.*)\((.*)\)" В скобках должно что-то быть! А ты разрешаешь ничему не быть... Впрочем это уже вопрос постановки задачи :)

KL (XL)Мне почему-то начинает казаться, что ты мне друг по несчастью (в смысле не специалист по Regular Expressions) ;-)ээээ... вообще-то, я не на использование звездочки указывал, а на не уместное использование | . Паттерн (.*\()|(\).*) при Replace на пустую строку убьет все до первой открывающей скобки и все после первой закрывающей. Он не будет проверять на парность скобок.


KL (XL)2. Если третий параметр (intSection) ошибочный, то твой код возвращает нонсенс, а не ошибку.Ну вообще-то, для задач типа "вычленить кусок текста" я предпочитаю работать с коллекцией SubMatches. Replace не использую почти никогда, так что навскидку сочиняя для него паттерн могу и наврать :)
...
Рейтинг: 0 / 0
31.10.2006, 22:01:33
    #34095869
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
White OwlВпрочем, если исправить мой паттерн на ^(.*)\((.+)\) то оно и с (ТЕХ) справится правильно :)Это я уже заметил

White OwlВ скобках должно что-то быть! А ты разрешаешь ничему не быть... Впрочем это уже вопрос постановки задачи :)Пожалуй.

White Owlээээ... вообще-то, я не на использование звездочки указывал, а на не уместное использование | . Паттерн (.*\()|(\).*) при Replace на пустую строку убьет все до первой открывающей скобки и все после первой закрывающей. Он не будет проверять на парность скобок.Аааа! Тады ой. Но все-таки, согласись, что это "расшифровывается во что-то осмысленное", а имено в другое видение задачи :-)

White OwlНу вообще-то, для задач типа "вычленить кусок текста" я предпочитаю работать с коллекцией SubMatches. Replace не использую почти никогда, так что навскидку сочиняя для него паттерн могу и наврать :)Поскольку я чаще использую Excel, то с текстом работать приходится редко. Т.ч. RegExp редко бывает нужен, а Replace это единственное, что я использую.
В любом случае спасибо, что заставил поглубже копнуть - сам бы наверняка не собрался.

Кстати, как поживает твоя конкурсная работа? По-моему мы deadline забыли установить. Я тут играю с Solver и такое ощущение, что уже близок к относительно быстрому решению - 14 отрезков за 50 секунд. Правда еще не установил последний constraint

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
31.10.2006, 22:21:35
    #34095894
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
KL (XL)Аааа! Тады ой. Но все-таки, согласись, что это "расшифровывается во что-то осмысленное", а имено в другое видение задачи :-) Это не другое видение задачи, это уже совершенно другая задача.

KL (XL)Кстати, как поживает твоя конкурсная работа? По-моему мы deadline забыли установить. Я тут играю с Solver и такое ощущение, что уже близок к относительно быстрому решению - 14 отрезков за 50 секунд. Правда еще не установил последний constraint Да никак, забыл я про нее :( Щас вернемся :)
...
Рейтинг: 0 / 0
31.10.2006, 22:40:23
    #34095906
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
White Owl KL (XL)Кстати, как поживает твоя конкурсная работа?...Да никак, забыл я про нее :( Щас вернемся :)От-жежь, некоторые заманють да бросють!!! Да расслабься. Посколько особого энтузязизьма идея не вызвала, то и спешить некуда. Если чего сделаешь - повесь - я добавлю твой код в свою коллекцию примеров и буду увековечивать белую сову на всех форумах :-)))) Ну и соответственно, если я чего накумекаю, тоже подвешу.

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
01.11.2006, 10:25:25
    #34096404
Гость123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
Ну так же нечестно! :)
KL (XL) , White Owl - вы же меня заинтересовали!!!
Теперь еще нужно с этим разобраться ;). Попробую доползти до кода (особенно до масок!) на выходных.
Спасибо огромное за примеры - буду смотреть.

З.Ы. Конкретно в моей постановке задачи - скобки будут всегда, причем парные.
...
Рейтинг: 0 / 0
01.11.2006, 13:59:54
    #34097508
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
Гость123Ну так же нечестно! :)
KL (XL) , White Owl - вы же меня заинтересовали!!!
Теперь еще нужно с этим разобраться ;). Попробую доползти до кода (особенно до масок!) на выходных.
Спасибо огромное за примеры - буду смотреть.

З.Ы. Конкретно в моей постановке задачи - скобки будут всегда, причем парные.это до кучи
Есть ли в формулах Excel регулярные выражения?




White OwlВпрочем, если исправить мой паттерн на ^(.*)\\((.+)\\) то оно и с (ТЕХ) справится правильно :)


Правильно ли я понимаю?
^(.*) - ни одного или более символа



KL (XL) - так я и не понял что означают фигурные скобки
...
Рейтинг: 0 / 0
01.11.2006, 14:35:35
    #34097672
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
vkodorПравильно ли я понимаю?
^(.*) - ни одного или более символа MSDN ^
Matches the position at the beginning of an input string except when used in a bracket expression where it negates the character set. To match the ^ character itself, use \^.В этом случае ^ должен означать положение в начале текста (а не отрицание как внутри квадратных скобок)

vkodorKL (XL) - так я и не понял что означают фигурные скобки MSDN { }
Marks the beginning of a quantifier expression. To match these characters, use \{ and \}.

{n}
n is a nonnegative integer. Matches exactly n times. For example, 'o{2}' does not match the 'o' in "Bob," but matches the two o's in "food".

{n,}
n is a nonnegative integer. Matches at least n times. For example, 'o{2,}' does not match the "o" in "Bob" and matches all the o's in "foooood". ' o{1,}' is equivalent to 'o+'. 'o{0,}' is equivalent to 'o*' .

{n,m}
m and n are nonnegative integers, where n <= m. Matches at least n and at most m times. For example, "o{1,3}" matches the first three o's in "fooooood". 'o{0,1}' is equivalent to 'o?'. Note that you cannot put a space between the comma and the numbers.{ } содержат число или луч указывающий на кол-во повторов предшествующего символа.

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
01.11.2006, 14:52:13
    #34097759
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
KL (XL)
Понял. Спасибо.
...
Рейтинг: 0 / 0
08.11.2006, 15:44:50
    #34112856
Гость123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
В итоге я остановилась на таком варианте:
Код: plaintext
=RegExpReplace(A1; "^(.*?)\((.+)\)"; "$2")

Всем большое спасибо за помощь!

З.Ы. Регулярные выражения - это нечто - чуть голову себе не поломала. ;))))
...
Рейтинг: 0 / 0
08.11.2006, 16:59:20
    #34113229
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
Прошу прощенья за назойлдивость
"^(.*?)\((.+)\)"
^(.*?) = от начала строки до "(", любое количество любых символов
\( - далее скобка
(.+) - далее любое количество любых символов
\) - далее скобка
Я правильно понял?
И еще ни как не могу панять смысл аргумента rReplaceWith As String
.Replace(rCell, rReplaceWith) - в справке говорится
Function Replace(sourceString As String, replaceVar) _
As String

Метод Replace даёт возможность заменить все совпадения регулярного выражения строкой replaceVar.

т.е. вы все найденое заменяете на "$2" ?
...
Рейтинг: 0 / 0
08.11.2006, 19:38:40
    #34113781
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна функция, убирающая ненужные данные из ячейки Excel
vkodorПрошу прощенья за назойлдивость
"^(.*?)\((.+)\)"
^(.*?) = от начала строки до "(", любое количество любых символов
\( - далее скобка
(.+) - далее любое количество любых символов
\) - далее скобкаНе совсем так.
^(.*?)\( = взять группу из нуля или больше любых символов от начала строки завершающейся символом "открывающая скобка" причем последний символ из первой группы не является символом "открывающая скобка"
(.+)\) = взять вторую группу в которой один или больше любых символов после которой идет символ "закрывающая скобка". Причем после символа "закрывающая скобка" должен быть любой другой (либо конец строки). А конец группы может содержать любое количество закрывающих скобок.

vkodorт.е. вы все найденое заменяете на "$2" ?В общем да, только учти что Replace в данном случае делает замену НАЙДЕНОЙ подстроки.
То есть, если в строке источнике нету вообще пары открывающая-закрывающая скобка с хотя бы одним символом между ними, то Replace соответсвенно вообще не сделает никаких замен.
Ну то что $2 означает вторую группу ты понял? :)


2 Гость123:
Мне почему-то кажется, что жадность надо ставить в первой группе, а вторую наоборот не жадной делать. И конец строки тоже будет нелишним указать. В общем предлагаю переписать вот так:
^(.*)\((.+?)\)$
Ну конечно, это зависит от задачи.
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Нужна функция, убирающая ненужные данные из ячейки Excel / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]