データを並べ替える(4方法)
                                                        玄関へお回り下さい。
データを並べ替える(通常の方法)                  (024)
     Sort プロパティを使用すれば、対象列と並び順を指定するだけで簡単にできます。

下記を参考にフォームにフレームを貼付け、フレームにオプションボタンを配列で貼り付けて下さい。

       

メニューを作成し
Private Sub mnuEditSort_Click()
'ソートのメニュー
  Frame1.Visible = True
  Frame1.Move 1700, 440, 5260, 3390
End Sub


Private Sub Command2_Click()
'キャンセルボタン
  Frame1.Visible = False
End Sub


Private Sub Command1_Click()
'ソート開始のボタン
  Dim lngCountI As Long      'ループ用カウンター
  Dim Retu   As Integer    '並べ替える列
  Dim Narabi  As Integer    '並べ替え方法

  Frame1.Visible = False
  For lngCountI = 0 To 6
    'ソート対象列を取得
    If Option1(lngCountI).Value = True Then
      Retu = lngCountI + 1
      Exit For
    End If
  Next lngCountI
  For lngCountI = 0 To 7
    '並べ替え方法を取得
    If Option2(lngCountI).Value = True Then
      Narabi = lngCountI + 1
      Exit For
    End If
  Next lngCountI
  'ソート対象列
  With MSFlexGrid1
    .Col = Retu     'ソート順を指定してソートの開始
    .Sort = Narabi
    .Row = 1      'ホームポジションへ移動
    .Col = 1
    .TopRow = 1
    .SetFocus
  End With
End Sub


ご覧の通り設定が固定ならたった2行で済みます。


以下のコードは一連のMSFlexGridのサンプルには含まれておりません。
又、一部MSFlHexGridを使用しておりますが、MSFlexGridでも同様に動作いたします。

複数列をキーに並べ替える場合(キー列が連続している場合)    No.365
  最優先されるキーを1列目 次に優先されるキーを2列目 その次に優先されるキーを3列目
に設定した場合。(ソートが必要な場合、できるだけ表を作成時に列の並びを考慮しておく)

  With MSFlexGrid1
    .Visible = False 'MSFlexGridの方はこちらの方の効果が大きい
    .Col = 0
    .ColSel = 2
    .Sort = flexSortGenericAscending
    .Visible =
True
  End With

並べ替えに使用されるキーは、Col および ColSel プロパティによって決定されます。並べ替えは常に左から右方向に向かって実行されます。たとえば、Col =3 および ColSel =1 に設定されている場合、まず列 1 の内容に従って並べ替えが実行され、以後、列 2、列 3 の順に実行されます。(ヘルプより抜粋)

複数列をキーに並べ替える場合その1(キー列が連続していない場合)     No.365
  キーの数だけ列を挿入して、挿入した列にキーの順番にキーの列のデータをコピーし、連続
している場合と同様に並べ替えて、最後に列数を元に戻しています。
尚、データのコピーに Clip プロパティを使って見ましたが下記の方法の方が数段早く処理が
できました。

Private Sub
Command1_Click()
  TimeStart
  Dim i  As Long, RNo As Long
  Dim Key1 As Long, Key2 As Long, Key3 As Long
  Key1 = 2: Key2 = 0: Key3 = 4
  With MSHFlexGrid1
    .Redraw = False
    .Cols = MSHFlexGrid1.Cols + 3
    RNo = .Cols - 1
    For i = 0 To .Rows - 1
      .Row = i
      .TextMatrix(i, RNo - 2) = .TextMatrix(i, Key1)
      .TextMatrix(i, RNo - 1) = .TextMatrix(i, Key2)
      .TextMatrix(i, RNo) = .TextMatrix(i, Key3)
    Next i
    .Col = RNo - 2
    .ColSel = RNo
    .Sort = flexSortGenericAscending
    .Cols = MSHFlexGrid1.Cols - 3
    .Redraw = True
  End With
  TimeEnd
End Sub

複数列をキーに並べ替える場合その2(キー列が連続していない場合)   No.365
  flexSortCustom 9 (カスタム)を指定して Compare イベントを使用して、行を比較する方法

Private Sub
Command1_Click()
   With MSHFlexGrid1
  '   .Visible = False
    .Redraw = False 'MSHFlexGridの方はこちらの方の効果が大きい
    .Sort = 9
    .Redraw = True
   End With
End Sub

Private Sub MSHFlexGrid1_Compare(ByVal Row1 As Long, _
                 ByVal Row2 As Long, Cmp As Integer)
  Dim Dat1 As String, Dat2 As String
  With MSHFlexGrid1
    'キー1とキー2とキー3のデータを1つに
    'データに合せて変更して下さい。
    Dat1 = .TextMatrix(Row1, 2) & Format$(.TextMatrix(Row1, 0), "0000") _
                  & .TextMatrix(Row1, 3)
    Dat2 = .TextMatrix(Row2, 2) & Format$(.TextMatrix(Row2, 0), "0000") _
                  & .TextMatrix(Row2, 3)
    If Dat2 < Dat1 Then
      Cmp = 1   'row1 が row2 の後に表示される場合
    ElseIf Dat2 = Dat1 Then
      Cmp = 0   '両方の行が等しい場合
    Else
      Cmp = -1  'row1 が row2 の前に表示される場合
    End If
  End With
End Sub

今回Compareイベントを利用したソートは初めて試したので、上記使用方法よりもっといい 
使用方法があるかも知れません。
又、データの型やソート方法によっては使い方を工夫して下さい。
試作品のようなものですが、他にもサンプルがあまり見当たらないので載せておきます。

ソート条件等によってはその1より少し遅くなるかも知れません。

テストはMSHFlexGridで行っておりますが、MSFlexGridでも同様で動作します。

尚、ソートやセル参照のような動作はMSFlexGridを使用するより、MSHFlexGridを使用した
方が早く処理ができますし、表示できるデータの数もMSFlexGridのように35万セル
のような制限がありません。


又、ヘルプに記載されている定数等で、一部不備があるようです、詳しくは下記の
魔界の仮面弁士
さんの投稿を参考にして下さい。
タイトル Re^4: フレックスグリッドのCompareイベントについて
投稿日 : 2009/08/13(Thu) 09:02
投稿者 魔界の仮面弁士

テスト結果

AMD Athlon(tm)Processor 946 MHz 240 MB RAM WindowsXP(Home) で
8列5000行(276KB)のデータのソートだけに要した時間を測定。
   連続した列3列のソート 連続しない列3列のソート(1) Compareでの3列ソート(2)
MSHFlexGrid 0.06 秒 0.3 秒 3.2
MSFlexGrid    1.0 秒   




2003/11/29