お世話になってます。環境は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
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, ……みたいな並べ方もできますよね)
魔界の仮面弁士さん、ご回答ありがとうございました。
お蔭様で、うまくいきました。
また1つ、勉強になりました。
本当にありがとうございました。また何かありましたら
よろしくお願いします。
ツイート | ![]() |