QUESTION :
I have a data file, where there is a table like this:
(DATA TABLE)
REF_ID | COST | TYPE
======================================================
123_COMPUTER_XYZ | 50000 | (to be filled)
45623_LAPTOP_AOS | 90000
BHJ_WALLET_ASODO | 1000
BUIGQ32_TRIMMER | 200
...
Now, I want to add another column to the table, wherein the type
of the product is automatically put using a lookup table, which I have defined as follows:
(TYPE TABLE)
PRODUCT SUBSTRING | TYPE
=====================================
COMPUTER | computer
LAPTOP | computer
WALLET | personal
TRIMMER | personal-care
...
I want to use the PRODUCT SUBSTRING
column in the TYPE TABLE as a lookup and put the corresponding value of TYPE
into the
3rd column of the DATA TABLE.
I’ve looked at many questions:
- Find Substring Within Column – Excel
- Lookup and return value based on sub-string match
- http://www.mrexcel.com/forum/excel-questions/8800-substring-search-within-array-strings-part-2-a.html
but all of them ask it the other way round, wherein the string to be searched (REF_ID field) is a sub-string of the TYPE-TABLE.
Can you help me?
ANSWER :
Here is a solution based on a short UDF().
Say the lookup table is in columns F and G from row 1 up to a maximum of 100 rows. First insert this UDF() in a standard module:
Public Function GetType(sIN As String) As String
Dim LookupTable As Range, nItems As Long
Set LookupTable = Range("F1:G100")
nItems = 100
For i = 1 To nItems
If LookupTable(i, 1) = "" Then Exit For
If InStr(1, sIN, LookupTable(i, 1)) > 0 Then
GetType = LookupTable(i, 2)
Exit Function
End If
Next i
GetType = "UN-FOUND"
End Function
Then in cell C1, enter:
=GetType(A1)
and copy down:
User Defined Functions (UDFs) are very easy to install and use:
- ALT-F11 brings up the VBE window
- ALT-I
ALT-M opens a fresh module - paste the stuff in and close the VBE window
If you save the workbook, the UDF will be saved with it.
If you are using a version of Excel later then 2003, you must save
the file as .xlsm rather than .xlsx
To remove the UDF:
- bring up the VBE window as above
- clear the code out
- close the VBE window
To use the UDF from Excel:
=myfunction(A1)
To learn more about macros in general, see:
http://www.mvps.org/dmcritchie/excel/getstarted.htm
and
http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx
and for specifics on UDFs, see:
http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx
Macros must be enabled for this to work!
Here is a solution for your problem:
=INDEX(Table2[TYPE],MAX((ROW(Table2[PRODUCT SUBSTRING])-1)*SIGN(IFERROR(SEARCH(Table2[PRODUCT SUBSTRING],[@[REF_ID]]),0))))
This is an array formula, you need to enter it with CTRL+Shift+Enter.
where:
IFERROR(SEARCH(Table2[PRODUCT SUBSTRING],[@[REF_ID]]),0))
checks which substring is included in the actual REF_ID (gives starting position for it, 0 for all other substrings)SIGN(...)
– converts previous list to1
for found substring(ROW(Table2[PRODUCT SUBSTRING])-1)
– row number minus one (position in the list if header is in first row)MAX(...)
– as only value for the found substring is non zero, this function extracts it’s position=INDEX(Table2[TYPE],MAX(...))
– type from the list
Update
Above formula refers to tables, to convert your ranges to tables select: Insert – Table (in the example table1
is the one at the left side, so convert it first)
Formula with standard references:
=INDEX(G$2:G$7,MAX((ROW(F$2:F$7)-1)*SIGN(IFERROR(SEARCH(F$2:F$7,A3),0))))