とっておきの手土産を教えて

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

実際にやりたい事
シーケンシャルファイルの1から5バイトをキーに10から15バイトを集約

A 回答 (2件)

興味がわいたので、下記URLを参考に作成してみました


http://www.geocities.co.jp/SilkRoad/4511/vb/sort …

参考程度に...



'構造体宣言
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 …
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/09/06 01:59

集約は置いといて


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

ここまでくれば集約はそんなに大変じゃないと思います。

この回答への補足

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

補足日時:2003/09/06 02:02
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/09/06 02:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A