Yes, I looked at the other thread but it didn't help. I've tried the FindItem method, but I couldn't get it to work with Subitems, only with the Item.Text. My objective is have the user type in a letter over any column in the listview (approx. 10 columns), and have it search in that specific item/subitem for a value that starts with that letter, select the item and position to the item.

Here's my code for FindItem. strLVW_DBColumnName is the listview column header name. I've tried this with KeyDown and KeyPress, both without success.
VB Code:
  1. Private Sub lvwComponents_KeyDown(KeyCode As Integer, Shift As Integer)
  2.  
  3.    Dim itmX As ListItem, x As Integer, y As Integer, strSearchString As String
  4.  
  5.    ' Exit if nothing to search.
  6.    If strLVW_DBColumnName = vbNullString _
  7.    Or lvwComponents.ListItems.Count = 0 Then Exit Sub
  8.  
  9.    ' If mouse over a column, search for the letter pressed.
  10.    With lvwComponents
  11.       If strLVW_DBColumnName = "COMPONENT_ID" Then
  12.          Set itmX = .FindItem(Chr$(KeyAscii), lvwText, , lvwPartial)
  13.       Else
  14.          Set itmX = .FindItem(Chr$(KeyAscii), lvwSubItem, _
  15.             .ColumnHeaders(strLVW_DBColumnName).Index)
  16.       End If
  17.       If Not itmX Is Nothing Then
  18.          itmX.Selected = True
  19.          itmX.EnsureVisible
  20.       End If
  21.    End With
  22. End Sub
Since FindItem didn't work, I coded a loop....
VB Code:
  1. Private Sub lvwComponents_KeyDown(KeyCode As Integer, Shift As Integer)
  2.  
  3.    Dim itmX As ListItem, x As Integer, y As Integer, strSearchString As String
  4.  
  5.    ' Exit if nothing to search.
  6.    If strLVW_DBColumnName = vbNullString _
  7.    Or lvwComponents.ListItems.Count = 0 Then Exit Sub
  8.  
  9.    ' If mouse over a column, search for the letter pressed.
  10.    With lvwComponents
  11.       For x = 1 To .ListItems.Count
  12.          ' Use text or subitem as search string depending on column that mouse is over.
  13.          If strLVW_DBColumnName = "COMPONENT_ID" Then
  14.             strSearchString = Left$(.ListItems(x).Text, 1)
  15.          Else
  16.             y = .ColumnHeaders(strLVW_DBColumnName).Index - 1
  17.             strSearchString = Left$(.ListItems(x).SubItems(y), 1)
  18.          End If
  19.          ' Search text/subitem.
  20.          If UCase(strSearchString) = UCase(Chr$(KeyAscii)) Then
  21.             .ListItems(x).Selected = True
  22.             .ListItems(x).EnsureVisible
  23.             Exit Sub
  24.          End If
  25.       Next x
  26.    End With  
  27. End Sub

The loop above seems to work fine on alphanumeric data. However, one of my subitems (CAS_NUMBER column) is numeric and with that column it seems to find the correct match in the subitem column and then jumps to the first match in the ListItems(x).Text directly following the match that it should have found. Note: COMPONENT_ID column (ListItems(x).Text) is numeric. This is why I'm assuming that the tricky automatic search feature is overriding my search loop when I'm searching on numeric data. My example again.

Code:
Component ID          CAS Number
29                    100-06-1
244                   112-30-1
250                   112-53-8
446                   120-14-9
188                   121-33-5
232                   121-33-5
If the user types 1 over the CAS Number column it positions to Component ID 188. I've tested this with various numbers typed in and it consistently behaves this way. Typing letters in for others columns doesn't have this problem, presumably since the auto search cannot find an alphabetic value in the Component ID column.