Find function works weird - excel

Well... It's really weird, but let me explain.
I am trying to get the country string from the A1. So i should get the position of second # and after that i can use MID and get the country. But, well.. Please check out.
Here is the situation:
A1: "Abergwili# Wales# United Kingdom"
B1: =FIND("#";A1;1) > Result: 10 >> Correct!
C1: =FIND("#";A1;B1) > Result: 10 >> What??? It should output 7! I really don't get it!
Any help?

The FIND function in Excel uses the last argument as the string index to start searching from. If that index matches the target string, it will return that index again. There are a few options:
You could restructure your current FIND function to start at the character after B1's result, which will produce the formula =FIND("#",A1,B1+1). To get the position relative to B1, you could subtract the value of B1, which creates =FIND("#",A1,B1+1)-B1. (This is similar to JvdV's answer)
You could explicitly search through the remaining substring after the first match using the RIGHT function, which transforms the original function to =FIND("#",RIGHT(A1, LEN(A1)-B1)), which automatically returns the result relative to the last match. To get the absolute result, you could add the value of B1 back in, creating =FIND("#",RIGHT(A1, LEN(A1)-B1))+B1.
Good luck!
(Side note - You probably want commas instead of semicolons, unless your Excel is set up to work with them. My Excel complained mightily when testing with ; characters)

Related

Excel: referencing a portion of file name only

Please help, i'm looking to reference a portion of my file name in an excel cell, see below example:
File name: 000_XYZ_ABC_DEF ; I need to reference the ABC portion (but this won't be limited to only 3 letters as this varies) - is there a formula I could use that would cater for the variance as well as only referencing this portion?
thank you
In B1, formula copied down :
=TRIM(LEFT(RIGHT(SUBSTITUTE(A1,"_",REPT(" ",30)),60),30))
Well, very brutal with MID() and FIND() but works:
Basic explanation is that MID() takes the characters from a string from the start points and end point you define.
The use of find() is to locate the second underscore which is the start point (plus 1 though) and the position of the 3rd underscore which with the position of the second gives the number of characters to return.
It will be good practice to take it all apart.
Edit: I have added the complete function, so that you can copy it directly:
=MID(A1,FIND("_",A1,FIND("_",A1,1)+1)+1,FIND("_",A1,FIND("_",A1,FIND("_",A1,1)+1)+1)-FIND("_",A1,FIND("_",A1,1)+1)-1)
In your comment you have not included in your function the "_" which is the precise bits of the text FIND() is looking for. Compare mine to yours from your comment:
=MID(A1,FIND("",A1,FIND("",A1,1)+1)+1,FIND("",A1,FIND("",A1,FIND("",A1,1)+1)+1)-FIND("",A1,1)+1)-1

Excel - lookup multiple values in a string and return first one

I need a function to look up organizational abbreviations in a text and return the first one thas shows up. I tried to solve that with a nested if clause but it has a logical error.
=IF(ISNUMBER(SEARCH("BZC";I5)); "Finanz"; IF(ISNUMBER(SEARCH("AZC" /1";I5));"IT";""))
It looks up BZC and AZC as desired and return the organization name. However, it does no return the first match in a string. Since BZC is the first lookup it will always be returned if it is in the string, eventhoug it might not be the first org abbreviation.
What functionality of excel can be used to solve this issue? I basically need an array of variables that a function should do a look up and return the first one that is found.
Edit:
I tried to implement the formula form Justyna MK. Besides the fact, that I still need to figure out the meaning of the formula (iferror, mid, small) It returns #N/A in my example. Is there a certain reason for that?
I hope I understood your request correctly. Here's an Array formula for you to try (enter using Ctrl + Shift + Enter):
=CHOOSE(MATCH(MID(A1,SMALL(IFERROR(SEARCH({"BZC","AZD","xxx"},A1),""),1),3),{"BZC","AZD","xxx"},0),"Finanz","IT","Other")
You'd probably need to change , to ; in order to match your regional settings.
You can easily expand the list of search items by modifying the contents of curly brackets { } and also by expanding the MATCH results at the very end of the formula.
Here's some sample result:
Edit: here's an adjusted solution that ignores the length of your code (the previous solution was assuming that the code is always 3-characters long). This time it's not an array formula so you can enter it as it is.
Also, I suspect that you should not change , to ; inside the curly brackets (it would modify the formula from column to row delimiter and thus it will stop working). The remaining , can be transformed to ;, if that makes sense.
=CHOOSE(MATCH(TRIM(LEFT(SUBSTITUTE(RIGHT(A1,LEN(A1)-SUMPRODUCT(SMALL(IFERROR(SEARCH({"BZC","AZD","XYZX/1","NP-HSD"},A1),""),1))+1)," ",REPT(" ",255)),255)),{"BZC","AZD","XYZX/1","NP-HSD"},0),"Finanz","IT","Other1","Other2")
The result:

Excel, equation to output either 'Agent name', "COPY", or "Not Found"

I had an excel test that I didn't do particularly well on, but this one question had me stumped. I need an equation that takes the name in this list and outputs the agent name in 'first.initial' or "COPY" or "NOT FOUND"
Sheet 1:
Agent 
Adam.m
Agent 
David.e
Agent 
Joe.A 
Agent
Ben.B
Agent
Kat.C
Agent
Training.22
Agent
Admin
Convert these names: Correct output:
David Everit David.e
Joe a. Joe.A
Ben Ben.B
Sam p. NOT FOUND
Training 22 Training.22
David E. COPY
Kat Cathy Kat.C
David D. NOT FOUND
Adam.S NOT FOUND
The equation I submitted that my teacher said was wrong was:
=IFNA(IF(COUNTIF(Sheet1!A:A, A3)>1, "COPY", INDEX(Sheet1!A:A,MATCH(A3&"*",Sheet1!A:A,0))),"Not Found")
Well here's the thing.
You are checking the original data source for the name, pre-conversion. I must admit, the COPY was a bit misleading at first but I caught on later.
You are also wrapping the whole thing in a single logical... ISNA()... Your formula can only return TRUE, FALSE or an error from this.
Putting the wrapped ISNA() aside, this means that for your formula the majority of these entries are Not Found. True, if you instead had a list of data that had already been manipulated this would almost succeed. But you are checking for the "COPY" in the wrong data...
Your first task here would be to manipulate the data to the desired format of '[Firstname].[initial]' // So assuming that the first set of characters in the cell is always going to be the forename you can use a combination of something like:
=LEFT(A2,SEARCH(" ",A2)-1) - Gets the forname by returning the left-most characters to a length of the first space position minus 1.
=RIGHT(A2,LEN(A2)-SEARCH(" ",A2)) - Gets all characters to the right of space by determining the legth from the right as the total cell length minus the position of space.
You will need to perform a logical on the second scenario though as you want a single letter is it is a word or the entire thing if it is a number:
=IFERROR(RIGHT(A2,LEN(A2)-SEARCH(" ",A2))-0,MID(A2,SEARCH(" ",A2)+1,1))
So what i have done here is attempt to remove 0 from the string, if it is a number, this will succeed and return that number to us. If it fails it will produce an error and progress on to the second clause, giving us the single character.
You can combine these using simple string building or a concatenate clause:
=LEFT(A2,SEARCH(" ",A2)-1)&"."&IFERROR(RIGHT(A2,LEN(A2)-SEARCH(" ",A2))-0,MID(A2,SEARCH(" ",A2)+1,1))
or
=CONCATENATE(=LEFT(A2,SEARCH(" ",A2)-1),".",IFERROR(RIGHT(A2,LEN(A2)-SEARCH(" ",A2))-0,MID(A2,SEARCH(" ",A2)+1,1))
So now we are almost there, except that Ben and Adam are producing errors as there isn't a space character that can be found. We'll handle that error now so that we can move on to our search:
=IF(ISERROR(SEARCH(" ",A2)),A2,LEFT(A2,SEARCH(" ",A2)-1)&"."&IFERROR(RIGHT(A2,LEN(A2)-SEARCH(" ",A2))-0,MID(A2,SEARCH(" ",A2)+1,1))) - if you cannot find a space character then we will have the whole cell, otherwise, we will use the space to build the search term.
Now that we have the text formatted in the way that we want it, we can move forward to do the search, the order is important as we will need to first check our results from above for duplicates and print "COPY" where found, then look for the match and return it if it's there and lastly return "NOT FOUND" if we cannot find it.
We are going to need the use of the wildcard in order to satisfy the entry Ben. So let's show the logic first then throw the whole formula together:
=IF(COUNTIF($B$1:B1,[SearchTermFormula]),"COPY", - This part of the formula uses countif to check whether the search term already exists above it, returns "COPY" if so and will continue to the next part, the absolute referencing ($$) is important so that the range updates as you copy the formula down but keeps the first cell locked.
IF(ISNUMBER(MATCH([SearchTermFormula]&"*",Sheet1!$A$1:$A$14,0)),[SearchTermFormula],"NOT FOUND") - So this works to show the basic logical, again we use IF() to determine whether a match can be made as a number would be returned if so. We can then return the search term itself or "NOT FOUND".
A more elegent version of this part though would be:
IFERROR(INDEX(Sheet1!$A$1:$A$14,MATCH([SearchTermFormula]&"*",Sheet1!$A$1:$A$14,0)),"NOT FOUND"))
As it actually returns the result from sheet1 as well as making us use the [SearchTermFormula] 1 less time, using less resources.
INDEX() essentially maps the range as a 1 based array. What that means is the first cell in the range is considered an address of 1,1. You can think of it adding X and Y axis but 0,0 is outside the top left and the Y axis is inverted.
So we get it to index column A and MATCH returns the relative position, as the row's are equally sized, the relative position will be the row number we are after so we get the result returned or an error value, so IFERROR() leads us on to produce "NOT FOUND".
Putting all that together we have:
=IF(COUNTIF($B$1:B1,IF(ISERROR(SEARCH(" ",A2)),A2,LEFT(A2,SEARCH(" ",A2)-1)&"."&IFERROR(RIGHT(A2,LEN(A2)-SEARCH(" ",A2))-0,MID(A2,SEARCH(" ",A2)+1,1))))>0,"COPY",IFERROR(INDEX(Sheet1!$A$1:$A$14,MATCH(IF(ISERROR(SEARCH(" ",A2)),A2,LEFT(A2,SEARCH(" ",A2)-1)&"."&IFERROR(RIGHT(A2,LEN(A2)-SEARCH(" ",A2))-0,MID(A2,SEARCH(" ",A2)+1,1)))&"*",Sheet1!$A$1:$A$14,0)),"NOT FOUND"))
Sorry for the essay but I hope it helps you understand the scope

retrieve part of the info in a cell in EXCEL

I vaguely remember that it is possible to parse the data in a cell and keep only part of the data after setting up certain conditions. But I can't remember what exact commands to use. Any help/suggestion?
For example, A1 contains the following info
0/1:47,45:92:99:1319,0,1320
Is there a way to pick up, say, 0/1 or 1319,0,1320 and remove the rest unchosen data?
I know I can do text-to-column and set the delimiter, followed by manually removing the "un-needed" data, but my EXCEL spreadsheet contains 100 columns X 500000 rows with each cell looking similar to the data above, so I am afraid EXCEL may crash before finishing the work. (have been trying with LEFT, LEN, RIGHT, MID, but none seems to work the way I had hoped)
Any suggestion will be greatly appreciated.
I think what you are looking for is combination of find and mid, but you'll have to work out exactly how you want to split your string:
A1 = 0/1:47,45:92:99:1319,0,1320 //your number
B1 = Find(“:“,A1) //location of first ":" symbol
C1 = LEN(A1) - B1 //character count to copy ( possibly requires +1 or -1 after B1.
=Left(A1,B1) //left of your symbol
=Mid(A1,B1+1,C1) //right size from your symbol (you can also replace C1 with better defined number to extract only 1 portion
//You can also nest the statements to save space, but usually at cost of processing quantity increase
This is the concept, you will probably need to do it in multiple cells to split a string as long as yours. For multiple splits you probably want to replicate this command to target the result of previous right/mid command.
That way, you will get cell result sequence like:
0/1:47,45:92:99:1319,0,1320; 47,45:92:99:1319,0,1320; 92:99:1319,0,1320; 99:1319,0,1320......
From each of those you can retrieve left side of the string up to ":" to get each portion of a string.
If you are working with a large table you probably want to look into VB scripting. To my knowledge there is no single excel command that can take 1 cell and split it into multiple ones.
Let me try to help you about this, I am not a professional so you may face some problems. First of all my solution contains 2 columns to be added to the source column as you can see below. However you can improve formulas with this principle.
Column B Formula:
=LEFT(A2,FIND(":",A2,1)-1)
Column C Formula:
=RIGHT(A2,LEN(A2)-FIND("|",SUBSTITUTE(A2,":","|",LEN(A2)-LEN(SUBSTITUTE(A2,":","")))))
Given you statement of having 100x columns I imagine in some instances you are needing to isolate characters in the middle of your string, thus Left and Right may not always work. However, where possible use them where you can.
Assuming your string is in cell F2: 0/1:47,45:92:99:1319,0,1320
=LEFT(F2,3)
This returns 0/1 which are the first 3 characters in the string counting from the left. Likewise, Right functions similarly:
=RIGHT(F2,4)
This returns 1320, returning the 4 characters starting from the right.
You can use a combination of Mid and Find to dynamically find characters or strings based off of defined characters. Here are a few examples of ways to dynamically isloate values in your string. Keep in mind the key to these examples is the nested Find formula, where the inner most Find is the first character to start at in the string.
1) Return 2 characters after the second : character
In cell F2 I need to isolate the "92":
=MID(F2,FIND(":",F2,FIND(":",F2)+1)+1,2)
The inner most Find locates the first : in the string (4 characters in). We add the +1 to move to the 5th character (moving beyond the first : so the second Find will not see it) and move to the next Find which starts looking for : again from that character. This second Find returns 10, as the second : is the 10th character in the string. The Mid formula takes over here. The formula is saying, Starting at the 10th character return the following 2 characters. Returning two characters is dictated by the 2 at the end of the formula (the last part of the Mid formula).
2) In this case I need to find the 2 characters after the 3rd : in the string. In this case "99":
=MID(F2,FIND(":",F2,FIND(":",F2,FIND(":",F2)+1)+1)+1,2)
You can see we have simply added one more nested Find to the formula in example 1.

I'm trying to make a formula that checks a number in excel, but the cell has to include the dashes

I have something like this:
A1: ABC-DE442
B1: 0069-1234-12
I'm trying to make a formula that will look at A1, get the number 442, and then check if B1 is in the format of 4 numbers, a dash, 4 numbers, a dash, and then finally 2 numbers. I want to make sure that this could work with any number besides 442 though. So if I had like 123 instead of 442, it would need to be 1 number, dash, 2 numbers, dash, and three numbers.
It would also need to give me an error if I had something like this:
A1: ABC-DE442
B1: 004-2345-34
because it only has three numbers in the first section before the dash.
Hopefully I have been clear enough in what I'm trying to do. Any help would be greatly appreciated.
So in the end, this is the giant formula I had to create:
=IF(LEN(LEFT(J4,FIND("-",J4)-1))=VALUE(MID(I4,9,1)),IF(LEN(LEFT(MID(J4,FIND("-",J4)+1,999),FIND("-",MID(J4,FIND("-",J4)+1,999))-1))=VALUE(MID(I4,10,1)),IF(LEN(MID(MID(J4,FIND("-",J4)+1,999),FIND("-",MID(J4,FIND("-",J4)+1,999))+1,999))=VALUE(MID(I4,11,1)),"True","Doesn't match code part 3"),"Doesn't match code part 2"),"Doesn't match code part 1")
J15: 0069=LEFT(J5,FIND("-",J5)-1)
J16: 4=VALUE(MID(I5,7,1))
J17: 4=LEN(J15)
J18: 0469-56=MID(J5,FIND("-",J5)+1,999)
J19: 0469=LEFT(J18,FIND("-",J18)-1)
J20: 4=VALUE(MID(I5,8,1))
J21: 4=LEN(J19)
J22: 56=MID(J18,FIND("-",J18)+1,999)
J23: 2=VALUE(MID(I5,9,1))
J24: 2=LEN(J22)
Hopefully all of these formulas will make it easier to understand how I combined everything together.
I essentially put every formula into one giant one using the information used in the answer I said was right. For the first part, I took the LEN(D1) but had it all written out, and then set it equal to the =VALUE(MID(A1,7,1)).
Then, for the true part of that if statement, I had to first get A1 without D1, then get it to just be the middle section using the LEFT formula, and then finally taking the LEN of that. Checked to see if it was equal to the =VALUE(MID(I4,10,1)), which was the next number in B1.
If that was true, I went to the final IF statement which again had to go through the same process of getting the last section of A1 on it's own, taking the length of that, and seeing if it was equal to =VALUE(MID(I4,11,1)).
Finally, I just created different print statements for the last true, and every false section of the IF statements.
Moral of the story, I was able to make a formula that works with every single number combination because it turns out B1 could only be in the form of AB - CDE###, so I could always find that number in B1 and compare it.
This should be possible with Excel formulae but it will get a bit complicated. The functions you're probably going to want to make use of are FIND, LEFT, LEN, MID, and VALUE.
For example,
C1: =FIND("-",B1)
will return the position of the first dash in the string to be tested, which for your example is 5. Then
D1: =LEFT(B1,C1-1)
would return the characters before that dash, i.e. '0069'. Meanwhile you need to get the lengths of the three runs of digits out of your first string (the one in A1). Will that string always be the same length? If so you can use e.g.
=VALUE(MID(A1,7,1))
which returns the 7th character of the string in A1 and converts it to a number (4). Now you can test whether that value is equal to the length of the first run of characters, i.e. LEN(D1).
But are those characters all numeric? Well, you can try converting them to a number with VALUE(D1) which will return #VALUE if the argument can't be made into a number.
OK, that checked the first run of characters, what about the rest of them? Well,
=MID(B1,FIND("-",B1)+1,999)
will give you the remainder of the original string after the first dash, which you can analyse in the same way, and so on.
It's easiest to develop these formulae by using lots of cells to hold the intermediate values as you work them out, but once you're confident these are working OK you can consolidate them into fewer cells. Whatever you come up with, make sure you test it with lots of different inputs to check that your formulae respond to them in the way that you expect. (In particular, check what happens if you have one or more spaces after a dash, as VALUE will ignore leading spaces - you might want to use a SUBSTITUTE function on your initial text to remove any spaces.)

Resources