#1   Report Post  
Posted to microsoft.public.excel.programming
tjh tjh is offline
external usenet poster
 
Posts: 96
Default ListBox

Hello,

I am trying to create a 2 column listbox using data from column "O" and
column "I" in a spreadsheet. Additionally, there are duplicate values in
these columns. I would like to remove any duplicates so the Listbox only
shows one of each value in the list. Also, no blank rows. Below is code that
I have used for one column, but I am not familiar with creating two columns
and then removing any duplicate values. Any help would be greatly
appreciated. Thank You,


Dim myRng As Range
Dim myCell As Range


With ActiveSheet
Set myRng = .Range("O1", .Cells(.Rows.Count, "O").End(xlUp))
End With

For Each myCell In myRng.Cells
If myCell.Value = 0 Or myCell.Value = "SPC" Then
Else
Me.ListBox1.AddItem myCell.Value
End If
Next myCell



  #2   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 35,218
Default ListBox

John Walkenbach has a sample of how to fill a listbox with unique items at:
http://j-walk.com/ss/excel/tips/tip47.htm

I figured I could just join the values from the two columns, add that string to
the process to eliminate duplicates and then separate it into two when I was
done.

But I was kind of confused at your requirements, though. Can column "0" be
blank, but I not? Can I be blank, but not "O".

This portion:
If Cell.Value = 0 _
or ucase(cell.value) = "SPC" _
Or Cell.Value = "" _
Or myStr = Chr(1) Then

Can be modified to flunk out the stuff you don't want.


Option Explicit
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub UserForm_Initialize()

Dim AllCells As Range, Cell As Range
Dim NoDupes As New Collection
Dim i As Long, j As Long
Dim Swap1, Swap2, Item
Dim myStr As String
Dim mySplit As Variant

Me.ListBox1.ColumnCount = 2

With ActiveSheet
Set AllCells = .Range("O1", .Cells(.Rows.Count, "O").End(xlUp))
End With

On Error Resume Next
For Each Cell In AllCells
myStr = Cell.Value & Chr(1) & Cell.Offset(0, -6).Value
If Cell.Value = 0 _
or ucase(cell.value) = "SPC" _
Or Cell.Value = "" _
Or myStr = Chr(1) Then
'do nothing
Else
NoDupes.Add myStr, CStr(myStr)
End If

Next Cell
On Error GoTo 0

' Sort the collection (optional)
For i = 1 To NoDupes.Count - 1
For j = i + 1 To NoDupes.Count
If NoDupes(i) NoDupes(j) Then
Swap1 = NoDupes(i)
Swap2 = NoDupes(j)
NoDupes.Add Swap1, befo=j
NoDupes.Add Swap2, befo=i
NoDupes.Remove i + 1
NoDupes.Remove j + 1
End If
Next j
Next i

For Each Item In NoDupes
mySplit = Split97(CStr(Item), Chr(1))
'or if xl2k and higher
'mySplit = Split(CStr(Item), Chr(1))
With Me.ListBox1
.AddItem mySplit(LBound(mySplit))
.List(.ListCount - 1, 1) = mySplit(UBound(mySplit))
End With
Next Item

End Sub
Function Split97(sStr As String, sdelim As String) As Variant
'from Tom Ogilvy
Split97 = Evaluate("{""" & _
Application.Substitute(sStr, sdelim, """,""") & """}")
End Function


=====
Split was added in xl2k. If you're using xl97, use Tom's split97. If you and
your users are all at xl2k or higher, you can delete that function completely
and use the built in Split.

tjh wrote:

Hello,

I am trying to create a 2 column listbox using data from column "O" and
column "I" in a spreadsheet. Additionally, there are duplicate values in
these columns. I would like to remove any duplicates so the Listbox only
shows one of each value in the list. Also, no blank rows. Below is code that
I have used for one column, but I am not familiar with creating two columns
and then removing any duplicate values. Any help would be greatly
appreciated. Thank You,

Dim myRng As Range
Dim myCell As Range


With ActiveSheet
Set myRng = .Range("O1", .Cells(.Rows.Count, "O").End(xlUp))
End With

For Each myCell In myRng.Cells
If myCell.Value = 0 Or myCell.Value = "SPC" Then
Else
Me.ListBox1.AddItem myCell.Value
End If
Next myCell


--

Dave Peterson
  #3   Report Post  
Posted to microsoft.public.excel.programming
tjh tjh is offline
external usenet poster
 
Posts: 96
Default ListBox

Thank You

"Dave Peterson" wrote:

John Walkenbach has a sample of how to fill a listbox with unique items at:
http://j-walk.com/ss/excel/tips/tip47.htm

I figured I could just join the values from the two columns, add that string to
the process to eliminate duplicates and then separate it into two when I was
done.

But I was kind of confused at your requirements, though. Can column "0" be
blank, but I not? Can I be blank, but not "O".

This portion:
If Cell.Value = 0 _
or ucase(cell.value) = "SPC" _
Or Cell.Value = "" _
Or myStr = Chr(1) Then

Can be modified to flunk out the stuff you don't want.


Option Explicit
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub UserForm_Initialize()

Dim AllCells As Range, Cell As Range
Dim NoDupes As New Collection
Dim i As Long, j As Long
Dim Swap1, Swap2, Item
Dim myStr As String
Dim mySplit As Variant

Me.ListBox1.ColumnCount = 2

With ActiveSheet
Set AllCells = .Range("O1", .Cells(.Rows.Count, "O").End(xlUp))
End With

On Error Resume Next
For Each Cell In AllCells
myStr = Cell.Value & Chr(1) & Cell.Offset(0, -6).Value
If Cell.Value = 0 _
or ucase(cell.value) = "SPC" _
Or Cell.Value = "" _
Or myStr = Chr(1) Then
'do nothing
Else
NoDupes.Add myStr, CStr(myStr)
End If

Next Cell
On Error GoTo 0

' Sort the collection (optional)
For i = 1 To NoDupes.Count - 1
For j = i + 1 To NoDupes.Count
If NoDupes(i) NoDupes(j) Then
Swap1 = NoDupes(i)
Swap2 = NoDupes(j)
NoDupes.Add Swap1, befo=j
NoDupes.Add Swap2, befo=i
NoDupes.Remove i + 1
NoDupes.Remove j + 1
End If
Next j
Next i

For Each Item In NoDupes
mySplit = Split97(CStr(Item), Chr(1))
'or if xl2k and higher
'mySplit = Split(CStr(Item), Chr(1))
With Me.ListBox1
.AddItem mySplit(LBound(mySplit))
.List(.ListCount - 1, 1) = mySplit(UBound(mySplit))
End With
Next Item

End Sub
Function Split97(sStr As String, sdelim As String) As Variant
'from Tom Ogilvy
Split97 = Evaluate("{""" & _
Application.Substitute(sStr, sdelim, """,""") & """}")
End Function


=====
Split was added in xl2k. If you're using xl97, use Tom's split97. If you and
your users are all at xl2k or higher, you can delete that function completely
and use the built in Split.

tjh wrote:

Hello,

I am trying to create a 2 column listbox using data from column "O" and
column "I" in a spreadsheet. Additionally, there are duplicate values in
these columns. I would like to remove any duplicates so the Listbox only
shows one of each value in the list. Also, no blank rows. Below is code that
I have used for one column, but I am not familiar with creating two columns
and then removing any duplicate values. Any help would be greatly
appreciated. Thank You,

Dim myRng As Range
Dim myCell As Range


With ActiveSheet
Set myRng = .Range("O1", .Cells(.Rows.Count, "O").End(xlUp))
End With

For Each myCell In myRng.Cells
If myCell.Value = 0 Or myCell.Value = "SPC" Then
Else
Me.ListBox1.AddItem myCell.Value
End If
Next myCell


--

Dave Peterson

  #4   Report Post  
Posted to microsoft.public.excel.programming
tjh tjh is offline
external usenet poster
 
Posts: 96
Default ListBox

Thank you for your response. I did make the duplicate requirment a little
confusing. I am looking for no duplicates in column "O". Any suggestions?

Thanks,




"Dave Peterson" wrote:

John Walkenbach has a sample of how to fill a listbox with unique items at:
http://j-walk.com/ss/excel/tips/tip47.htm

I figured I could just join the values from the two columns, add that string to
the process to eliminate duplicates and then separate it into two when I was
done.

But I was kind of confused at your requirements, though. Can column "0" be
blank, but I not? Can I be blank, but not "O".

This portion:
If Cell.Value = 0 _
or ucase(cell.value) = "SPC" _
Or Cell.Value = "" _
Or myStr = Chr(1) Then

Can be modified to flunk out the stuff you don't want.


Option Explicit
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub UserForm_Initialize()

Dim AllCells As Range, Cell As Range
Dim NoDupes As New Collection
Dim i As Long, j As Long
Dim Swap1, Swap2, Item
Dim myStr As String
Dim mySplit As Variant

Me.ListBox1.ColumnCount = 2

With ActiveSheet
Set AllCells = .Range("O1", .Cells(.Rows.Count, "O").End(xlUp))
End With

On Error Resume Next
For Each Cell In AllCells
myStr = Cell.Value & Chr(1) & Cell.Offset(0, -6).Value
If Cell.Value = 0 _
or ucase(cell.value) = "SPC" _
Or Cell.Value = "" _
Or myStr = Chr(1) Then
'do nothing
Else
NoDupes.Add myStr, CStr(myStr)
End If

Next Cell
On Error GoTo 0

' Sort the collection (optional)
For i = 1 To NoDupes.Count - 1
For j = i + 1 To NoDupes.Count
If NoDupes(i) NoDupes(j) Then
Swap1 = NoDupes(i)
Swap2 = NoDupes(j)
NoDupes.Add Swap1, befo=j
NoDupes.Add Swap2, befo=i
NoDupes.Remove i + 1
NoDupes.Remove j + 1
End If
Next j
Next i

For Each Item In NoDupes
mySplit = Split97(CStr(Item), Chr(1))
'or if xl2k and higher
'mySplit = Split(CStr(Item), Chr(1))
With Me.ListBox1
.AddItem mySplit(LBound(mySplit))
.List(.ListCount - 1, 1) = mySplit(UBound(mySplit))
End With
Next Item

End Sub
Function Split97(sStr As String, sdelim As String) As Variant
'from Tom Ogilvy
Split97 = Evaluate("{""" & _
Application.Substitute(sStr, sdelim, """,""") & """}")
End Function


=====
Split was added in xl2k. If you're using xl97, use Tom's split97. If you and
your users are all at xl2k or higher, you can delete that function completely
and use the built in Split.

tjh wrote:

Hello,

I am trying to create a 2 column listbox using data from column "O" and
column "I" in a spreadsheet. Additionally, there are duplicate values in
these columns. I would like to remove any duplicates so the Listbox only
shows one of each value in the list. Also, no blank rows. Below is code that
I have used for one column, but I am not familiar with creating two columns
and then removing any duplicate values. Any help would be greatly
appreciated. Thank You,

Dim myRng As Range
Dim myCell As Range


With ActiveSheet
Set myRng = .Range("O1", .Cells(.Rows.Count, "O").End(xlUp))
End With

For Each myCell In myRng.Cells
If myCell.Value = 0 Or myCell.Value = "SPC" Then
Else
Me.ListBox1.AddItem myCell.Value
End If
Next myCell


--

Dave Peterson

  #5   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 35,218
Default ListBox

I think I'd just use data|Filter|advanced filter|unique records only and then
cycle through those cells.

But this means there has to be a header in the column O. (Is that what SPC
represented?)

If you don't have a header row, either add one manually insert a new row at the
top, add your header and delete that row when you're done building the listbox
list.

Option Explicit
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub UserForm_Initialize()

Dim myRng As Range 'original range
Dim myFRng As Range 'filtered range
Dim myCell As Range

Me.ListBox1.ColumnCount = 2

With ActiveSheet
Set myRng = .Range("O1", .Cells(.Rows.Count, "O").End(xlUp))
With myRng
.AdvancedFilter Action:=xlFilterInPlace, Unique:=True
Set myFRng = Nothing
On Error Resume Next
Set myFRng = .Resize(.Rows.Count - 1, 1) _
.Offset(1, 0).Cells.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If myFRng Is Nothing Then
MsgBox "no data!"
Exit Sub
End If
End With

.ShowAllData 'remove the advanced filter.

For Each myCell In myFRng.Cells
If myCell.Value = 0 _
Or UCase(myCell.Value) = "SPC" _
Or myCell.Value = "" Then
'do nothing
Else
With Me.ListBox1
.AddItem myCell.Value
.List(.ListCount - 1, 1) = myCell.Offset(0, -6).Value
End With
End If
Next myCell
End With

End Sub

tjh wrote:

Thank you for your response. I did make the duplicate requirment a little
confusing. I am looking for no duplicates in column "O". Any suggestions?

Thanks,

"Dave Peterson" wrote:

John Walkenbach has a sample of how to fill a listbox with unique items at:
http://j-walk.com/ss/excel/tips/tip47.htm

I figured I could just join the values from the two columns, add that string to
the process to eliminate duplicates and then separate it into two when I was
done.

But I was kind of confused at your requirements, though. Can column "0" be
blank, but I not? Can I be blank, but not "O".

This portion:
If Cell.Value = 0 _
or ucase(cell.value) = "SPC" _
Or Cell.Value = "" _
Or myStr = Chr(1) Then

Can be modified to flunk out the stuff you don't want.


Option Explicit
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub UserForm_Initialize()

Dim AllCells As Range, Cell As Range
Dim NoDupes As New Collection
Dim i As Long, j As Long
Dim Swap1, Swap2, Item
Dim myStr As String
Dim mySplit As Variant

Me.ListBox1.ColumnCount = 2

With ActiveSheet
Set AllCells = .Range("O1", .Cells(.Rows.Count, "O").End(xlUp))
End With

On Error Resume Next
For Each Cell In AllCells
myStr = Cell.Value & Chr(1) & Cell.Offset(0, -6).Value
If Cell.Value = 0 _
or ucase(cell.value) = "SPC" _
Or Cell.Value = "" _
Or myStr = Chr(1) Then
'do nothing
Else
NoDupes.Add myStr, CStr(myStr)
End If

Next Cell
On Error GoTo 0

' Sort the collection (optional)
For i = 1 To NoDupes.Count - 1
For j = i + 1 To NoDupes.Count
If NoDupes(i) NoDupes(j) Then
Swap1 = NoDupes(i)
Swap2 = NoDupes(j)
NoDupes.Add Swap1, befo=j
NoDupes.Add Swap2, befo=i
NoDupes.Remove i + 1
NoDupes.Remove j + 1
End If
Next j
Next i

For Each Item In NoDupes
mySplit = Split97(CStr(Item), Chr(1))
'or if xl2k and higher
'mySplit = Split(CStr(Item), Chr(1))
With Me.ListBox1
.AddItem mySplit(LBound(mySplit))
.List(.ListCount - 1, 1) = mySplit(UBound(mySplit))
End With
Next Item

End Sub
Function Split97(sStr As String, sdelim As String) As Variant
'from Tom Ogilvy
Split97 = Evaluate("{""" & _
Application.Substitute(sStr, sdelim, """,""") & """}")
End Function


=====
Split was added in xl2k. If you're using xl97, use Tom's split97. If you and
your users are all at xl2k or higher, you can delete that function completely
and use the built in Split.

tjh wrote:

Hello,

I am trying to create a 2 column listbox using data from column "O" and
column "I" in a spreadsheet. Additionally, there are duplicate values in
these columns. I would like to remove any duplicates so the Listbox only
shows one of each value in the list. Also, no blank rows. Below is code that
I have used for one column, but I am not familiar with creating two columns
and then removing any duplicate values. Any help would be greatly
appreciated. Thank You,

Dim myRng As Range
Dim myCell As Range


With ActiveSheet
Set myRng = .Range("O1", .Cells(.Rows.Count, "O").End(xlUp))
End With

For Each myCell In myRng.Cells
If myCell.Value = 0 Or myCell.Value = "SPC" Then
Else
Me.ListBox1.AddItem myCell.Value
End If
Next myCell


--

Dave Peterson


--

Dave Peterson


  #6   Report Post  
Posted to microsoft.public.excel.programming
tjh tjh is offline
external usenet poster
 
Posts: 96
Default ListBox

Thanks Dave,

Rather than using the filter option, I set the second column to appear
first. I found this would work fine for this purpose. However, I also
realized that I need a third column. You will notice that I altered the
NoDups.Add line to accomodate this list, but the columns are not spacing
correctly. Any suggestions? Thanks


Me.ListBox1.ColumnCount = 3

With ActiveSheet
Set AllCells = .Range("O1", .Cells(.Rows.Count, "O").End(xlUp))
End With

On Error Resume Next
For Each Cell In AllCells
myStr = Cell.Value If Cell.Value = 0 _
Or UCase(Cell.Value) = "SPC" _
Or UCase(Cell.Offset(0, -7).Value) = "TBD" _
Or Cell.Value = "" _
Or myStr = Chr(1) Then
'do nothing
Else
NoDupes.Add Cell.Offset(0, -14).Value & " " & Cell.Offset(0, -7).Value &
Chr(1) & myStr, CStr(myStr)
End If



"Dave Peterson" wrote:

I think I'd just use data|Filter|advanced filter|unique records only and then
cycle through those cells.

But this means there has to be a header in the column O. (Is that what SPC
represented?)

If you don't have a header row, either add one manually insert a new row at the
top, add your header and delete that row when you're done building the listbox
list.

Option Explicit
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub UserForm_Initialize()

Dim myRng As Range 'original range
Dim myFRng As Range 'filtered range
Dim myCell As Range

Me.ListBox1.ColumnCount = 2

With ActiveSheet
Set myRng = .Range("O1", .Cells(.Rows.Count, "O").End(xlUp))
With myRng
.AdvancedFilter Action:=xlFilterInPlace, Unique:=True
Set myFRng = Nothing
On Error Resume Next
Set myFRng = .Resize(.Rows.Count - 1, 1) _
.Offset(1, 0).Cells.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If myFRng Is Nothing Then
MsgBox "no data!"
Exit Sub
End If
End With

.ShowAllData 'remove the advanced filter.

For Each myCell In myFRng.Cells
If myCell.Value = 0 _
Or UCase(myCell.Value) = "SPC" _
Or myCell.Value = "" Then
'do nothing
Else
With Me.ListBox1
.AddItem myCell.Value
.List(.ListCount - 1, 1) = myCell.Offset(0, -6).Value
End With
End If
Next myCell
End With

End Sub

tjh wrote:

Thank you for your response. I did make the duplicate requirment a little
confusing. I am looking for no duplicates in column "O". Any suggestions?

Thanks,

"Dave Peterson" wrote:

John Walkenbach has a sample of how to fill a listbox with unique items at:
http://j-walk.com/ss/excel/tips/tip47.htm

I figured I could just join the values from the two columns, add that string to
the process to eliminate duplicates and then separate it into two when I was
done.

But I was kind of confused at your requirements, though. Can column "0" be
blank, but I not? Can I be blank, but not "O".

This portion:
If Cell.Value = 0 _
or ucase(cell.value) = "SPC" _
Or Cell.Value = "" _
Or myStr = Chr(1) Then

Can be modified to flunk out the stuff you don't want.


Option Explicit
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub UserForm_Initialize()

Dim AllCells As Range, Cell As Range
Dim NoDupes As New Collection
Dim i As Long, j As Long
Dim Swap1, Swap2, Item
Dim myStr As String
Dim mySplit As Variant

Me.ListBox1.ColumnCount = 2

With ActiveSheet
Set AllCells = .Range("O1", .Cells(.Rows.Count, "O").End(xlUp))
End With

On Error Resume Next
For Each Cell In AllCells
myStr = Cell.Value & Chr(1) & Cell.Offset(0, -6).Value
If Cell.Value = 0 _
or ucase(cell.value) = "SPC" _
Or Cell.Value = "" _
Or myStr = Chr(1) Then
'do nothing
Else
NoDupes.Add myStr, CStr(myStr)
End If

Next Cell
On Error GoTo 0

' Sort the collection (optional)
For i = 1 To NoDupes.Count - 1
For j = i + 1 To NoDupes.Count
If NoDupes(i) NoDupes(j) Then
Swap1 = NoDupes(i)
Swap2 = NoDupes(j)
NoDupes.Add Swap1, befo=j
NoDupes.Add Swap2, befo=i
NoDupes.Remove i + 1
NoDupes.Remove j + 1
End If
Next j
Next i

For Each Item In NoDupes
mySplit = Split97(CStr(Item), Chr(1))
'or if xl2k and higher
'mySplit = Split(CStr(Item), Chr(1))
With Me.ListBox1
.AddItem mySplit(LBound(mySplit))
.List(.ListCount - 1, 1) = mySplit(UBound(mySplit))
End With
Next Item

End Sub
Function Split97(sStr As String, sdelim As String) As Variant
'from Tom Ogilvy
Split97 = Evaluate("{""" & _
Application.Substitute(sStr, sdelim, """,""") & """}")
End Function


=====
Split was added in xl2k. If you're using xl97, use Tom's split97. If you and
your users are all at xl2k or higher, you can delete that function completely
and use the built in Split.

tjh wrote:

Hello,

I am trying to create a 2 column listbox using data from column "O" and
column "I" in a spreadsheet. Additionally, there are duplicate values in
these columns. I would like to remove any duplicates so the Listbox only
shows one of each value in the list. Also, no blank rows. Below is code that
I have used for one column, but I am not familiar with creating two columns
and then removing any duplicate values. Any help would be greatly
appreciated. Thank You,

Dim myRng As Range
Dim myCell As Range


With ActiveSheet
Set myRng = .Range("O1", .Cells(.Rows.Count, "O").End(xlUp))
End With

For Each myCell In myRng.Cells
If myCell.Value = 0 Or myCell.Value = "SPC" Then
Else
Me.ListBox1.AddItem myCell.Value
End If
Next myCell

--

Dave Peterson


--

Dave Peterson

  #7   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 35,218
Default ListBox

If it's just a display problem (not the correct width), you can change the
..columnwidths (either manually in the VBE--click on the listbox, hit F4 to see
the properties and enter 20;30;50 in the .columnwidths property--adjust as
required.)

or in code:

Me.ListBox1.ColumnCount = 3
Me.listbox1.columnwidths = "20;30;50"

(For me, it's usually a matter of trial and error to get those widths correct.)

Look at help for more info.

And this section would change, too:

With Me.ListBox1
.AddItem mySplit(LBound(mySplit))
.list(.listcount - 1, 1) = mysplit(lbound(mysplit)+1)
.List(.ListCount - 1, 2) = mySplit(UBound(mySplit))
End With


tjh wrote:

Thanks Dave,

Rather than using the filter option, I set the second column to appear
first. I found this would work fine for this purpose. However, I also
realized that I need a third column. You will notice that I altered the
NoDups.Add line to accomodate this list, but the columns are not spacing
correctly. Any suggestions? Thanks

Me.ListBox1.ColumnCount = 3

With ActiveSheet
Set AllCells = .Range("O1", .Cells(.Rows.Count, "O").End(xlUp))
End With

On Error Resume Next
For Each Cell In AllCells
myStr = Cell.Value If Cell.Value = 0 _
Or UCase(Cell.Value) = "SPC" _
Or UCase(Cell.Offset(0, -7).Value) = "TBD" _
Or Cell.Value = "" _
Or myStr = Chr(1) Then
'do nothing
Else
NoDupes.Add Cell.Offset(0, -14).Value & " " & Cell.Offset(0, -7).Value &
Chr(1) & myStr, CStr(myStr)
End If

"Dave Peterson" wrote:

I think I'd just use data|Filter|advanced filter|unique records only and then
cycle through those cells.

But this means there has to be a header in the column O. (Is that what SPC
represented?)

If you don't have a header row, either add one manually insert a new row at the
top, add your header and delete that row when you're done building the listbox
list.

Option Explicit
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub UserForm_Initialize()

Dim myRng As Range 'original range
Dim myFRng As Range 'filtered range
Dim myCell As Range

Me.ListBox1.ColumnCount = 2

With ActiveSheet
Set myRng = .Range("O1", .Cells(.Rows.Count, "O").End(xlUp))
With myRng
.AdvancedFilter Action:=xlFilterInPlace, Unique:=True
Set myFRng = Nothing
On Error Resume Next
Set myFRng = .Resize(.Rows.Count - 1, 1) _
.Offset(1, 0).Cells.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If myFRng Is Nothing Then
MsgBox "no data!"
Exit Sub
End If
End With

.ShowAllData 'remove the advanced filter.

For Each myCell In myFRng.Cells
If myCell.Value = 0 _
Or UCase(myCell.Value) = "SPC" _
Or myCell.Value = "" Then
'do nothing
Else
With Me.ListBox1
.AddItem myCell.Value
.List(.ListCount - 1, 1) = myCell.Offset(0, -6).Value
End With
End If
Next myCell
End With

End Sub

tjh wrote:

Thank you for your response. I did make the duplicate requirment a little
confusing. I am looking for no duplicates in column "O". Any suggestions?

Thanks,

"Dave Peterson" wrote:

John Walkenbach has a sample of how to fill a listbox with unique items at:
http://j-walk.com/ss/excel/tips/tip47.htm

I figured I could just join the values from the two columns, add that string to
the process to eliminate duplicates and then separate it into two when I was
done.

But I was kind of confused at your requirements, though. Can column "0" be
blank, but I not? Can I be blank, but not "O".

This portion:
If Cell.Value = 0 _
or ucase(cell.value) = "SPC" _
Or Cell.Value = "" _
Or myStr = Chr(1) Then

Can be modified to flunk out the stuff you don't want.


Option Explicit
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub UserForm_Initialize()

Dim AllCells As Range, Cell As Range
Dim NoDupes As New Collection
Dim i As Long, j As Long
Dim Swap1, Swap2, Item
Dim myStr As String
Dim mySplit As Variant

Me.ListBox1.ColumnCount = 2

With ActiveSheet
Set AllCells = .Range("O1", .Cells(.Rows.Count, "O").End(xlUp))
End With

On Error Resume Next
For Each Cell In AllCells
myStr = Cell.Value & Chr(1) & Cell.Offset(0, -6).Value
If Cell.Value = 0 _
or ucase(cell.value) = "SPC" _
Or Cell.Value = "" _
Or myStr = Chr(1) Then
'do nothing
Else
NoDupes.Add myStr, CStr(myStr)
End If

Next Cell
On Error GoTo 0

' Sort the collection (optional)
For i = 1 To NoDupes.Count - 1
For j = i + 1 To NoDupes.Count
If NoDupes(i) NoDupes(j) Then
Swap1 = NoDupes(i)
Swap2 = NoDupes(j)
NoDupes.Add Swap1, befo=j
NoDupes.Add Swap2, befo=i
NoDupes.Remove i + 1
NoDupes.Remove j + 1
End If
Next j
Next i

For Each Item In NoDupes
mySplit = Split97(CStr(Item), Chr(1))
'or if xl2k and higher
'mySplit = Split(CStr(Item), Chr(1))
With Me.ListBox1
.AddItem mySplit(LBound(mySplit))
.List(.ListCount - 1, 1) = mySplit(UBound(mySplit))
End With
Next Item

End Sub
Function Split97(sStr As String, sdelim As String) As Variant
'from Tom Ogilvy
Split97 = Evaluate("{""" & _
Application.Substitute(sStr, sdelim, """,""") & """}")
End Function


=====
Split was added in xl2k. If you're using xl97, use Tom's split97. If you and
your users are all at xl2k or higher, you can delete that function completely
and use the built in Split.

tjh wrote:

Hello,

I am trying to create a 2 column listbox using data from column "O" and
column "I" in a spreadsheet. Additionally, there are duplicate values in
these columns. I would like to remove any duplicates so the Listbox only
shows one of each value in the list. Also, no blank rows. Below is code that
I have used for one column, but I am not familiar with creating two columns
and then removing any duplicate values. Any help would be greatly
appreciated. Thank You,

Dim myRng As Range
Dim myCell As Range


With ActiveSheet
Set myRng = .Range("O1", .Cells(.Rows.Count, "O").End(xlUp))
End With

For Each myCell In myRng.Cells
If myCell.Value = 0 Or myCell.Value = "SPC" Then
Else
Me.ListBox1.AddItem myCell.Value
End If
Next myCell

--

Dave Peterson


--

Dave Peterson


--

Dave Peterson
Reply
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules

Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
VBA: Creating listbox similar to the one in Pivot table (Listbox+Checkbox) modjoe23 Excel Programming 3 August 18th 05 02:35 PM
Modification of listbox to listbox code Sam S via OfficeKB.com Excel Programming 0 July 28th 05 12:02 PM
Modification of listbox to listbox code R.VENKATARAMAN Excel Programming 0 July 28th 05 05:36 AM
listbox.value not equal to listbox.list(listbox.listindex,0) ARB Excel Programming 0 October 22nd 03 12:46 AM
Is refreshing listbox rowsource in listbox click event possible? Jeremy Gollehon[_2_] Excel Programming 4 September 25th 03 06:45 PM


All times are GMT +1. The time now is 06:07 PM.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Copyright ©2004-2025 ExcelBanter.
The comments are property of their posters.
 

About Us

"It's about Microsoft Excel"