Using Vlookup for multiple occurences and find the non-empty values - excel

I have a table that looks like this and I want to use something like VLOOKUP to find the 2nd column value that's non-empty.
An example would be:
VLOOKUP("Kiwi", Range A:B, 2, 0) should return Green
VLOOKUP("Apple", Range A:B, 2, 0) should return Red
VLOOKUP("Pineapple", Range A:B, 2, 0) should return Yellow
Note that the first occurence of Pineapple is empty, but it still should return Yellow. and I don't have to use VLOOKUP and I am open to other methods too.
I would appreiate help.
Thank you.

You can use an INDEX/MATCH array formula:
The formula is:
{=INDEX(B1:B7;MATCH(1;(A1:A7=E1)*(B1:B7<>"");0))}
Be aware that this is an array formula, you need to enter it with CTRL + SHIFT + ENTER.
This formula will check if column A is "Pineapple" and column B is not a blank. You will get an (imaginary) array that looks like this:
The values in both arrays are multiplied and only for the last two rows, the result will be 1. MATCH looks up the 1 in this array (only the first occurrence!) and delivers the row number for "Yellow" to the INDEX function. INDEX then picks up the value in row 6 - which is "Yellow".
I hope that helps you.

MATCH will give you offset, so you can use OFFSET function.
IFNA is there to display empty instead of #N/A
=IFNA(OFFSET(B1;MATCH(1;(A1:A7=E1)*(B1:B7<>"");0)-1;0);"")

Related

Array formula with SUM Function returns incorrect result

I have some data of transactions, for example as following:
Column B|Column C
TRUCK_ID|TON
TR-12 |60
TR-10 |65
TR-09 |56
TR-12 |75
TR-10 |70
*in reality I have thousands data
Then I would like to count how many truck that loads overcapacity, where
the load limit as following:
Column F|Column G
TR-09|50
TR-10|60
TR-12|65
I use a combination of SUM, IF, INDEX, MATCH and ROW
=SUM(IF(C4:C8>INDEX(G4:G6,MATCH(INDEX(B4:B8,ROW(B4:B8)-3),F4:F6,0)),1))
But when I only select one (single) cell and click CSE
it returns '2' (incorrect)
If I select multi cells (let say 2 cells) and click CSE
it returns '4' (correct)
I expect I only put and select one single cell only and return the correct result. Anybody could help me, please
You could try:
=SUMPRODUCT((B2:B6=TRANSPOSE(F2:F4))*(C2:C6>TRANSPOSE(G2:G4)))
Note: This is an array formula and need to be confirmed through CtrlShiftEnter
You could also add one helper column, in H2 put:
=COUNTIFS($B$2:$B$6,F2,$C$2:$C$6,">"&G2)
And drag down, to sum H2:H at the end.
Screenshot SUMPRODUCT:
Screenshot Helper column:
EDIT#2
Try modify your original formula as below:
=SUM(IF(C4:C8>INDEX(G4:G6,MATCH(INDEX(B4:B8,N(IF(1,ROW(B4:B8)))-3),F4:F6,0)),1))
Use N and IF function can actually overcome the issue of INDEX only returning the first value from the range in a single cell.
Alternatively, suppose you have the following named ranges:
Truck_ID being data in Column B;
TON being data in Column C;
List_ID being data in Column F;
List_TON being data in Column G.
You can use the following formula to return the desired result 4 presume the look-up table is sorted in ascending order:
=SUMPRODUCT(--(LOOKUP(Truck_ID,List_ID,List_TON)<TON))
or
{=SUM(IF((LOOKUP(Truck_ID,List_ID,List_TON)<TON),1))} 'Entered by CSE as array formula
Your INDEX function INDEX(G4:G6,MATCH(INDEX(B4:B8,ROW(B4:B8)-3),F4:F6,0)) is returning a single-column array, which will only return the first value from the array which is 65 in a single cell. So your full formula is essentially comparing each value in TON against 65. As a result there are only 2 values that are greater than 65. As shown in Column D of my example, a more proper use of INDEX in this case would be highlighting range D4:D8 and enter the array formula as shown in the formula bar. Then you can do a SUM for all TRUE results. If you enter your full formula in multiple cells, your INDEX formula will actually return the full array instead of the first value so the comparison will return the correct result.

finding next empty row

This might be easy for many but I need to solve an issue which is following;
I have the following formula which finds the empty row after D4.
=MATCH(TRUE;D4:D1048576="";0)+3
After this I want to be able to find the empty row from another defined cell, say D10.
How can I do this?
Try this as an array formula - Ctrl+Shift+Enter:
=MIN(IF(D4:D100="",ROW(D4:D100)))
It works from D4 to D100, providing the first empty value.
If you're looking to use same formula to match next cell then use
For blanks after D4
=MATCH(TRUE,INDEX(ISBLANK(D4:D1048576),0),0)
For blanks after D10
=MATCH(TRUE,INDEX(ISBLANK(D10:D1048576),0),0)
To find the A1th blank cell, you can use the following formula:
=AGGREGATE(15,6,ROW(D:D)/--ISBLANK(D:D),A1)
How it works
AGGREGATE(15,6,..) is like SMALL(..), but skips any error values.
ROW(..) provides the row number of the cell provided
ISBLANK(..) is TRUE for blank cells or FALSE for non-blank cells
-- converts TRUE to 1 and FALSE to 0. This means that ROW(D:D)/--ISBLANK(D:D) will be either the Row Number (for blank cells) or a #Div0! error (which AGGREGATE will skip)
This produces a list of row numbers for all the blank cells, and you then use the AGGREGATE function to get the kth item in that list.
Taking it a step further
So, you want the 1st item larger than a specific row. We change the last argument in AGGREGATE to 1, and swap change our "Error out" code from ISBLANK(D:D) to AND(ISBLANK(D:D), ROW(D:D)>A1), to get the first blank row after the row number stored in A1:
=AGGREGATE(15, 6, ROW(D:D)/--AND(ISBLANK(D:D), ROW(D:D)>A1), 1)

Formula to find part of a cell's value as exact match to a value from other cells

On tab 1, I have data down column B that contains string values like this:
\\ABC\VOL1\DATA\Dan\Personal Folders
\\ABC\VOL1\DATA\Mike\My Stuff\Docs\Support
\\ABC\VOL1\DATA\Mike\My Stuff\Photos
\\ABC\VOL1\DATA\Bob\Plans
On tab 2, I have data down column C that I want to use as a lookup table like this:
\\ABC\VOL1\DATA\Adam
\\ABC\VOL1\DATA\Steve
\\ABC\VOL1\DATA\Mike
\\ABC\VOL1\DATA\Ronnie
I need a formula I can put on tab 1 down column C to see if any part of each text string from tab 1, column B matches any complete text string from tab 2, column C. So for example, I would place this formula to show Yes or No like this:
Column B......................................................................Column C
\\ABC\VOL1\DATA\Dan\Personal Folders....................No
\\ABC\VOL1\DATA\Mike\My Stuff\Docs\Support..........Yes
\\ABC\VOL1\DATA\Mike\My Stuff\Photos.....................Yes
\\ABC\VOL1\DATA\Bob\Plans.......................................No
I have tried VLOOKUP, INDEX/MATCH, ISNUMBER/SEARCH, and COUNTIF as an array with wildcards, but I just cannot seem to figure it out. Currently, with COUNTIF as array, I have this:
=COUNTIF(B2,"*" & 'Tab 2'!$C$2:$C$1000 & "*")
This is the start to return the array results, but the results aren't as I would expect as I get "0" when I should get "1" for certain rows.
If anyone can help me out with a formula (not VBA) using any of the functions mentioned above or any others, I would greatly appreciate it. Thanks.
use this array formula:
=IF(COUNT(SEARCH('Tab 2'!$C$2:INDEX('Tab 2'!$C:$C,MATCH("zzz",'Tab 2'!$C:$C)),B2)),"Yes","No")
Being an array formula it needs to be confirmed with Ctrl-Shift-Enter instead of Enter when exiting edit mode.
This will search the cell for any of your criteria and return the number of matches if there is a match (which unless you have duplicates in the criteria it will be a 1).
Enter as array.
{=COUNT(SEARCH($C$1:$C$4,B1))}

Excel Formula with IF... ELSE

Hi all,
I have this excel where by I need to find the location of the item if they are found in column B.
So In my F column, I tried to write ifelse formula which didnt work.which is
=IF(D2="NULL","NONE",C((D2))).
My idea is if D2 is not null, use the value in D column to find the location in C column. In this example, fish no 4, so it is found, my F column should show the value "C" using the value shown in D column and use it as Row no in C column
I hope you guys get the idea and help me out a newbie in excel. Thanks in advance
=vlookup($D2,$A$2:$C$6,3,0)
you can use that in column F. Place that formula in F2 and copy down.
you could technically use it in column E as well, but you would need to change the 3 to a 2.
you did not say what you wanted to do if the D value was "Null" so I am going to take a stab at the dark and wrap you lookup formula in an if statement that will deal with "Null" or empty cells
=IF(OR($D2="NULL",$D2=""),"",VLOOKUP($D2,$A$2:$C$6,3,0))
That is the alternative formula to place in F2 and copy down.
Use the formula:
=IF(D2<>"NULL",VLOOKUP(D2,A2:C6,3,FALSE),"Value is NULL")
Here is the working example:
Put formula in cell F2 and drag it down.
[edit]to pull proper location column, not just the row #[/edit]
Seems like a job for MATCH+OFFSET
Try this formula in cell F2:
=OFFSET($C$1, MATCH(E2,B:B,0)-1, 0, 1, 1)
Match is used to locate the value in the first argument (ie E2) within the range specified in 2nd argument (ie B:B). I use B:B but you could also use range B2:B30 or whatever more specific range you want. (I prefer the more generic B:B, though :) )
Third paramter "0" just indicates "Exact match".
This function will retun "#N/A" if nothing found.
OFFSET takes the result from MATCH to pick out the Location you want. The first parameter in OFFSET is the rows below (or above if negative) from the base row (in this case $C$1). the next is the column: 0 since we're in the column we want to be in. The last two are the size of the range: 1,1 is a 1x1 cell, so just 1 cell. If we did ...,2,3), that would be 2 rows high and 3 columns wide - or a 6 cell range. We're just after 1 cell here.
I've always preferred MATCH + OFFSET to other options, I just found they held up more robustly to changes in a sheet (ie new rows/columns added). So it's mostly personaly preference over VLOOKUP and INDEX. I honestly have never compared their actual performance, however, I've never had any issues with MATCH+OFFSET running slowly :)

Excel INDEX and MATCH Get Value

I have an excel workbook that I need some help with INDEX and MATCH or any other Formula that can get me my end result.
Here is sheet1:
SIT_ID METER SUSE_CD
10834282 DT0061 B
10834282 AW7931 P
21676286 CQ9635 P
21676286 DP4838 B
21726281 AW7880 P
21726281 DT0032 B
Here is Sheet2:
Site ID B P
10834282
21676286
21726281
Ultimately what I am trying to do is on Sheet2 is put the Meter that = B for the SITEID in the column and then Put the Meter that = P in the Same row.
I have never used Index or Match and I looked it up online but I am confused and hoping someone can help me with the correct formula or point me in the right direction.
Thanks so much!
INDEX first takes a range, then a row number, an optional column number (and an optional area number).
MATCH takes a value to lookup, an array and a mode.
In your problem you can use the following in Sheet2 cell B2:
=INDEX(Sheet1!$B$2:$B$7, MATCH($A2, IF(Sheet1!$C$2:$C$7=B$1,Sheet1!$A$2:$A$7), 0))
This formula is an array formula and will work with Ctrl+Shift+Enter and then you can fill it to the other cells.
I had to use an IF because there're two conditions to check.
EDIT: Use this one if your cell formats are different:
=INDEX(Sheet1!$B$2:$B$7,MATCH($A2*1,IF(Sheet1!$C$2:$C$7=B$1,Sheet1!$A$2:$A$7*1),0))
EDIT2: Adding trimming:
=INDEX(Sheet1!$B$2:$B$7,MATCH($A2*1,IF(TRIM(Sheet1!$C$2:$C$7)=TRIM(B$1),Sheet1!$A$2:$A$7*1),0))
EDIT3: If you're using it on your full data, change the range:
=INDEX(Sheet1!$B:$B,MATCH($A2*1,IF(TRIM(Sheet1!$C:$C)=TRIM(B$1),Sheet1!$A:$A*1),0))
Assuming your Sheet1 looks like this:
And your Sheet2 looks like this:
The formula in Sheet2 cell B2 and copied over and down to cell C4 is:
=INDEX(Sheet1!$B$2:$B$7,MATCH(1,INDEX((Sheet1!$A$2:$A$7=$A2)*(Sheet1!$C$2:$C$7=B$1),),0))
Note that this is a regular formula, so no need for Ctrl+Shift+Enter
A helper column D is added to initial columns.
D2: =$A2 & $C2
Now it's possible to make a simple search of the concatenated SITE_ID and SUSE_CD:
H2: =MATCH($G2&" B";$D$2:$D$8;0)
The result would be a row number (=1 in this case) for the needed string in array $D$2:$D$8.
INDEX shows the value of the cell, found by counting n-th row (defined by MATCH) and m-th column (=2) in array $A2:$A$8 from the upper left cell (A2).
Altogether: =INDEX($A$2:$B$8;MATCH($G2&" B";$D$2:$D$8;0);2)
The easiest way to get around with this is,
to use concatenation operator in the match function.
Don't forget to use Ctrl+Shift+Enter
Use below formula in column B of Sheet 2
{=INDEX(Sheet1!$B:$B,MATCH(Sheet2!$A2&Sheet2!$B$1,Sheet1!$A:$A&Sheet1!$C:$C,0))}
And the below formula in column C of Sheet 2
{=INDEX(Sheet1!$B:$B,MATCH(Sheet2!$A2&Sheet2!$C$1,Sheet1!$A:$A&Sheet1!$C:$C,0))}
And then flash fill the remaining rows.

Resources