powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Нужна функция, убирающая ненужные данные из ячейки Excel
25 сообщений из 29, страница 1 из 2
Нужна функция, убирающая ненужные данные из ячейки Excel
    #34093340
Гость123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, всем!
Помогите пожалуйста с кодом. В ячейке в Excel есть текст, к примеру МБП (ТЕХ),
нужна такая функция, которая оставит в этой ячейке только то, что в скобках, т.е. в данном случае должно получиться ТЕХ.
Наполнение ячеек каждый раз разное, единственное, текст в скобках будет всегда.
Очень давно работала со строковыми функциями, поэтому подзастряла. :(
...
Рейтинг: 0 / 0
Нужна функция, убирающая ненужные данные из ячейки Excel
    #34093658
Фотография Ivan33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Данные - Текст по столбцам - Указать разделитель "(" и сделать второй раз так, но для разделитея ")".
...
Рейтинг: 0 / 0
Нужна функция, убирающая ненужные данные из ячейки Excel
    #34093734
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вставьте в книгу модуль и туда эту функцию
Код: 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
Нужна функция, убирающая ненужные данные из ячейки Excel
    #34093776
Гость123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
orunbek
Вы меня спасли, просто супер, то что и нужно было. :))
Спасибо огромное.

Ivan33
Даже не задумалась о таком варианте... ;)) Правда, мне больше подходит вариант orunbek -а. Но все равно, спасибо.
...
Рейтинг: 0 / 0
Нужна функция, убирающая ненужные данные из ячейки Excel
    #34094725
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще такая вещь как 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
Нужна функция, убирающая ненужные данные из ячейки Excel
    #34095002
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)

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

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

2. в коде

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

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

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

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

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

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

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

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

KL (XL)И опять-таки, чем конкретно не угодил подход с "(.*()|(\).*)" ?Этот паттерн вообще не расшифровывается в что-то осмысленное :)
А если имелся в виду "(.*\()|(\).*)", то это расшифровывается в поиск строки завершающейся символом ( или поиск строки завершающеейся симовлом ) . Причем жадный поиск.
В любом случае, к задаче поиска текста в скобках этот паттерн тоже не имеет отношения.
...
Рейтинг: 0 / 0
Нужна функция, убирающая ненужные данные из ячейки Excel
    #34095649
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Нужна функция, убирающая ненужные данные из ячейки Excel
    #34095765
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlAAA (BBB
AAA BBB)

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

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

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


KL (XL)2. Если третий параметр (intSection) ошибочный, то твой код возвращает нонсенс, а не ошибку.Ну вообще-то, для задач типа "вычленить кусок текста" я предпочитаю работать с коллекцией SubMatches. Replace не использую почти никогда, так что навскидку сочиняя для него паттерн могу и наврать :)
...
Рейтинг: 0 / 0
Нужна функция, убирающая ненужные данные из ячейки Excel
    #34095869
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Нужна функция, убирающая ненужные данные из ячейки Excel
    #34095894
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)Аааа! Тады ой. Но все-таки, согласись, что это "расшифровывается во что-то осмысленное", а имено в другое видение задачи :-) Это не другое видение задачи, это уже совершенно другая задача.

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

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

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

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




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


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



KL (XL) - так я и не понял что означают фигурные скобки
...
Рейтинг: 0 / 0
Нужна функция, убирающая ненужные данные из ячейки Excel
    #34097672
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Нужна функция, убирающая ненужные данные из ячейки Excel
    #34097759
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)
Понял. Спасибо.
...
Рейтинг: 0 / 0
Нужна функция, убирающая ненужные данные из ячейки Excel
    #34112856
Гость123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В итоге я остановилась на таком варианте:
Код: plaintext
=RegExpReplace(A1; "^(.*?)\((.+)\)"; "$2")

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

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

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

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

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


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


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