• ベストアンサー

構造体を使っての集約、並べ替え方法

VB6.0で構造体を使っての集約、並べ替えはできるのでしょうか? 私がしたいのはtxtのシーケンシャルファイルを集約して並べ替えもしたいのですが上手いやり方が分かりません。 一度構造体にセットしてからなら出来るのではと考えたのですが、それ以上思いつきません。 効率の良い方法を教えてください。お願い致します。 実際にやりたい事 シーケンシャルファイルの1から5バイトをキーに10から15バイトを集約

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

興味がわいたので、下記URLを参考に作成してみました http://www.geocities.co.jp/SilkRoad/4511/vb/sort.htm 参考程度に... '構造体宣言 Private Type HOGE_HOGE   hoge1  As Long   hoge2  As Long   hoge3  As Long End Type '変数宣言 Private hogehoge  As HOGE_HOGE 'テストルーチン Private hoge_test()      Dim i  As Long      'hogehoge配列にデータ格納   ***********      'hogehoge配列ソート前   For i = 0 To Ubound(hogehoge) Step 1 Debug.Print "1:" & hogehoge(i).hoge1 & " 2:" & hogehoge(i).hoge2 & " 3:" & hogehoge(i).hoge3   Next i      'hogehoge配列ソート実行   Call QuickSorthogehoge(1, Ubound(hogehoge))      'hogehoge配列ソート後   For i = 0 To Ubound(hogehoge) Step 1 Debug.Print "1:" & hogehoge(i).hoge1 & " 2:" & hogehoge(i).hoge2 & " 3:" & hogehoge(i).hoge3   Next i    End Sub 'hogehoge配列クイックソート Private Sub QuickSorthogehoge(ByVal lngStart As Long, ByVal lngEnd As Long)      Dim BaseHoge    As HOGE_HOGE  '基準値を格納する変数   Dim BuffHoge    As HOGE_HOGE  '値をスワップするための作業域      Dim lngBaseNumber  As Long     '中央の要素番号を格納する変数   Dim lngCounter   As Long     '格納位置カウンタ   Dim i        As Long     'ループカウンタ      '終了番号が開始番号以下の場合、プロシージャを抜ける   If lngStart >= lngEnd Then Exit Sub      '中央の要素番号を求める   lngBaseNumber = (lngStart + lngEnd) \ 2      '中央の値を基準値とする   BaseHoge.hoge1 = hogehoge(lngBaseNumber).hoge1   BaseHoge.hoge2 = hogehoge(lngBaseNumber).hoge2   BaseHoge.hoge3 = hogehoge(lngBaseNumber).hoge3      '中央の要素に開始番号の値を格納   hogehoge(lngBaseNumber).hoge1 = hogehoge(lngStart).hoge1   hogehoge(lngBaseNumber).hoge2 = hogehoge(lngStart).hoge2   hogehoge(lngBaseNumber).hoge3 = hogehoge(lngStart).hoge3      '格納位置カウンタを開始番号と同じにする   lngCounter = lngStart      '開始番号の次の要素から終了番号までループ   For i = (lngStart + 1) To lngEnd Step 1          '値が基準値より小さい場合     If hogehoge(i).hoge2 < BaseHoge.hoge2 Then              '格納位置カウンタをインクリメント       lngCounter = lngCounter + 1              '値をスワップ       BuffHoge.hoge1 = hogehoge(lngCounter).hoge1       BuffHoge.hoge2 = hogehoge(lngCounter).hoge2       BuffHoge.hoge3 = hogehoge(lngCounter).hoge3              hogehoge(lngCounter).hoge1 = hogehoge(i).hoge1       hogehoge(lngCounter).hoge2 = hogehoge(i).hoge2       hogehoge(lngCounter).hoge3 = hogehoge(i).hoge3              hogehoge(i).hoge1 = BuffHoge.hoge1       hogehoge(i).hoge2 = BuffHoge.hoge2       hogehoge(i).hoge3 = BuffHoge.hoge3            End If        Next i      'hogehoge(lngCounter) を開始番号の値にする   hogehoge(lngStart).hoge1 = hogehoge(lngCounter).hoge1   hogehoge(lngStart).hoge2 = hogehoge(lngCounter).hoge2   hogehoge(lngStart).hoge3 = hogehoge(lngCounter).hoge3      '基準値を hogehoge(lngCounter) に格納   hogehoge(lngCounter).hoge1 = BaseHoge.hoge1   hogehoge(lngCounter).hoge2 = BaseHoge.hoge2   hogehoge(lngCounter).hoge3 = BaseHoge.hoge3      '分割された配列をクイックソート(再帰)   Call QuickSorthogehoge(lngStart, lngCounter - 1)      '分割された配列をクイックソート(再帰)   Call QuickSorthogehoge(lngCounter + 1, lngEnd)    End Sub

参考URL:
http://www.geocities.co.jp/SilkRoad/4511/vb/sort.htm
konnok
質問者

お礼

コーディングまでして頂きありがとう御座います。 大変勉強になりました。 VBを始めて間もないのですが、テキストファイルでのソートやグルーピングでお困りの方は多いのではと思います。

その他の回答 (1)

回答No.2

集約は置いといて 簡単に並べ替えをするならリストボックスが使えます。 Sortプロパティ(だったと思う)をTrueにしたリストボックスに シーケンシャルファイルから読みこんだデータをどんどん追加し、 ファイルが終わったらリストボックスの中に並べ替えられたデータが入っています。 ここまでくれば集約はそんなに大変じゃないと思います。

konnok
質問者

お礼

ありがとう御座います。参考にさせていただきます。

konnok
質問者

補足

リストボックスはformを使用しないと使えないのでしょうか?basファイルだけでの作成はどのようにすれば出来ますでしょうか?

関連するQ&A