I have a column of cells whose values are something like this:
a
a
b
b
c
c
c
c
d
e
f
f
etc.
I'm looking to take the non-duplicated values and paste them into a new column. My pseudocode for this is as follows:
ActiveSheet.Range("a1").End(xlDown).Select
aend = Selection.Row
for acol= 1 to aend
ActiveSheet.Range("b1").End(xlDown).Select
bend = Selection.Row
'if Cells(1,acol).Value <> any of the values in the range Cells(2,1).Value
'to Cells(2,bend).Value, then add the value of Cells(1,acol) to the end of
'column b.
Does my logic in this make sense? I'm not sure how to code the commented portion. If this isn't the most efficient way to do it, could someone suggest a better way? Thanks so much!
I would use a simple array, go through all the letters and check if the letter you are on is in the array:
I use a collection, which can't have duplicate keys, to get the unique items from a list. Try to add each item to a collection and ignore the errors when there's a duplicate key. Then you'll have a collection with a subset of unique values
Depending on which version of Excel you are using, you can use some built-in Excel functionality to obtain what you want- the whole solution depends on your level of skill with VBA.
Excel 2003:
You can use the
Advancedfilter
method (documentation) of your range to obtain the unique values and copy them to your target area. Example:Where
B1
is the first cell of the column you wish to copy the unique values to. The only problem with this method is that the first row of the source column ("A1") will be copied to the target range even if it is duplicated. This is because the AdvancedFilter method assumes that the first row is a header.Therefore, adding an additional code line we have:
Excel 2007 / 2010:
You can use the same method as above, or use the
RemoveDuplicates
method (documentation). This is similar to the AdvancedFilter method, except thatRemoveDuplicates
works in-place, which means you need to make a duplicate of your source column and then perform the filtering, for example:The final parameter
Header
controls whether the first cell of the source data is copied to the destination (if it's set to true then the method similarly to the AdvancedFilter method).If you're after a "purer" method, then you can use a VBA
Collection
ordictionary
- I am sure that someone else will offer a solution with this.For completeness, I'm posting the Scripting.Dictionary method: it's the commonest alternative to using a VBA.Collection and it avoids the need to rely on error-handling in normal operation.
A VBA Function using the Scripting.Dictionary Object to Return Unique Values from an Excel Range Containing Duplicates:
A couple of notes: