リストビューの一部がソートできない

解決


BIGFACE  2009-10-31 02:41:27  No: 102043

VB6を使用してます。

リストビューですが、特定の列だけソートできません。

構文は同じものをコピペしたので間違いは無いように思います。

列を入れ替えてもその列だけソートできません。

どのようなことが原因として考えられますか?


魔界の仮面弁士  2009-10-31 03:29:39  No: 102044

> 構文は同じものをコピペしたので間違いは無いように思います。
他の人が検証できるよう、実際のコードとデータを提示して頂けないでしょうか。

記述したのがどのようなコードで。どんなデータをソートしようとして。
それがどのような並び順に置き変わる事を予想しているのかを。

> どのようなことが原因として考えられますか?
詳細情報が無いので何とも言い難いですが、
  (1) ソートはされているが、それが予想していた並び順とは異なるため、
      結果的にソートされていないように見えてしまった。
  (2) ランタイムの特定バージョンの不具合により、ソートできないでいる。
  (3) コード自体に問題があって、ソートできていない。
とか。


BIGFACE  2009-10-31 18:56:31  No: 102045

構文を提示します。
この中でソートできないのは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


Koz  2009-10-31 19:55:32  No: 102046

"担当者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

でいいと思いますが・・・


BIGFACE  2009-10-31 20:24:37  No: 102047

おお!
うまくいきました。

ありがとうございます。

しかし、なぜ前の構文はダメなんでしょう???

この部分で時間をかなり消費したので気になってしょうがありません。


魔界の仮面弁士  2009-10-31 20:28:15  No: 102048

> しかし、なぜ前の構文はダメなんでしょう???

Koz さんが指摘された
>> "担当者CD" , "担当者名"が ColumnHeader.Text と違っているのでしょう。
については検証してみましたか?

以前の構文を
>>>     Case "担当者CD"
>>>      Me.ListView1.Sorted = True
         MsgBox CStr(ColumnHeader.Index - 1)
>>>      Me.ListView1.SortKey = 5
のように修正して、"担当者CD" を選んだ場合に、
「5」と表示されるかどうかを調べてみてください。

もし、メッセージボックスが表示されなかったり、あるいは
5 以外の値が表示されたのであれば、Select Case 文に
誤りがあったのかも知れません。


BIGFACE  2009-10-31 23:51:08  No: 102049

おおお、全く仰せのとおりでした。

全然気がつきませんでした。

片方は「者」が抜けてました。

まったくそそっかしい話で穴があったら入りたいです。

お世話になりました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加