Все ровно не работает. Может я переформулирую вопрос:
Есть столбец со значениями (в столбик, а не в строчку) внутри каждой ячейки К нему нужно добавить значении из другого листа (что то типа ВПР или аналогии...)
Проблемы:
1) текст в столбик внутри ячейки 2) несколько значений для парсинга в одну ячейку
вот как то так...
Все ровно не работает. Может я переформулирую вопрос:
Есть столбец со значениями (в столбик, а не в строчку) внутри каждой ячейки К нему нужно добавить значении из другого листа (что то типа ВПР или аналогии...)
Проблемы:
1) текст в столбик внутри ячейки 2) несколько значений для парсинга в одну ячейку
Option Explicit Function СцепитьМассивЕсли(Table As Variant, SearchColumnNum As Integer, SearchValue As Variant, _ RezultColumnNum As Integer, Separator_ As String, Optional BezPovtorov As Boolean = True) 'Table - таблица, где ищем 'SearchColumnNum - столбец, где ищем 'SearchValue - данные, которые ищем 'RezultColumnNum - колонка, откуда берём результат 'Separator_ - разделитель, желательно вводить с пробелом в конце 'BezPovtorov - если поставить 0, то будут выведены все повторяющиеся совпадения
Dim i As Long, oDict As Object, tmp As String, vlk
If TypeName(Table) = "Range" Then Table = Table.Value
If BezPovtorov Then Set oDict = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(Table) If Table(i, SearchColumnNum) = SearchValue Then tmp = Table(i, RezultColumnNum) If tmp <> "" Then If Not oDict.Exists(tmp) Then oDict.Add tmp, 0& vlk = vlk & Separator_ & Table(i, RezultColumnNum) End If End If End If Next i
Else For i = 1 To UBound(Table) If Table(i, SearchColumnNum) = SearchValue Then vlk = vlk & Separator_ & Table(i, RezultColumnNum) End If Next i End If If vlk > 0 Then vlk = Mid(vlk, Len(Separator_) + 1) Else vlk = "" СцепитьМассивЕсли = vlk End Function
[/vba]
Nicko, и Вам доброй ночи!!!
можно с помощью udf [vba]
Код
Option Explicit Function СцепитьМассивЕсли(Table As Variant, SearchColumnNum As Integer, SearchValue As Variant, _ RezultColumnNum As Integer, Separator_ As String, Optional BezPovtorov As Boolean = True) 'Table - таблица, где ищем 'SearchColumnNum - столбец, где ищем 'SearchValue - данные, которые ищем 'RezultColumnNum - колонка, откуда берём результат 'Separator_ - разделитель, желательно вводить с пробелом в конце 'BezPovtorov - если поставить 0, то будут выведены все повторяющиеся совпадения
Dim i As Long, oDict As Object, tmp As String, vlk
If TypeName(Table) = "Range" Then Table = Table.Value
If BezPovtorov Then Set oDict = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(Table) If Table(i, SearchColumnNum) = SearchValue Then tmp = Table(i, RezultColumnNum) If tmp <> "" Then If Not oDict.Exists(tmp) Then oDict.Add tmp, 0& vlk = vlk & Separator_ & Table(i, RezultColumnNum) End If End If End If Next i
Else For i = 1 To UBound(Table) If Table(i, SearchColumnNum) = SearchValue Then vlk = vlk & Separator_ & Table(i, RezultColumnNum) End If Next i End If If vlk > 0 Then vlk = Mid(vlk, Len(Separator_) + 1) Else vlk = "" СцепитьМассивЕсли = vlk End Function
Зачем название поменяли? Вроде я нормально придумал, и на всех локалях работает - VLOOKUPCOUPLE Мой вариант чуть получше - там есть пара отличий, найдите [vba]
Код
Function VLOOKUPCOUPLE(Table As Variant, _ SearchColumnNum As Integer, _ SearchValue As Variant, _ RezultColumnNum As Integer, _ Separator_ As String, _ Optional BezPovtorov As Boolean = True)
'Table - таблица, где ищем 'SearchColumnNum - столбец, где ищем 'SearchValue - данные, которые ищем 'RezultColumnNum - столбец, откуда берём результат 'Separator_ - разделитель, желательно вводить с пробелом в конце 'BezPovtorov - если поставить 0, то будут выведены все повторяющиеся совпадения
Dim i As Long, tmp As String, vlk
If TypeName(Table) = "Range" Then Table = Intersect(Table.Parent.UsedRange, Table).Value If BezPovtorov Then With CreateObject("Scripting.Dictionary") For i = 1 To UBound(Table) If Table(i, SearchColumnNum) = SearchValue Then tmp = Table(i, RezultColumnNum) If tmp <> "" Then If Not .Exists(tmp) Then .Add tmp, 0& vlk = vlk & Separator_ & Table(i, RezultColumnNum) End If End If End If Next i End With Else For i = 1 To UBound(Table) If Table(i, SearchColumnNum) = SearchValue Then vlk = vlk & Separator_ & Table(i, RezultColumnNum) End If Next i End If If vlk > 0 Then vlk = Mid(vlk, Len(Separator_) + 1) Else vlk = "" VLOOKUPCOUPLE = vlk End Function
[/vba]
Зачем название поменяли? Вроде я нормально придумал, и на всех локалях работает - VLOOKUPCOUPLE Мой вариант чуть получше - там есть пара отличий, найдите [vba]
Код
Function VLOOKUPCOUPLE(Table As Variant, _ SearchColumnNum As Integer, _ SearchValue As Variant, _ RezultColumnNum As Integer, _ Separator_ As String, _ Optional BezPovtorov As Boolean = True)
'Table - таблица, где ищем 'SearchColumnNum - столбец, где ищем 'SearchValue - данные, которые ищем 'RezultColumnNum - столбец, откуда берём результат 'Separator_ - разделитель, желательно вводить с пробелом в конце 'BezPovtorov - если поставить 0, то будут выведены все повторяющиеся совпадения
Dim i As Long, tmp As String, vlk
If TypeName(Table) = "Range" Then Table = Intersect(Table.Parent.UsedRange, Table).Value If BezPovtorov Then With CreateObject("Scripting.Dictionary") For i = 1 To UBound(Table) If Table(i, SearchColumnNum) = SearchValue Then tmp = Table(i, RezultColumnNum) If tmp <> "" Then If Not .Exists(tmp) Then .Add tmp, 0& vlk = vlk & Separator_ & Table(i, RezultColumnNum) End If End If End If Next i End With Else For i = 1 To UBound(Table) If Table(i, SearchColumnNum) = SearchValue Then vlk = vlk & Separator_ & Table(i, RezultColumnNum) End If Next i End If If vlk > 0 Then vlk = Mid(vlk, Len(Separator_) + 1) Else vlk = "" VLOOKUPCOUPLE = vlk End Function
Pelena, кстати вопрос - на Маках есть свой словарь? А что с коллекцией? В принципе для Маков можно этот код переписать с использованием коллекции (если у Маков она аналогична Винде), или вообще убрать этот анализ повторов, выводить всё. Но претензий от маководов я не помню, вероятно не пользовались этой UDF.
И вообще про Мак нужно предупреждать, и для Маков есть свой подфорум. А то конечно, часто видим - "не работает" и думай что хошь...
Pelena, кстати вопрос - на Маках есть свой словарь? А что с коллекцией? В принципе для Маков можно этот код переписать с использованием коллекции (если у Маков она аналогична Винде), или вообще убрать этот анализ повторов, выводить всё. Но претензий от маководов я не помню, вероятно не пользовались этой UDF.
И вообще про Мак нужно предупреждать, и для Маков есть свой подфорум. А то конечно, часто видим - "не работает" и думай что хошь...Hugo
Hugo, Сори, что не указал авторство, но честное слово не знал кто автор, так как данная функция уже давно сохранена в личном .xlam, а название изменил еще сразу под свое удобство.
Hugo, Сори, что не указал авторство, но честное слово не знал кто автор, так как данная функция уже давно сохранена в личном .xlam, а название изменил еще сразу под свое удобство.DJ_Marker_MC