ListViewコントロールでデータが選択されると、ItemClickイベントが発生します。このとき、引数Itemには選択されたListItemオブジェクトが格納されます。
Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
MsgBox Item & vbCrLf & Item.SubItems(1) & vbCrLf & Item.SubItems(2)
End Sub

また、現在選択されているデータはSelectedItemプロパティで取得できます。
データを削除するには、ListItemsコレクションのRemoveメソッドを実行します。引数は、削除したいデータのIndex値です。ここでは、もう1つコマンドボタンを追加して、そちらに削除のコードを記述しました。
Private Sub CommandButton2_Click()
With ListView1
If MsgBox("現在選択されている " & .SelectedItem & " を削除しますか?", 36) = vbYes Then
.ListItems.Remove .SelectedItem.Index
End If
End With
End Sub

↓

実行中にデータを変更するには、StartLabelEditメソッドを実行します。考え方はTreeViewコントロールと同じですから、詳しい解説は「TreeViewコントロール:Excelでの使用例」をご覧ください。
TreeViewコントロールと同様に、[F2]キーが押されたら、選択しているデータを編集するには、次のようにします。
Private Sub ListView1_KeyUp(KeyCode As Integer, ByVal Shift As Integer)
If KeyCode = 113 Then ListView1.StartLabelEdit
End Sub

Windows標準のインターフェイスでは、ListViewコントロールを表形式で使うとき、列見出しをクリックするとデータがソートされます。ListViewコントロールに、データをソートする機能はありますが、クリックされた列で自動的にはソートできません。
まず、列をソートするには次のようにします。
列見出しがクリックされるとColumnClickイベントが発生します。このとき、引数ColumnHeaderには、クリックされたColumnHeaderオブジェクトが格納されます。そこで、クリックされた列(ColumnHeaderオブジェクト)のIndex値-1をSortKeyプロパティに指定します。
次に、SortOrderプロパティに昇順(lvwAscending)か降順(lvwDescending)を指定して、SortedプロパティにTrueを指定します。
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
With ListView1
.SortKey = ColumnHeader.Index - 1
.SortOrder = .SortOrder Xor lvwDescending
.Sorted = True
End With
End Sub
クリックされた列は引数ColumnHeaderに格納されます。注意しなければいけないのは、クリックされたColumnHeaderオブジェクトのIndex値と、SortKeyプロパティに指定する列の数え方です。ColumnHeaderオブジェクトのIndex値は、左端を1として数えますが、SortKeyプロパティに指定する列は左端を0から数えます。そこで、マイナス1(-1)しているわけです。
SortOrderプロパティに定数lvwAscendingを指定すると昇順でソートされ、定数lvwDescendingを指定すると降順でソートされます。定数lvwAscendingの実体は0で、定数lvwDescendingの実体は1です。
どちらかの定数を指定して、昇順または降順でソートするだけでもよいのですが、できれば「現在昇順だったら降順に、降順だったら昇順に」とトグル的に動作させたいです。だって、多くのアプリはそうなってるから。
SortOrderプロパティに、TrueまたはFlaseを指定するのでしたら簡単です。Not演算子を使って、
.SortOrder = Not .SortOrder
とすればOKです。ところが、指定する定数はlvwAscending(0)かlvwDescending(1)。0か1です。ここでは「0だったら1、1だったら0」という処理を行う必要があります。まぁ、Ifとか使って、
If .SortOrder = lvwAscending Then
.SortOrder = lvwDescending
Else
.SortOrder = lvwAscending
End If
みたくやってもいいのですが、なんか冗長で美しくありません。そこで、こんなときは排他的論理和のXor演算子を使います。排他的論理和についての詳細な解説は、ネットで数学系のサイトなどを検索してください。結果だけ言うと、次のように働く演算子です。
| P | Q | P Xor Q |
|---|---|---|
| TRUE | TRUE | FALSE |
| TRUE | FALSE | TRUE |
| FALSE | TRUE | TRUE |
| FALSE | FALSE | FALSE |
0 Xor 1は「1」、1 Xor 1は「0」となります。