<続>FlexGridでソートのキーを複数設定できますか?

解決


NJ  2003-10-09 01:26:59  No: 79709

お世話になってます。環境はVB6です。
以前、MSFLEXGridのソートの件で

列1  列2  列3
A1    B1  R
A2    B2  F
A1    B3  F
A1    B4  R
A2    B5  R
A1    B6  F
A1    B7  R
A1    B8  F


A1    B3  F
A1    B6  F
A1    B8  F
A1    B1  R
A1    B4  R
A1    B7  R
A2    B2  F
A2    B5  R

のようにソートするにはどうしたらよいか質問させていただきました。
文字列の場合

Private Sub cmdSort_Click()
    MSHFlexGrid1.Sort = 9
End Sub
Private Sub MSHFlexGrid1_Compare(ByVal Row1 As Long, ByVal Row2 As Long, Cmp As Integer)
    Dim sRow1 As String
    Dim sRow2 As String
    
    With MSHFlexGrid1
        sRow1 = .TextMatrix(Row1, 1) & .TextMatrix(Row1, 3) & .TextMatrix(Row1, 2)
        sRow2 = .TextMatrix(Row2, 1) & .TextMatrix(Row2, 3) & .TextMatrix(Row2, 2)
        
        Cmp = StrComp(sRow1, sRow2)
    End With
End Sub

とすれば良いと、教えていただきました。
今回やろうとしているソートは真ん中の列が数値なので、うまくいかず
作業が止まってしまっております。 
どなたか、ご教授くだされば幸いです。
よろしくお願い致します。m(_ _)m


魔界の仮面弁士  2003-10-09 02:11:19  No: 79710

StrComp一回で済ませたいのであれば、数値比較したい値に対して
Format(文字列, "0000000") などを使って、
   "12" → "0000012"
   "2"  → "0000002"
などとして、先頭にゼロを補って、桁を揃えてやれば良いかと思います。

あるいは、StrComp一回で済ませるのではなく、

  '(1列目を)文字列比較
  Cmp = StrComp(.TextMatrix(Row1, 1), .TextMatrix(Row2, 1))

  If Cmp = 0 Then
    '(4列目を)整数で比較
    Cmp = Sgn(CLng(.TextMatrix(Row1, 4)) - CLng(.TextMatrix(Row2, 4)))
  End If

  If Cmp = 0 Then
    '(2列目を)文字列で比較
    Cmp = StrComp(.TextMatrix(Row1, 2), .TextMatrix(Row2, 2))
  End If

のように区切って処理して行けば、より複雑な並び替えにも対応できるでしょう。
(応用すれば、One, Two, Three, Four, ……みたいな並べ方もできますよね)


NJ  2003-10-09 22:42:50  No: 79711

魔界の仮面弁士さん、ご回答ありがとうございました。
お蔭様で、うまくいきました。
また1つ、勉強になりました。
本当にありがとうございました。また何かありましたら
よろしくお願いします。


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

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






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