データを並べ替える(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万セル のような制限がありません。 又、ヘルプに記載されている定数等で、一部不備があるようです、詳しくは下記の 魔界の仮面弁士さんの投稿を参考にして下さい。
|
|||||||||||||
テスト結果 AMD Athlon(tm)Processor 946 MHz 240 MB RAM WindowsXP(Home) で 8列5000行(276KB)のデータのソートだけに要した時間を測定。
|
2003/11/29