MSFlexGridでソートするには?

解決


  2003-11-07 20:52:58  No: 109779

お世話になります。
VB6でMSFlexGridを使っています。
キーを複数指定してソートしたいのですが、どうにも上手くいきません。
(ソートしたいのは符号・桁数がバラバラの数値です)
1列目を優先、2列目を二番目のキーにしたいのです。

With MSFlexGrid1
  .Col = 2
  .Sort = 3
  .Col = 1
  .Sort = 3
End With

2列目を先にソートして、1列目を後にソートすればできると考えて
上記のような感じでやってみたのですが、2列目のソートが崩れてしまいます。
何か良い方法はないでしょうか?


uchi  2003-11-08 00:01:13  No: 109780

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キーにするといったソートは
できないという事ですね。


D  2003-11-08 00:44:25  No: 109781

できました。ありがとうございます。
ところで2列目を第1キー、1列目を第2キーにしたい場合は
諦めるしかないんですか?


uchi  2003-11-08 01:25:36  No: 109782

> ところで2列目を第1キー、1列目を第2キーにしたい場合は
> 諦めるしかないんですか?

自分の知ってる限りで言えば、MSFlexGridの仕様上、MSFlexGrid
の機能を使ってやる場合はあきらめるしかありません。

どうしてもしたい場合、MSFlexGridに出力している値を変数に代入
し、自力でソートして表示する。

それか、GrapeCityの SPREADコントロールのソート機能を使えば
キーの順番を指定できます。

他にも、もっといい方法があるかもしれません。


uchi  2003-11-08 01:39:36  No: 109783

> ところで2列目を第1キー、1列目を第2キーにしたい場合は
> 諦めるしかないんですか?

今、思いついたのですが、以下の方法はどうでしょう?
少ないコーディングで実現できそうです。

MSFlexGridを2つフォームに貼り付けておき、ひとつは表示用、
もうひとつはソート用として非表示にしておきます。
ソート用には、左の列から第1キー、第2キーの順番にデータを入
れておきソートさせ、ソートしたデータを表示用のそれぞれの列
に複写する。データ量によっては、複写に時間がかかりそうです
が...。


red-fish  2003-11-08 06:25:15  No: 109784

.Sort = 9 'flexSortCustom
をセットすると、

Private Sub MSFlexGrid1_Compare(...)

イベントで自在にできたように記憶しています。


D  2003-11-08 11:36:54  No: 109785

>uchiさん
すみません。とても出来そうにないです。

>red-fishさん
過去ログに似たのを発見したのでそのまま代用してみたのですが、
うまく出来ませんでした。
http://madia.world.coocan.jp/vb/vb_bbs/200309_03090075.html
↑のものなんですが、どうやら文字として認識しているようで、
符号や桁が違うと狂ってくるんです。


red-fish  2003-11-08 19:18:05  No: 109786

昔作ったサンプルコードがありましたので載せます。

以下は説明重視なコード例。
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


D  2003-11-09 05:05:31  No: 109787

サンプルのを組み込んだらできました!
ありがとうございます。


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

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






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