comparing 2 columns

P

PLPE

I would like to compare cells in column B with cells in column A. If
cell in column B is found in column A, corresponding cell in column C
will display message, else "Not Found!".

My problem lies in the fact that text in column B is not exactly equal
to text in column A.

I have read other threads on this but none tackle the text strings not
being exactly equal.

Example;
Cell A1: QWERT ASDF
Cell B1: QWERTYU ASDFG

Any help really appreciated
 
M

mangesh_yadav

What should be the result for the example you provided. Should it be no
found. If otherwise, on what parameters do you want to match the
texts?

Manges
 
P

PLPE

Suppose I have the following;


[A1] QWE RTYU [B1] QWE RT [C1] QWE RTYU
[A2] ASD FGH [B2] ASD F [C2] ASD FGH
[A3] QAZ WSX [B3] GHJ KL [C3] 'QAZ WSX' NOT FOUND

Column A will always be larger (greater # of rows) than column B.
Cells that do not match I would like to use shading to indicate. (I
think I will use conditional formatting for this purpose).

I have being using the 'VLOOKUP' function, but this is not really
suitable for my needs. Ultimately, I want the file to be user-friendly
and automated.

I have also tried using 'IF(COUNTIF(RANGE,CELL)>0,"",CELL & "NOT
FOUND")'.
 
N

Nigel

Your example is they are NOT the same! So what is the condition(s) that
allow a string to match?

Is it spaces embedded or at beginning or end, or parts of strings etc.....

Exact matches are easy - in-exact matches need clear conditions
 
N

Nigel

Are you saying that 'any' string in column B has to match the left (variable
length) 'any' string in column A - if it does put column A string into
column C, if not then put column A string & "not found" in column C - or is
it a row by row comparison?
 
J

jindon

Hi,

UDF

Use like in cell
=wfind(A1,B$1:B$10)


Code
-------------------

Function wfind(r As Range, rng As Range) As String

Dim c As Range, txt1, txt2, flag As Boolean
txt1 = Split(r, " "): flag = False
For Each c In rng
txt2 = Split(c, " ")
For i = LBound(txt1) To UBound(txt1)
If Trim(txt1(i)) Like Trim(txt2(i)) & "*" Then
flag = True
Else
flag = False
End If
Next
If flag = True Then
wfind = r & " Found": Exit Function
End If
Next
wfind = r & " not found"

End Function
 
P

PLPE

Column A & B do not match exactly, but are pretty close.
Originally, both columns had '_' & '@' included, but I added macros t
getr rid of these - easier to do comparisons (methinks!).

Here are some of my entries;

[Col A];
RD INP LKG 0V
RD INP LKG 5V25

[Col B];
RD INP LKG 5V25 nA
CS INP LKG 5V25 nA

[Col C];
RD INP LKG 5V25 - Found
CS INP LKG 5V25 nA - Not Found


{I think *Jindon* has me on the right track, but it's still not workin
for me!
 
P

PLPE

jindon said:
Code:
--------------------
Function wfind(r As Range, rng As Range) As String

Dim c As Range, txt1, txt2, flag As Boolean
txt1 = Split(r, " "): flag = False
For Each c In rng
txt2 = Split(c, " ")
For i = LBound(txt1) To UBound(txt1)
If Trim(txt1(i)) Like Trim(txt2(i)) & "*" Then
flag = True
Else
flag = False
End If
Next
If flag = True Then
wfind = r & " Found": Exit Function
End If
Next
wfind = r & " not found"

End Function
--------------------

I've been banging around with this code and the idea behind it for the
day. It will simply return "txt1 Found", regardless of whether txt2 is
present or not.

Any other ideas? ♦¿♦
 
J

jindon

PLPE

added 3rd argument to determine number of words to be compared.
e.g.
=wfind(b1,a$1:a$10,3)
will compare first 3 words

Code
-------------------

Function wfind(r As Range, rng As Range, Optional cap As Integer) As String

Dim c As Range, txt1, txt2, flag As Boolean, i As Integer
txt1 = Split(r, " "): flag = False
If IsMissing(cap) Then
cap = UBound(txt1)
Else
cap = cap - 1
End If
For Each c In rng
txt2 = Split(c, " ")
For i = LBound(txt1) To cap
If Trim(txt1(i)) Like Trim(txt2(i)) & "*" Then
flag = True
Else
flag = False: Exit For
End If
If i = UBound(txt2) Then Exit For
Next
If flag = True Then
wfind = r & " Found": Exit Function
End If
Next

wfind = r & " not found"

End Function

-------------------

Column A & B do not match exactly, but are pretty close.
Originally, both columns had '_' & '@' included, but I added macros t
getr rid of these - easier to do comparisons (methinks!).

Here are some of my entries;

[Col A];
RD INP LKG 0V
RD INP LKG 5V25

[Col B];
RD INP LKG 5V25 nA
CS INP LKG 5V25 nA

[Col C];
RD INP LKG 5V25 - Found
CS INP LKG 5V25 nA - Not Found


{I think *Jindon* has me on the right track, but it's still not workin
for me!
 
M

mangesh_yadav

Hi PLPE,

enter the following formula in cell C1 and copy down:
=IF(ISNUMBER(FIND(B1,A1)),A1,A1&" not found")

Mangesh
 
P

PLPE

Thanks for all the replies.
Unfortunately, I can't try them out until tomorrow afternoon.
As soon as i do, i'll get back with results.

Thank yo
 
P

PLPE

jindon said:
PLPE

added 3rd argument to determine number of words to be compared.
e.g.
=wfind(b1,a$1:a$10,3)
will compare first 3 words Code:
--------------------
Function wfind(r As Range, rng As Range, Optional cap As Integer) As String

Dim c As Range, txt1, txt2, flag As Boolean, i As Integer
txt1 = Split(r, " "): flag = False
If IsMissing(cap) Then
cap = UBound(txt1)
Else
cap = cap - 1
End If
For Each c In rng
txt2 = Split(c, " ")
For i = LBound(txt1) To cap
If Trim(txt1(i)) Like Trim(txt2(i)) & "*" Then
flag = True
Else
flag = False: Exit For
End If
If i = UBound(txt2) Then Exit For
Next
If flag = True Then
wfind = r & " Found": Exit Function
End If
Next

wfind = r & " not found"

End Function
--------------------

This code will return "Found" regardless of what it is passed to it
{even empty cells}. -Any chance you could add in a few comments so I
can see exactly where you're coming from with this Jindon-?

Thanks again
 
J

jindon

Hi,

Since I wasn't sure how many words to compare from your sample data,
added 3rd argument to determine.

e.g
in cell
=wfind(A1:B1:B10,3)

The code will:

go through B1 to B10 testing if there is a cell which matches number of
words from the left.

if A1 contains AA BBB CCC nn (will test up to CCC, since the 3rd arg is
3)

B1 AA BBB nn (not found)
B2 AA BBB CCC DDD FFF (found)
B3 AA CCC BBB nn (not found)
B4 AA BBB CCC dd (found)
B5 BB AAA CCC (not found)
B6 CC BBB AAA dd (not found)
B7 AAA BBB CCC QQ (found)
 
P

PLPE

This is working a lot better now, thanks Jindon.
I still have a few mismatches, namely due to >3 words in the name.
These I can use conditional formatting on and have the user intervene
to rectify.

The end product will be able to take in files of different column
depths from 2 files, compare them and highlight any differences ->
basically to minimise user time and hence cost.

Thanks.
 
P

PLPE

how much more complicated would this UDF get if I were to add a 4t
argument??? :confused
 
J

jindon

HI,

The thing I need is a CLEAR LOGIC

If you can provide us a logic that we can encode, the problem are
solved already.

rgds,
jindon
 
J

jindon

Hi,

The rules of how to test.

i.e

The possible reason that you want to add another argument.

If the rule to test the value(string), it will be possibly totally
different from the code that I have already posted. I mean another
method to use.

What I understood at the first time is to test the whole string with
others as a part.
Then it is now part and part. ??

rgds,
jindon
 
P

PLPE

At present this is my situation;

I am trying to compare cells (alpha-numeric entries) in 2 columns, A
and C (of different depths). Some of the cell entries in A and C are
exactly equal, while the majority are not.

If a cell in C [say C1] matches a cell in A [say A1], a cell in E [E1]
displays ".... Found". Otherwise, the next closest match is returned.

The following is the UDF;
**************************************************
* *UDF code by Jindon*
*
**************************************************
Function wfindx(r As Range, rng As Range, Optional cap As Integer) As
String

Dim txt1, txt2, rngArray, x, flag As Boolean
' If cell is empty; EXIT!
If IsEmpty(r) Then Exit Function

txt1 = Split(r, " ") ' Split r value by space and put them into an
array.
rngArray = rng.Value ' Put the rng values in an array.

If IsMissing(cap) Then ' Adjusting arg, cap.
cap = UBound(txt1) ' If missing; cap = ubound(txt1).

' If cap is bigger than ubound(txt1).
ElseIf cap - 1 > UBound(txt1) Then
cap = UBound(txt1)
Else
cap = cap - 1 ' Because Lower bound of the array populated from
End If ' Split function is always 0, so needs to be adjusted

For i = LBound(txt1) To cap
x = x & txt1(i) & Chr(32) ' Populate testing string according to the
cap value
Next
' Put the testing string to variable x
x = Trim(x)
For i = LBound(rngArray) To UBound(rngArray) ' Start loop to test
rngArray
' If length of rngArray value is less than testing value, go to Next
If Len(rngArray(i, 1)) < Len(x) Then GoTo skip
' If the testing value found from the begining of the rngArray value
If InStr(1, rngArray(i, 1), x, vbTextCompare) = 1 Then
wfindx = r & " Found": Exit Function
End If
skip:
Next

End Function
***********************************************

Problem with this UDF;
Col A:
D11 10 9 8 TRI STATE LKG 0V
D11 10 9 8 TRI STATE LKG 0V
D11 10 9 8 TRI STATE LKG 0V
D11 10 9 8 TRI STATE LKG 0V

Col C;
D11 10 9 8 TRI STATE LKG 0V
D11 10 9 8 TRI STATE LKG 1V
D11 10 9 8 TRI STATE LKG 2V
D11 10 9 8 TRI STATE LKG 3V

and type into col E: "=wfindx(Cell,Range,3)"
then Col E returns;
D11 10 9 8 TRI STATE LKG 0V Found
D11 10 9 8 TRI STATE LKG 1V Found
D11 10 9 8 TRI STATE LKG 2V Found
D11 10 9 8 TRI STATE LKG 3V Found


even though :-
D11 10 9 8 TRI STATE LKG 1V Found
D11 10 9 8 TRI STATE LKG 2V Found
D11 10 9 8 TRI STATE LKG 3V Found
-: are not in the range (Col A).

Can you advise me how to fix this.?

OR:-

could I avoid the hassle of a lengthy UDF by using a VB function?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top