VB6を使用してます。
リストビューですが、特定の列だけソートできません。
構文は同じものをコピペしたので間違いは無いように思います。
列を入れ替えてもその列だけソートできません。
どのようなことが原因として考えられますか?
> 構文は同じものをコピペしたので間違いは無いように思います。
他の人が検証できるよう、実際のコードとデータを提示して頂けないでしょうか。
記述したのがどのようなコードで。どんなデータをソートしようとして。
それがどのような並び順に置き変わる事を予想しているのかを。
> どのようなことが原因として考えられますか?
詳細情報が無いので何とも言い難いですが、
(1) ソートはされているが、それが予想していた並び順とは異なるため、
結果的にソートされていないように見えてしまった。
(2) ランタイムの特定バージョンの不具合により、ソートできないでいる。
(3) コード自体に問題があって、ソートできていない。
とか。
構文を提示します。
この中でソートできないのは5,6列目の担当者CD及び担当者名です。
他はソートできます。
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
On Error GoTo ErrorHandler
Select Case ColumnHeader.Text
Case "伝票番号"
Me.ListView1.Sorted = True
Me.ListView1.SortKey = 0
If Me.ListView1.SortOrder = lvwAscending Then
Me.ListView1.SortOrder = lvwDescending
Else
Me.ListView1.SortOrder = lvwAscending
End If
Case "伝票日付"
Me.ListView1.Sorted = True
Me.ListView1.SortKey = 1
If Me.ListView1.SortOrder = lvwAscending Then
Me.ListView1.SortOrder = lvwDescending
Else
Me.ListView1.SortOrder = lvwAscending
End If
Case "出荷予定日"
Me.ListView1.Sorted = True
Me.ListView1.SortKey = 2
If Me.ListView1.SortOrder = lvwAscending Then
Me.ListView1.SortOrder = lvwDescending
Else
Me.ListView1.SortOrder = lvwAscending
End If
Case "得意先CD"
Me.ListView1.Sorted = True
Me.ListView1.SortKey = 3
If Me.ListView1.SortOrder = lvwAscending Then
Me.ListView1.SortOrder = lvwDescending
Else
Me.ListView1.SortOrder = lvwAscending
End If
Case "得意先略称"
Me.ListView1.Sorted = True
Me.ListView1.SortKey = 4
If Me.ListView1.SortOrder = lvwAscending Then
Me.ListView1.SortOrder = lvwDescending
Else
Me.ListView1.SortOrder = lvwAscending
End If
Case "担当者CD"
Me.ListView1.Sorted = True
Me.ListView1.SortKey = 5
If Me.ListView1.SortOrder = lvwAscending Then
Me.ListView1.SortOrder = lvwDescending
Else
Me.ListView1.SortOrder = lvwAscending
End If
Case "担当者名"
Me.ListView1.Sorted = True
Me.ListView1.SortKey = 6
If Me.ListView1.SortOrder = lvwAscending Then
Me.ListView1.SortOrder = lvwDescending
Else
Me.ListView1.SortOrder = lvwAscending
End If
Case "部門CD"
Me.ListView1.Sorted = True
Me.ListView1.SortKey = 7
If Me.ListView1.SortOrder = lvwAscending Then
Me.ListView1.SortOrder = lvwDescending
Else
Me.ListView1.SortOrder = lvwAscending
End If
Case "部門名"
Me.ListView1.Sorted = True
Me.ListView1.SortKey = 8
If Me.ListView1.SortOrder = lvwAscending Then
Me.ListView1.SortOrder = lvwDescending
Else
Me.ListView1.SortOrder = lvwAscending
End If
End Select
Exit Sub
ErrorHandler:
MsgBox Err.Number & "/" & Err.Description, vbOKOnly + vbCritical + vbApplicationModal, App.Title
End Sub
"担当者CD" , "担当者名"が ColumnHeader.Text と違っているのでしょう。
Select Case で分ける理由はなさそうなので
Private Sub ListView1_ColumnClick( _
ByVal ColumnHeader As MSComctlLib.ColumnHeader)
With ListView1
.Sorted = True
.SortKey = ColumnHeader.Index - 1
If .SortOrder = lvwDescending Then
.SortOrder = lvwAscending
Else
.SortOrder = lvwDescending
End If
End With
End Sub
でいいと思いますが・・・
おお!
うまくいきました。
ありがとうございます。
しかし、なぜ前の構文はダメなんでしょう???
この部分で時間をかなり消費したので気になってしょうがありません。
> しかし、なぜ前の構文はダメなんでしょう???
Koz さんが指摘された
>> "担当者CD" , "担当者名"が ColumnHeader.Text と違っているのでしょう。
については検証してみましたか?
以前の構文を
>>> Case "担当者CD"
>>> Me.ListView1.Sorted = True
MsgBox CStr(ColumnHeader.Index - 1)
>>> Me.ListView1.SortKey = 5
のように修正して、"担当者CD" を選んだ場合に、
「5」と表示されるかどうかを調べてみてください。
もし、メッセージボックスが表示されなかったり、あるいは
5 以外の値が表示されたのであれば、Select Case 文に
誤りがあったのかも知れません。
おおお、全く仰せのとおりでした。
全然気がつきませんでした。
片方は「者」が抜けてました。
まったくそそっかしい話で穴があったら入りたいです。
お世話になりました。
ツイート | ![]() |