Returning Multiple Results with Match Function - excel

I am looking for matches of information in Column E of one worksheet to Column E of a second worksheet.
I've used:
=MATCH(""&E1&"",'SHEET1'!E:E,0)
and this returns me which row the match is in.
However I have multiple hits on my search, but it is only returning me the row of the first hit.
Is there a way to get a list of all hits, not just the first occurrence?
Thank you!

Say Sheet1 is like:
and in the other sheet, there is a 12 in cell E1
then pick a cell and enter the Array Formula:
=IFERROR(SMALL(IF(Sheet1!E:E=$E$1,ROW(Sheet1!E:E)-MIN(ROW(Sheet1!E:E))+1,""),ROW(A1)),"")
and copy down to display:
Array formulas must be entered with Ctrl + Shift + Enter rather than just the Enter key.
NOTE: This kind of array formula can be painfully slow! Personally, I would replace all the E:E with $E$1:$E$999999 to improve the speed.

Related

How to create Excel list from row title including COUNTIF statement?

I have created a spreadsheet with the tally function =COUNTIF(E$2:H$41," * "&$A85&" * "), which is working, but now I would like to add an additional column that lists what groups those tallies occur.
For example, say " * "&$A85&" * " is searching for the word Apple in E$2:H$41 and it was found in E17. I would want the title of that row to show. For this case Fruit from cell A17. If there were other rows in which Apple was found, say red, I would like those listed as well.
I have tried using the INDEX command but cannot get the formula to work that way.
Any help is appreciated.
You didn't say which column your title is in, but if were in column D then the formula below should work. if it's in column A then change the start to =INDEX(A2:A41.
=INDEX(A2:A41,MATCH(1,(ISNUMBER(FIND($A85,E2:E41)))+(ISNUMBER(FIND($A85,F2:F41)))+(ISNUMBER(FIND($A85,G2:G41)))+(ISNUMBER(FIND($A85,H2:H41))),0))
It's an array formula so you need to confirm with Ctrl + Shift + Enter
It's an index formula that indexes D2:D41 and then the match has a look at the 4 columns E, F, G, and H with OR (confusingly the + sign denotes or).
Because you wanted to search within the cell using *, I used ISNUMBER(FIND($A85,G2:G41)) which returns the character number if it finds the text.
To return more than 1 title
=IFERROR(INDEX($A$2:$A$41,SMALL(IF((ISNUMBER(FIND($A$85,$E$2:$E$41)))+(ISNUMBER(FIND($A$85,$F$2:$F$41)))+(ISNUMBER(FIND($A$85,$G$2:$G$41)))+(ISNUMBER(FIND($A$85,$H$2:$H$41))),ROW($A$2:$A$41)-1),ROW(1:1)),1),"")
It's also an array formula so don't forget to Ctrl + Shift + Enter to add the curly brackets.
This formula in a single cell will not return multiple results so you need to drag/copy the formula down enough cells to accommodate as many results as you think will be returned.
each formula will be the same except for the part at the end ROW(1:1:) which will change to ROW(2:2:), ROW(3:3:).
I have placed the formula in cells B85 and B86 and below but I would advise against using this formula in an area of a sheet if you are going to insert and delete rows above as this sometimes breaks the ROW(1:1:) references. I normally put a formula like this on a different sheet from the source data.

Searching within a list of strings with anything in another list of strings in Excel

Example Data
I need to find anything in column B within the strings in Column A and output the cell in Column A in Column C.
I know if it is a short list I can do the highlight cell if a text contains x with Conditional Formatting. However, I have a long list of items that I need to check within the strings of another list.
Let me know if anymore detail needs to be provided. Any help is appreciated. Thanks.
Try this Array formula with wildcards:
=IF(ISNUMBER(MATCH(1, IF(ISNUMBER(SEARCH("*"&$B$1:$B$3&"*",A1)),1,0),0)),"Y","N")
It is an array and need to be confirmed with Ctrl-Shift-Enter.
The search area represented in this small example, $B$1:$B$3 when enlarged must be to the exact range of lookups or it will not return correct values.
You can do this with array formula, type the following in cell C1, then press Ctrl + Shift + Enter:
=INDEX(B:B,MATCH(TRUE,FIND(B:B,A1)<>"#VALUE!",0))
Drag it down column C to match number of rows in column A. You can then put a conditional formatting/filter to see what row in A has substring in B.
If you simply want a yes/no result, enter the following into D1:
=IF(COUNTIF(C1:C6,"<>0")>0,"Found","Not Found")

Is there a 2 Value Look up function in MS Excel that can perform the following?

I am going crazy over this. It seems so simple yet I can't figure this out. I have two worksheets. First worksheet is my data. Second is like an answer key. Upon checking checking, A1:B1 in Sheet 1 is a match with the conditions in Row 52 in SHEET 2, therefore, the value in Column C is "MGC". What is the formula that will perform this function? It's really hard to explain without the data so I pasted a link of the sample spreadsheet. Thank you so much in advance.
sample spreadsheet here. https://docs.google.com/spreadsheets/d/1_AjuNfCdGfEM-XkqPa6W4hSIxQg4NM2Vg4c2C1pQ_vQ/edit?usp=sharing
screenshot here. (wont let me post i have no reputation)
In Sheet2, insert a column in front of Column A and put the formula in A2 =C2&D2.
Then in Sheet1, Cell C2 the formula =vlookup(A2&B2,Sheet2!A:B,2,0).
the first make a concatenated key to lookup, then the second looks up that key.
How about a index(match())? If I've understood correctly you need to match across both the A and B column in sheet one, checking for the relevant values in B and C on sheet 2 to retrun worksheet 2 column a to worksheet 1 column c.
third version try:
=INDEX(Sheet2!$C$1:$C$360,MATCH(Sheet1!A1&Sheet1!B1,Sheet2!$B$1:$B$360&Sheet2!$C$1:$C$360,0))
Basically what this does is use concatenation, the & operator, to specify you are looking for "Criteria A" & "Criteria B" in sheet 1, which makes the string "Criteria A Criteria B", which is supplied in the first part of the match function.
In the second it then says match this against all of my variables in sheet 2 in the same way with concantenation.
The final part of match function (0) specifies you want an 'exact' match
It then supplied this as a reference to the index function, which then finds the row intersecting with the value you want, and returns that.
As noted here https://support.microsoft.com/en-us/kb/59482 this is an array formula, so it behaves differently, and must be input differently. https://support.office.com/en-za/article/Guidelines-and-examples-of-array-formulas-7d94a64e-3ff3-4686-9372-ecfd5caa57c7
There are (at least) 2 ways you could do this without VBA.
USING A SORTED LIST
The first relies on the assumption that your data can be re-sorted, so that everything "Unreported" is in the top, and everything "reported" is together below that (or vice versa). Assuming that this is the case (and it appears to already be sorted like this),we will use the function OFFSET to create a new range which shows only the values that align with either being "Unreported" or "Reported".
Offset takes a given reference to a point on a sheet, and then moves down/up & left/right to see what reference you want to return. Then, it returns a range of cells of a given height, and a given width. Here, we will want to start on Sheet2 at the top left, moving down until we find the term "Unreported" or "Reported". Once that term is found, we will want to move one column to the right (to pull column B from sheet 2), and then have a 'height' of as many rows as there are "unreported" or "reported" cells. This will look as follows in A1 on sheet 1, copied down:
=OFFSET(Sheet2!$A$1,MATCH(A1,Sheet2!A:A,0)-1,1,COUNTIF(Sheet2!A:A,A1),1)
This says: First, start at cell A1 on sheet2. Then find the term in A1 (either "unreported" or "reported", on sheet2!A:A (we subtract 1 because OFFSET starts at A1 - so if your data starts at A1 we need to actually stay at "0". If you have headers on sheet2, you will not need this -1). Then, move 1 column to the right. Go down the rows for as many times as Sheet2 column A has the term found in Sheet1 A1. Stay 1 column wide. Together, this will leave you with a single range on sheet2, showing column B for the entire length that column A matches your term in sheet1 A1.
Now we need to take that OFFSET, and use it to find out when the term in Sheet1 B1 is matched in Sheet2 column B. This will work as follows:
=MATCH(B1,[FORMULA ABOVE],0)
This shows the number of rows down, starting at the special OFFSET array created above, that the term from B1 is matched in column B from sheet2. To use this information to pull the result from column C on sheet 2, we can use the INDEX function, like so:
=INDEX([FORMULA ABOVE],MATCH(B1,[FORMULA ABOVE],0))
Because this would be fairly convoluted to have in a single cell, we can simplify this by using VLOOKUP, which will only require the OFFSET function to be entered a single time. This will work as follows:
=VLOOKUP(B1,[FORMULA ABOVE],2,0)
This takes the OFFSET formula above, finds the matching term in B1, and moves to the 2nd column to get the value from column C in sheet2. Because we are going to use VLOOKUP, the offset formula above will need to be adjusted to provide 2 columns of data instead of 1. Together, this will look as follows:
FINAL FORMULA FOR SHEET1, C1 & COPIED DOWN
=VLOOKUP(B1,OFFSET(Sheet2!$A$1,MATCH(A1,Sheet2!A:A,0)-1,1,COUNTIF(Sheet2!A:A,A1),2),2,0)
OPTION USING ARRAY FORMULAS
The above method will only work if your data is sorted so that the REPORTED and UNREPORTED rows are grouped together. If they cannot be sorted, you can use an ARRAY FORMULA, which essentially takes a formula which would normal apply to a single cell, and runs it over an entire range of cells. It returns an array of results, which must be reduced down to a single value. A basic array formula looks like this [assume for this example that A1 = 1, A2 = 2...A5 = 5]:
=IF(A1:A5>3,A1:A5,"")
Confirm this (and all array functions) by pressing CTRL + SHIFT + ENTER, instead of just ENTER. This looks at each cell from A1:A5, and if the value is bigger than 3, it gives the number from that cell - otherwise, it returns "". In this case, the result would be the array {"";"";"";4;5}. To get the single total of 9, wrap that in a SUM function:
=SUM(IF(A1:A5>3,A1:A5,""))
In your case, we will want to use an array formula to see what row in Sheet2 matches A1 from Sheet1, and B1 from Sheet1. This will look like this:
=IF(Sheet2!$A$1:A$100=A1,IF(Sheet2!$B$1:$B$100,ROW($B$1:$B$100),""),"")
This checks which rows in column A from sheet 2 match A1. For those that do, it then checks which rows in column B from sheet 2 match B1. For those, it pulls the row number from that match. Everything else returns "". Assuming no duplicates, there should only 1 row number which gets returned. To pull that number from the array of results, wrap the whole thing in a MATCH function. Now that you have the row number, you can use an INDEX function to pull the result in Column C with that row, like this:
FINAL ARRAY FORMULA METHOD
=INDEX($C$1:$C$100,MAX(IF(Sheet2!$A$1:A$100=A1,IF(Sheet2!$B$1:$B$100,ROW(Sheet2!$B$1:$B$100),""),"")))
Remember to confirm with CTRL + SHIFT + ENTER instead of just ENTER, when you type this formula. Note that I didn't refer to all of Sheet2!A:A, because array formulas run very slowly over large ranges.
The following formula should work without making any changes to the datasheets.
=INDEX(Sheet2!$A$1:$A$360,MATCH(Sheet1!A1,IF(Sheet2!$C$1:$C$360=Sheet1!B1,Sheet2!$B$1:$B$360),0))
Remember to save this formula as an array with CTRL+SHIFT+ENTER
Documentation on how to use INDEX and MATCH against multiple criteria can be found on Microsoft Support.
It's not clear what you want to do with the multiples that do not have corresponding matches. txed is listed as Unreported twice in Sheet1; kntyctap is listed as Unreported three times. There are only one corresponding match on Sheet2 for each of these.
Non-array Standard Formulas for multiple criteria matches
For Excel 2010 and above use this standard formula in Sheet1!C1:
=IFERROR(INDEX(Sheet2!$A$1:$A$999,AGGREGATE(15,6,ROW(1:999)/((Sheet2!$B$1:$B$999=A2)*(Sheet2!$C$1:$C$999=B1)), COUNTIFS(A$1:A1, A1, B$1:B1, B1))), "")
For version of Excel prior to 2010 use this standard formula in Sheet1!C1:
=IFERROR(INDEX(Sheet2!$A$1:$A$999, SMALL(INDEX(ROW($1:$999)+((Sheet2!$B$1:$B$999<>A1)+(Sheet2!$C$1:$C$999<>B1))*1E+99, , ), COUNTIFS(A$1:A1, A1, B$1:B1, B1))), "")
I've handled error with the IFERROR function in that latter formula. Excel 2003 and previous may have to use an IF(ISERROR(..., ...)) combination.

SUMPRODUCT with SUMIF

I currently have this:
=SUMPRODUCT(SUMIF(A:A;Index(List;;1);B:B))
Column A is a list of names, column B is a list of values for each names. The named range List has 2 columns, the first one are names and the second one are boolean values (0 or 1).
My formula actually works to return the sum of every column B values of its corresponding name in the A column IF that name is in the first column of my named range List. It works fine.
However, I would like to filter that to only include names from List that have the boolean value equal to 1 (ie. Index(List;;2) = 1.
How is this possible?
This is what I tried but it gives me a #REF! error:
=SUMPRODUCT(SUMIF(A:A;Index(List;;1)*Index(List;;2);B:B))
Probably best to switch to an array formula**:
=SUM(SUMIF(A:A,IF(INDEX(List,,2),INDEX(List,,1)),B:B))
**Array formulas are not entered in the same way as 'standard' formulas. Instead of pressing just ENTER, you first hold down CTRL and SHIFT, and only then press ENTER. If you've done it correctly, you'll notice Excel puts curly brackets {} around the formula (though do not attempt to manually insert these yourself).
Since your Named Range consists of discontinous ranges, when INDEXing it you will need to include INDEX's 4th parameter (area_num) in order to clarify which of the ranges ($B$2:$B$100 or $L$2:$W$100) you wish to refer to, e.g.:
=INDEX(List,60,1,**2**)
which will return the value in cell L61.
Regards

Want to stop COUNTBLANK at last row with no data

I am trying to use COUNTBLANK to count the number of blank cells in a column, but the function returns an extremely high value because (I think) it's counting all the way to the end of the worksheet.
I want it to stop counting at the first blank cell in the A column. Here is the formula I started with:
=COUNTBLANK(DbT!BZ:BZ)
I want to know how many rows have a blank BZ column AND a value in the A column. I also tried this function:
=COUNTIFS(DbT!BZ:BZ," ",A:A,"")
This formula works:
=COUNTIFS(DbT!BZ:BZ, "",DbT!S:S, "<>")
Assuming your column A is empty after that first blank, you could do the following:
Get the length of the needed range
COUNTA(A:A)
Get the range in the B column that's just as long
OFFSET(B1,0,0,COUNTA(A:A))
Use this as range for your COUNTBLANK
=COUNTBLANK(OFFSET(B1,0,0,COUNTA(A:A)))
If the first assumption is incorrect, you could use the row number of the first blank in column A instead of the COUNTA but I'll have to look around a bit longer for that one...
I am still not entirely clear on what you mean by "I want it to stop counting at the first blank cell in the A column," but if, alternatively, you're looking for the number of rows that have both a blank cell in column BZ and a non-blank cell in column A, as you also say above, then this formula should help:
=COUNTIFS(A:A,"<>",BZ:BZ,"")
EDIT:
OK I think I have it now. It's an array formula, so you'll need to press CTRL + SHIFT + ENTER instead of just ENTER after typing it in the cell:
=SUMPRODUCT(IF(NOT(ISBLANK(A:A)),1,0),IF(TRIM(BZ:BZ)="",1,0))
EDIT 2:
If you prefer a slightly simpler formula, this works too:
=SUMPRODUCT(INT(NOT(ISBLANK(A1:A8))),INT(TRIM(B1:B8)=""))
It's still an array formula, so you'll need to press CTRL + SHIFT + ENTER

Resources