Нет. В этой версии в параметрах ставится тот разделитель, который будет виден в результате (если будет несколько подходящих значений, там есть такие). А тот разделитель, по которому бьётся строка, в коде тут: [vba]
Code
For Each a In Split(s, ",")
[/vba] Можно в код добавить ещё один параметр, который будет овечать за эту опцию - я уже предлагал, но Вы сказали "не не надо, по запятым нормально"
Сделал: [vba]
Code
Option Explicit
Function izvlech(s$, sep_s$, sep_$, ParamArray par()) As String Dim a, p, i As Byte, flag As Boolean izvlech = "" For Each p In par If InStr(p, "|") Then For Each a In Split(s, sep_s) If UCase(a) Like "*" & UCase(Split(p, "|")(0)) & "*" Then flag = False For i = 1 To UBound(Split(p, "|")) If UCase(a) Like "*" & UCase(Split(p, "|")(i)) & "*" Then flag = True End If Next If Not flag Then izvlech = izvlech & sep_ & Trim(a) End If Next End If If Len(izvlech) Then izvlech = Mid(izvlech, Len(sep_) + 1) Exit Function End If Next End Function
[/vba] Но теперь на листе нужно писать уже так (если делим по пробелам):
Code
=izvlech($D13;" ";", ";E$1;E$2;E$3;E$4)
т.е. все параметры нужно двигать вниз на одну позицию, т.к. выше появился разделитель исходной строки.
Нет. В этой версии в параметрах ставится тот разделитель, который будет виден в результате (если будет несколько подходящих значений, там есть такие). А тот разделитель, по которому бьётся строка, в коде тут: [vba]
Code
For Each a In Split(s, ",")
[/vba] Можно в код добавить ещё один параметр, который будет овечать за эту опцию - я уже предлагал, но Вы сказали "не не надо, по запятым нормально"
Сделал: [vba]
Code
Option Explicit
Function izvlech(s$, sep_s$, sep_$, ParamArray par()) As String Dim a, p, i As Byte, flag As Boolean izvlech = "" For Each p In par If InStr(p, "|") Then For Each a In Split(s, sep_s) If UCase(a) Like "*" & UCase(Split(p, "|")(0)) & "*" Then flag = False For i = 1 To UBound(Split(p, "|")) If UCase(a) Like "*" & UCase(Split(p, "|")(i)) & "*" Then flag = True End If Next If Not flag Then izvlech = izvlech & sep_ & Trim(a) End If Next End If If Len(izvlech) Then izvlech = Mid(izvlech, Len(sep_) + 1) Exit Function End If Next End Function
[/vba] Но теперь на листе нужно писать уже так (если делим по пробелам):
Code
=izvlech($D13;" ";", ";E$1;E$2;E$3;E$4)
т.е. все параметры нужно двигать вниз на одну позицию, т.к. выше появился разделитель исходной строки.Hugo
Нет, особо переделывать не нужно - всего лишь поставить одну ' и переместить один блок (на последнем примере, но это не последняя версия):
[vba]
Code
Function izvlech(s$, sep_$, ParamArray par()) As String Dim a, p, i As Byte, flag As Boolean izvlech = "" For Each p In par If InStr(p, "|") Then For Each a In Split(s, ",") If UCase(a) Like "*" & UCase(Split(p, "|")(0)) & "*" Then flag = False For i = 1 To UBound(Split(p, "|")) If UCase(a) Like "*" & UCase(Split(p, "|")(i)) & "*" Then flag = True End If Next If Not flag Then izvlech = izvlech & sep_ & Trim(a) End If Next End If
Next
If Len(izvlech) Then izvlech = Mid(izvlech, Len(sep_) + 1) 'Exit Function End If
End Function
[/vba]
Правда это сразу тормозит работу - т.к. проверок теперь намного больше производится.
Хотя вот эта строка 'Exit Function что она есть, что её нет, что закомментирована, что нет - всё едино уже не нужна
P.S. Мне кажется, что слишком часто ерунда получается:
Intel Atom N570 1.66GHz, Intel NM10, Intel Atom N570 1.66GHz Intel Pentium Dual, Intel Pentium Dual, Core P6200 2.13GHz, Core P6200 2.13GHz Intel Pentium P6200 2.13GHz, Intel Pentium P6200 2.13GHz, Intel Pentium P6200 2.13GHz Похоже, что ещё словарём нужно повторы отсеивать...
Хотя тут вроде в кассу: AMD Athlon II Dual-, Core P360 2.3GHz Intel, Core i5-2450M 2.50GHz но ведь и так понятно, что это за проц: Core i7-2630QM 2.0GHz
Нет, особо переделывать не нужно - всего лишь поставить одну ' и переместить один блок (на последнем примере, но это не последняя версия):
[vba]
Code
Function izvlech(s$, sep_$, ParamArray par()) As String Dim a, p, i As Byte, flag As Boolean izvlech = "" For Each p In par If InStr(p, "|") Then For Each a In Split(s, ",") If UCase(a) Like "*" & UCase(Split(p, "|")(0)) & "*" Then flag = False For i = 1 To UBound(Split(p, "|")) If UCase(a) Like "*" & UCase(Split(p, "|")(i)) & "*" Then flag = True End If Next If Not flag Then izvlech = izvlech & sep_ & Trim(a) End If Next End If
Next
If Len(izvlech) Then izvlech = Mid(izvlech, Len(sep_) + 1) 'Exit Function End If
End Function
[/vba]
Правда это сразу тормозит работу - т.к. проверок теперь намного больше производится.
Хотя вот эта строка 'Exit Function что она есть, что её нет, что закомментирована, что нет - всё едино уже не нужна
P.S. Мне кажется, что слишком часто ерунда получается:
Intel Atom N570 1.66GHz, Intel NM10, Intel Atom N570 1.66GHz Intel Pentium Dual, Intel Pentium Dual, Core P6200 2.13GHz, Core P6200 2.13GHz Intel Pentium P6200 2.13GHz, Intel Pentium P6200 2.13GHz, Intel Pentium P6200 2.13GHz Похоже, что ещё словарём нужно повторы отсеивать...
Хотя тут вроде в кассу: AMD Athlon II Dual-, Core P360 2.3GHz Intel, Core i5-2450M 2.50GHz но ведь и так понятно, что это за проц: Core i7-2630QM 2.0GHzHugo
Посмотрите файл по ссылке - я там добавил ещё словарь.
[vba]
Code
Option Explicit
Function izvlech(s$, sep_s$, sep_$, ParamArray par()) As String Dim a, p, i As Byte, flag As Boolean, t$ izvlech = "" With CreateObject("Scripting.Dictionary") .CompareMode = 1 For Each p In par If InStr(p, "|") Then For Each a In Split(s, sep_s) If UCase(a) Like "*" & UCase(Split(p, "|")(0)) & "*" Then flag = False For i = 1 To UBound(Split(p, "|")) If UCase(a) Like "*" & UCase(Split(p, "|")(i)) & "*" Then flag = True End If Next If Not flag Then t = Trim(a) If Not .exists(t) Then .Item(t) = vbNullString izvlech = izvlech & sep_ & t End If End If End If Next End If Next End With If Len(izvlech) Then izvlech = Mid(izvlech, Len(sep_) + 1) 'Exit Function End If
End Function
[/vba]
Теперь вроде нормально с процессорами работает. Можно конечно ещё переделать, чтоб все параметры в одной строке указывать - сперва то, по чему отбираем, потом то, что исключаем. Но тоже есть вопросы - если отбираем например по трём словам, то как понять, какое исключение кому в паре? Или все ко всем? Или если нужно исключение, то это слово ставить одно? Как сейчас...
Посмотрите файл по ссылке - я там добавил ещё словарь.
[vba]
Code
Option Explicit
Function izvlech(s$, sep_s$, sep_$, ParamArray par()) As String Dim a, p, i As Byte, flag As Boolean, t$ izvlech = "" With CreateObject("Scripting.Dictionary") .CompareMode = 1 For Each p In par If InStr(p, "|") Then For Each a In Split(s, sep_s) If UCase(a) Like "*" & UCase(Split(p, "|")(0)) & "*" Then flag = False For i = 1 To UBound(Split(p, "|")) If UCase(a) Like "*" & UCase(Split(p, "|")(i)) & "*" Then flag = True End If Next If Not flag Then t = Trim(a) If Not .exists(t) Then .Item(t) = vbNullString izvlech = izvlech & sep_ & t End If End If End If Next End If Next End With If Len(izvlech) Then izvlech = Mid(izvlech, Len(sep_) + 1) 'Exit Function End If
End Function
[/vba]
Теперь вроде нормально с процессорами работает. Можно конечно ещё переделать, чтоб все параметры в одной строке указывать - сперва то, по чему отбираем, потом то, что исключаем. Но тоже есть вопросы - если отбираем например по трём словам, то как понять, какое исключение кому в паре? Или все ко всем? Или если нужно исключение, то это слово ставить одно? Как сейчас... Hugo
Словарь - Scripting.Dictionary. С его помощью избавляюсь от повторов. Ну а версия - то, что Вы показали, бьёт по запятым. А то, что я тут выше показал/выложил, бьёт по указанному параметру.
Словарь - Scripting.Dictionary. С его помощью избавляюсь от повторов. Ну а версия - то, что Вы показали, бьёт по запятым. А то, что я тут выше показал/выложил, бьёт по указанному параметру.Hugo