Поиск в списке Excel, возвращающий несколько значений, разделенных "|"
ХОРОШО...
Итак, у меня есть список продуктов, с названием продукта, например: "CC973" в столбце А., т.е.
A
CC969
CC972
CC973
CC975
CC976
CC977
CC978
CC996
CC997
CC998
CC999
DS009
DS022
DS046
DS088
DS096
У меня также есть список изображений продуктов, подобных этому, в столбце А другого листа "Имена изображений!$A$2:$A$617" (все данные в этом столбце).:
A
CC967 CC968 CC969 (Packaging).jpg
CC967 CC968 CC969.jpg
CC972 CC973 (Packaging).jpg
CC972 CC973 (Rear).jpg
CC972 CC973.jpg
CC975 CC976.jpg
CC977 CC978 CC979 (Packaging).jpg
CC977 CC978 CC979.jpg
CC980 CC981 CC982 (Packaging).jpg
CC980 CC981 CC982 (Rear).jpg
CC980 CC981 CC982 (Side).jpg
То, что я хотел бы сделать, это проверить продукт в первом списке и вернуть все изображения, которые содержат это название продукта, разделенные "|".
Я хотел бы, чтобы имя файла без дополнительного текста, т.е. в случае только "CC972 CC973.jpg", было возвращено первым.
Таким образом, в этом примере я хотел бы получить следующее:
CC972 CC973.jpg|CC972 CC973 (Packaging).jpg|CC972 CC973 (Rear).jpg
Я уверен, что это должно быть возможно, кто-нибудь может посоветовать способ сделать это?
РЕДАКТИРОВАТЬ Я пробовал это:
=Lookup_concat(A2,'Image names'!$A$1:$A$617, 'Image names'!$A$1:$A$617)
Но это возвращает #name?
Я думаю, чтобы сделать эту работу, я должен был бы использовать VBA со следующим кодом:
Function Lookup_concat(Search_string As String, _
Search_in_col As Range, Return_val_col As Range)
Dim i As Long
Dim result As String
For i = 1 To Search_in_col.Count
If Search_in_col.Cells(i, 1) = Search_string Then
result = result & " " & Return_val_col.Cells(i, 1).Value
End If
Next
Lookup_concat = Trim(result)
End Function
Однако я не думаю, что Excel 2008 имеет редактор VBA!
Я не делал таблицы должным образом с 2003 года!!!!
1 ответ
В ваших комментариях вы упомянули, что теперь у вас есть доступ к версии Excel, которая может запускать VBa.
Это VBa и делает то, что я думаю, что вы хотите. Я включил снимки экрана.
Я оставил некоторые комментарии в коде, первый раздел, который вам может понадобиться обновить, но комментарии должны помочь вам.
Помните, сначала сделайте резервную копию вашего файла, так как нет функции отмены!
Основываясь на ваших комментариях, я использую настоящие имена рабочих листов!
Option Explicit
Sub WalkThePlank()
'hear ye, only edit this top past of walk the plank
'Remember scurvy sea dog, there is no UNDO so take a copy of the file first as a back up
Dim worksheet1 As String
worksheet1 = "Image names" 'The name of the work sheet which has only codes
Dim worksheet1Column As String
worksheet1Column = "A" 'Argghh, the name of the column you use in worksheet1
Dim worksheet2 As String
worksheet2 = "LMFD products" 'The name of the worksheet with things like CC972 CC973 (Rear).jpg
Dim worksheet2Column As String
worksheet2Column = "A" 'Argghh, the name of the column you use in worksheet2
Dim resultsWorksheet As String
resultsWorksheet = "LMFD products" 'C'pan, this is where you put the results
Dim resultsWorksheetColumn As String
resultsWorksheetColumn = "C" 'Argghh, the name of the column you use in worksheet2
'hear ye, walk below and I'll feed ye to the sharks
Application.ScreenUpdating = False
Dim row As Integer
row = 2 'The starting row with values to be looked up
Do While (Worksheets(worksheet1).Range(worksheet1Column & row).Value <> "")
Dim result As String
result = ""
Dim lookupValue As String
lookupValue = Worksheets(worksheet1).Range(worksheet1Column & row).Value
Dim otherRow As Integer
otherRow = 2 'The starting row of the .jpg colum
Dim startString As String
Dim endString As String
startString = ""
endString = ""
Do While (Worksheets(worksheet2).Range(worksheet2Column & otherRow).Value <> "")
Dim repoValue As String
repoValue = Worksheets(worksheet2).Range(worksheet2Column & otherRow).Value
If (InStr(repoValue, lookupValue)) Then
'we got treasure cap'ain
If (InStr(repoValue, "(")) Then
endString = Trim(endString) & Trim(repoValue) & "|"
Else
startString = Trim(startString) & Trim(repoValue) & "|"
End If
End If
otherRow = otherRow + 1
Loop
'check on the treasure, will we fine riches
If (startString <> "" And endString <> "") Then
result = Trim(startString & Left(endString, Len(endString) - 1))
Else
If (startString = "" And endString <> "") Then
result = Trim(Left(endString, Len(endString) - 1))
End If
If (endString = "" And startString <> "") Then
result = Trim(Left(startString, Len(startString) - 1))
End If
End If
Worksheets(resultsWorksheet).Range(resultsWorksheetColumn & row).Value = result ' X Marks the spot
row = row + 1
Loop
End Sub
My Worksheet1 (до запуска VBa)
И мой Рабочий лист2
И результат