お世話になります。
VB6でMSFlexGridを使っています。
キーを複数指定してソートしたいのですが、どうにも上手くいきません。
(ソートしたいのは符号・桁数がバラバラの数値です)
1列目を優先、2列目を二番目のキーにしたいのです。
With MSFlexGrid1
.Col = 2
.Sort = 3
.Col = 1
.Sort = 3
End With
2列目を先にソートして、1列目を後にソートすればできると考えて
上記のような感じでやってみたのですが、2列目のソートが崩れてしまいます。
何か良い方法はないでしょうか?
Sortを 2回に分けて行っている為、崩れます。
1列目、2列目をキーにして1回だけSortすれば解決できます。
範囲の指定は、Col および ColSelプロパティを使います。
以下のコードで試してみてください。
With MSFlexGrid1
.Col = 1
.ColSel = 2
.Sort = flexSortNumericAscending
End With
ちなみに、MSFlexGridでは左から順に第1キー、第2キー、...と
固定で割り振られます。
2列目を第1キーににして、1列目を第2キーにするといったソートは
できないという事ですね。
できました。ありがとうございます。
ところで2列目を第1キー、1列目を第2キーにしたい場合は
諦めるしかないんですか?
> ところで2列目を第1キー、1列目を第2キーにしたい場合は
> 諦めるしかないんですか?
自分の知ってる限りで言えば、MSFlexGridの仕様上、MSFlexGrid
の機能を使ってやる場合はあきらめるしかありません。
どうしてもしたい場合、MSFlexGridに出力している値を変数に代入
し、自力でソートして表示する。
それか、GrapeCityの SPREADコントロールのソート機能を使えば
キーの順番を指定できます。
他にも、もっといい方法があるかもしれません。
> ところで2列目を第1キー、1列目を第2キーにしたい場合は
> 諦めるしかないんですか?
今、思いついたのですが、以下の方法はどうでしょう?
少ないコーディングで実現できそうです。
MSFlexGridを2つフォームに貼り付けておき、ひとつは表示用、
もうひとつはソート用として非表示にしておきます。
ソート用には、左の列から第1キー、第2キーの順番にデータを入
れておきソートさせ、ソートしたデータを表示用のそれぞれの列
に複写する。データ量によっては、複写に時間がかかりそうです
が...。
.Sort = 9 'flexSortCustom
をセットすると、
Private Sub MSFlexGrid1_Compare(...)
イベントで自在にできたように記憶しています。
>uchiさん
すみません。とても出来そうにないです。
>red-fishさん
過去ログに似たのを発見したのでそのまま代用してみたのですが、
うまく出来ませんでした。
http://madia.world.coocan.jp/vb/vb_bbs/200309_03090075.html
↑のものなんですが、どうやら文字として認識しているようで、
符号や桁が違うと狂ってくるんです。
昔作ったサンプルコードがありましたので載せます。
以下は説明重視なコード例。
SQL的に書けば"ORDER BY 列2 DESC, 列1 ASC, 列3 DESC"のソートを行う。
(ここで列1,3は文字列、列2は数値Dataとする)
Private Sub MSFlexGrid1_Compare( _
ByVal Row1 As Long, ByVal Row2 As Long, Cmp As Integer)
Const TYPE_STRING% = 8
Const TYPE_NUMBER% = 0
Const ASC% = 1
Const DESC% = -1
Dim i As Long
Dim OrderBy As Variant
'ソート条件
OrderBy = Array(2, TYPE_NUMBER, DESC, _
1, TYPE_STRING, ASC, _
3, TYPE_STRING, DESC)
With MSFlexGrid1
For i = 0 To UBound(OrderBy) Step 3
If OrderBy(i + 1) = TYPE_STRING Then
Cmp = StrComp(.TextMatrix(Row1, OrderBy(i)), _
.TextMatrix(Row2, OrderBy(i)), vbTextCompare)
Else
Cmp = Sgn(CDbl(.TextMatrix(Row1, OrderBy(i))) - _
CDbl(.TextMatrix(Row2, OrderBy(i))))
End If
If Cmp <> 0 Then
Cmp = Cmp * OrderBy(i + 2)
Exit For
End If
Next
End With
End Sub
サンプルのを組み込んだらできました!
ありがとうございます。
ツイート | ![]() |