В таблице в колонке 1(A) есть Наименование товара "Мяч Champion кожаный для футбола" .Как сделать так,что бы в колонку 2(B) попадало название производителя ,в данном случае это слово Champion(Правда бывает что название производителя может быть в разных местах по разному(где на втором,где на третьем, а где и на других местах.Но думаю это уже нюансы и придётся эту формулу править в нужных местах)
В таблице в колонке 1(A) есть Наименование товара "Мяч Champion кожаный для футбола" .Как сделать так,что бы в колонку 2(B) попадало название производителя ,в данном случае это слово Champion(Правда бывает что название производителя может быть в разных местах по разному(где на втором,где на третьем, а где и на других местах.Но думаю это уже нюансы и придётся эту формулу править в нужных местах)himmik
Формулисты напишут формулу, где нужное слово будет выделяться по пробелам, а я могу UDF предложить (здесь на форуме похоже что ещё не было):
Code
Function Substring(Текст As String, Символ_разделитель As String, _ Начальный_Номер_фрагмента As Long, Конечный_Номер_фрагмента As Long) As String '--------------------------------------------------------------------------------------- ' URL : http://www.planetaexcel.ru/tip.php?aid=54 ' Purpose : Выделяет из текста субстринг/и, ориентируясь по символам-разделителям ' Notes : Substring(текст; символ_разделитель; Начальный_Номер_фрагмента, Конечный_Номер_фрагмента), где ' текст - текст, который делим ' символ_разделитель - символ, который надо считать разделителем фрагментов ' Начальный_Номер_фрагмента - порядковый номер фрагмента, с которого нужна выборка ' Конечный_Номер_фрагмента - порядковый номер фрагмента, по который нужна выборка '--------------------------------------------------------------------------------------- On Error Resume Next Dim sArr() As String, li As Long sArr = Split(Application.Trim(Текст), Символ_разделитель) If Конечный_Номер_фрагмента > 0 Then Начальный_Номер_фрагмента = Начальный_Номер_фрагмента - 1 Конечный_Номер_фрагмента = Конечный_Номер_фрагмента - 1 For li = Начальный_Номер_фрагмента To Конечный_Номер_фрагмента Substring = IIf(li = Начальный_Номер_фрагмента, sArr(li), Substring & _ Символ_разделитель & sArr(li)) Next li Else Substring = Split(Application.Trim(Текст), _ Символ_разделитель)(Начальный_Номер_фрагмента - 1) End If End Function
Формулисты напишут формулу, где нужное слово будет выделяться по пробелам, а я могу UDF предложить (здесь на форуме похоже что ещё не было):
Code
Function Substring(Текст As String, Символ_разделитель As String, _ Начальный_Номер_фрагмента As Long, Конечный_Номер_фрагмента As Long) As String '--------------------------------------------------------------------------------------- ' URL : http://www.planetaexcel.ru/tip.php?aid=54 ' Purpose : Выделяет из текста субстринг/и, ориентируясь по символам-разделителям ' Notes : Substring(текст; символ_разделитель; Начальный_Номер_фрагмента, Конечный_Номер_фрагмента), где ' текст - текст, который делим ' символ_разделитель - символ, который надо считать разделителем фрагментов ' Начальный_Номер_фрагмента - порядковый номер фрагмента, с которого нужна выборка ' Конечный_Номер_фрагмента - порядковый номер фрагмента, по который нужна выборка '--------------------------------------------------------------------------------------- On Error Resume Next Dim sArr() As String, li As Long sArr = Split(Application.Trim(Текст), Символ_разделитель) If Конечный_Номер_фрагмента > 0 Then Начальный_Номер_фрагмента = Начальный_Номер_фрагмента - 1 Конечный_Номер_фрагмента = Конечный_Номер_фрагмента - 1 For li = Начальный_Номер_фрагмента To Конечный_Номер_фрагмента Substring = IIf(li = Начальный_Номер_фрагмента, sArr(li), Substring & _ Символ_разделитель & sArr(li)) Next li Else Substring = Split(Application.Trim(Текст), _ Символ_разделитель)(Начальный_Номер_фрагмента - 1) End If End Function
Public Function ExtractString(S As String) Dim i As Integer, str As String For i = 1 To Len(S) If InStr(1, "QWERTYUIOPASDFGHJKLZXCVBNM,.-<>=*/ ", UCase(Mid(S, i, 1))) <> 0 Then str = str & Mid(S, i, 1) Next ExtractString = Application.Trim(str) End Function
В приложении обе UDF.
Если по-английски - есть такая UDF:
Code
Public Function ExtractString(S As String) Dim i As Integer, str As String For i = 1 To Len(S) If InStr(1, "QWERTYUIOPASDFGHJKLZXCVBNM,.-<>=*/ ", UCase(Mid(S, i, 1))) <> 0 Then str = str & Mid(S, i, 1) Next ExtractString = Application.Trim(str) End Function
Игорь, а может упростить UDF Substring до безобразия:
Code
Function Substring(Текст, Номер_фрагмента, Optional Символ_разделитель = " ") As String ' Выделяет из текста n-ный субстринг, ориентируясь по символам-разделителям On Error Resume Next Substring = Split(Application.Trim(Текст), Символ_разделитель)(Номер_фрагмента - 1) End Function
Игорь, а может упростить UDF Substring до безобразия:
Code
Function Substring(Текст, Номер_фрагмента, Optional Символ_разделитель = " ") As String ' Выделяет из текста n-ный субстринг, ориентируясь по символам-разделителям On Error Resume Next Substring = Split(Application.Trim(Текст), Символ_разделитель)(Номер_фрагмента - 1) End Function
Да я просто проглядел, что нужно выделять именно английские субстринги. Увидал, что Игорь в 23:08 предложил более длинный вариант той же UDF, которой я давно пользуюсь, ну и постанул... А уже потом увидал, что дискуссия ушла в другую сторону.
Да я просто проглядел, что нужно выделять именно английские субстринги. Увидал, что Игорь в 23:08 предложил более длинный вариант той же UDF, которой я давно пользуюсь, ну и постанул... А уже потом увидал, что дискуссия ушла в другую сторону.Alex_ST
Function ball(s As String) As String With CreateObject("vbscript.regexp") .IgnoreCase = True .Pattern = "\b[a-z-]*" ball = .Execute(s)(0) End With End Function
Еще вариант (пробный)
Code
Function ball(s As String) As String With CreateObject("vbscript.regexp") .IgnoreCase = True .Pattern = "\b[a-z-]*" ball = .Execute(s)(0) End With End Function
Alex_ST, а тот Substring() когда-то таким коротким и был, но со временем вырос Я правда не помню, кто его нарастил (не я), но так лучше - одну лишнюю цифру в парамерах поставить несложно, но зато в некоторых случаях не приходится городить пулемётную очередь из функций и пробелов
Сергей - про английские - берёт по одному символу и смотрит: есть ли этот символ в строке "QWERTYUIOPASDFGHJKLZXCVBNM,.-<>=*/ ". Если есть - собирает в выходную строку. На RegExp вероятно можно покороче, но ещё более непонятно написать P.S. Пока писал - вот и RegExp выше
Alex_ST, а тот Substring() когда-то таким коротким и был, но со временем вырос Я правда не помню, кто его нарастил (не я), но так лучше - одну лишнюю цифру в парамерах поставить несложно, но зато в некоторых случаях не приходится городить пулемётную очередь из функций и пробелов
Сергей - про английские - берёт по одному символу и смотрит: есть ли этот символ в строке "QWERTYUIOPASDFGHJKLZXCVBNM,.-<>=*/ ". Если есть - собирает в выходную строку. На RegExp вероятно можно покороче, но ещё более непонятно написать P.S. Пока писал - вот и RegExp выше
Сергей - про английские - берёт по одному символу и смотрит: есть ли этот символ в строке
Игорь, я про вот это:
Code
Function Substring(Текст, Номер_фрагмента, Optional Символ_разделитель = " ") As String ' Выделяет из текста n-ный субстринг, ориентируясь по символам-разделителям On Error Resume Next Substring = Split(Application.Trim(Текст), Символ_разделитель)(Номер_фрагмента - 1) End Function
спрашивал...
Quote (Hugo)
Сергей - про английские - берёт по одному символу и смотрит: есть ли этот символ в строке
Игорь, я про вот это:
Code
Function Substring(Текст, Номер_фрагмента, Optional Символ_разделитель = " ") As String ' Выделяет из текста n-ный субстринг, ориентируясь по символам-разделителям On Error Resume Next Substring = Split(Application.Trim(Текст), Символ_разделитель)(Номер_фрагмента - 1) End Function
Я когда это отвечал (т.е. когда набирал ответ) про именно английский слова не слышал - поэтому привязался к позиции. Не стирать ведь теперь уже кучу связанных постов...
Я когда это отвечал (т.е. когда набирал ответ) про именно английский слова не слышал - поэтому привязался к позиции. Не стирать ведь теперь уже кучу связанных постов...Hugo
Формула массива: =ПСТР(A2;МИН(ЕСЛИ((ПСТР(A2;СТРОКА($1:$999);1)<="z")*(ПСТР(A2;СТРОКА($1:$999);1)>="A");СТРОКА($1:$999)));МАКС(ЕСЛИ((ПСТР(A2;СТРОКА($1:$999);1)<="z")*(ПСТР(A2;СТРОКА($1:$999);1)>="A");СТРОКА($1:$999)))+1-МИН(ЕСЛИ((ПСТР(A2;СТРОКА($1:$999);1)<="z")*(ПСТР(A2;СТРОКА($1:$999);1)>="A");СТРОКА($1:$999))))
Quote (_Boroda_)
Чуть покороче, но тоже монстр получился =ПСТР(A2;ПОИСКПОЗ(123;КОДСИМВ(ПСТР("я"&ПОДСТАВИТЬ(A2;" ";"я");СТРОКА($1:$999);1));-1);ПОИСКПОЗ(123;КОДСИМВ(ПСТР(ПОДСТАВИТЬ(A2;" ";"я")&"я";СТРОКА($1:$999);1)))-ПОИСКПОЗ(123;КОДСИМВ(ПСТР("я"&ПОДСТАВИТЬ(A2;" ";"я");СТРОКА($1:$999);1));-1)+1)
В Ваших примерах все работает,но когда я копирую себе в колонку одну из этих формул - пишет #ЗНАЧ! или #Н/Д
Quote (Serge_007)
Формула массива: =ПСТР(A2;МИН(ЕСЛИ((ПСТР(A2;СТРОКА($1:$999);1)<="z")*(ПСТР(A2;СТРОКА($1:$999);1)>="A");СТРОКА($1:$999)));МАКС(ЕСЛИ((ПСТР(A2;СТРОКА($1:$999);1)<="z")*(ПСТР(A2;СТРОКА($1:$999);1)>="A");СТРОКА($1:$999)))+1-МИН(ЕСЛИ((ПСТР(A2;СТРОКА($1:$999);1)<="z")*(ПСТР(A2;СТРОКА($1:$999);1)>="A");СТРОКА($1:$999))))
Quote (_Boroda_)
Чуть покороче, но тоже монстр получился =ПСТР(A2;ПОИСКПОЗ(123;КОДСИМВ(ПСТР("я"&ПОДСТАВИТЬ(A2;" ";"я");СТРОКА($1:$999);1));-1);ПОИСКПОЗ(123;КОДСИМВ(ПСТР(ПОДСТАВИТЬ(A2;" ";"я")&"я";СТРОКА($1:$999);1)))-ПОИСКПОЗ(123;КОДСИМВ(ПСТР("я"&ПОДСТАВИТЬ(A2;" ";"я");СТРОКА($1:$999);1));-1)+1)
В Ваших примерах все работает,но когда я копирую себе в колонку одну из этих формул - пишет #ЗНАЧ! или #Н/Д
Поясняю,в примерах с массивами - все работает оба варианта,которые были здесь предложены.Большое спасибо
В примерах с макросами буду уже завтра экспериментировать.
Немного усложню задачу,так как при более детальном изучении прайса столкнулся вот с чем,в некоторых позициях указаны не по одному слову по-английски а два и более ,например "Мяч Adidas кожаный для футбола Black White" или "Футболка детская Puma WT-102 Green" . Но мне все одно необходимо самое главное вытянуть отсюда только Название производителя, но оно в предложении может быть как и писал ранее,может быть и на 1 и на 2 и на ...месте. Наверное лучше написать формулу по умолчанию для второго места а если будет название на другом уже вручную подправлю.(Хотя при ооооочень большом прайсе на это уйдет куча времени) Надеюсь понятно пояснил
Поясняю,в примерах с массивами - все работает оба варианта,которые были здесь предложены.Большое спасибо
В примерах с макросами буду уже завтра экспериментировать.
Немного усложню задачу,так как при более детальном изучении прайса столкнулся вот с чем,в некоторых позициях указаны не по одному слову по-английски а два и более ,например "Мяч Adidas кожаный для футбола Black White" или "Футболка детская Puma WT-102 Green" . Но мне все одно необходимо самое главное вытянуть отсюда только Название производителя, но оно в предложении может быть как и писал ранее,может быть и на 1 и на 2 и на ...месте. Наверное лучше написать формулу по умолчанию для второго места а если будет название на другом уже вручную подправлю.(Хотя при ооооочень большом прайсе на это уйдет куча времени) Надеюсь понятно пояснил
Если название производителя может находиться как раньше, так и позже других английских слов в текстовой строке, то необходимо составлять справочник названий производителей и искать совпадения в тексте по нему.
Если необходимо извлекать второе слово текста, то подойдёт такая формула:
Если название производителя может находиться как раньше, так и позже других английских слов в текстовой строке, то необходимо составлять справочник названий производителей и искать совпадения в тексте по нему.
Если необходимо извлекать второе слово текста, то подойдёт такая формула: