VBのソート処理のやり方

このQ&Aのポイント
  • [質問文章] VBのソート処理のやり方について、質問させていただきます。
  • [質問文章] VBのソート処理についての質問です。具体的なやり方を教えていただけないでしょうか?
  • [質問文章] VBのソート処理の方法について詳しく教えていただけないでしょうか?
回答を見る
  • ベストアンサー

VBのソート処理のやりかた

同じような質問を以前こちらでさせていただいたのですが、質問ないようが粗かったため、再度させていただきます。 前回の→http://soudan1.biglobe.ne.jp/qa4920320.html どなたかお力を貸していただければと思います。 【処理概要】 個人成績表からレコードを取得し、取得したレコードを点数の高い順にソートし、順位・氏名・点数を個人成績順位表に出力する といったものです。 個人成績表は、氏名と点数の2項目で、レコード数は自由です。 とりあえず、私はサクラエディタに10レコード作りました。(下記参照) また、個人成績順位表もサクラエディタで作っています。 それをコーディングディングの最初に Open "C:\INFILE.txt" For Input As #1 Open "C:\OUTFILE.txt" For Output As #2 で開き、はじめるというのが、それまでの課題で指示されています。 今考えているのが ・loopのなかにloopを使いバブルソートする ・i = i + 1の式を使いたい といった程度です。 個人成績表なのですが、他の人の表も実行できるように「レコード数は不明」の前提で、コーディんグするようにとのことです。 また個人成績順位表は、「順位・氏名・点数」の順に出力とあり、 ソートの考え方として、【レコードを配列に取り込む→レコードを取り込む際に件数をカウントし、件数をn件とする】 とありました。 VBは全くの素人で、ネットで調べても、レベルが高すぎて応用できないためこちらで質問させていただきました。 どなたか力を貸していただけないでしょうか?よろしくお願いいたします。 【自作個人成績表】 青木        076 井上        081 江藤        066 柏原        092 小林        087 斉藤        059 佐久間       076 関根        088 塚田        096 富田        083 :          :

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

  • ベストアンサー
  • tom11
  • ベストアンサー率53% (134/251)
回答No.5

第二弾と、第三弾を追加 ソート関数 Public Sub sort1(d1() As String, d2() As Integer) Dim max As Integer Dim na As String Dim i1 As Integer, i2 As Integer Dim cc As Integer cc = UBound(d2) For i1 = 0 To cc For i2 = i1 To cc If d2(i2) > d2(i1) Then max = d2(i2) d2(i2) = d2(i1) d2(i1) = max na = d1(i2) d1(i2) = d1(i1) d1(i1) = na End If Next Next End Sub ソート処理と出力部分のプログラムの追加分 Call sort1(dname, yo) Dim foutput As Integer foutput = FreeFile Open "output.txt" For Output As #foutput For i = LBound(dname) To UBound(dname) Print #foutput, dname(i), yo(i) Debug.Print dname(i), yo(i) Next Close #foutput 出力結果 青木 76 井上 81 江藤 66 柏原 92 小林 87 斉藤 59 佐久間 76 関根 88 塚田 96 富田 83 ソート後の結果 塚田 96 柏原 92 関根 88 小林 87 富田 83 井上 81 佐久間 76 青木 76 江藤 66 斉藤 59 多少、バグもあるかもしれませんが。 結果OKなので、これで良しとしてください。

tao0417
質問者

お礼

段階に分けて教えていただき、本当にありがとうございます。 みんな見たことあるステートメントなので、自分の数値に入れかえ 入力してみます。 これなら、理解しながら進めることができそうです!! 何度も質問に答えていただき本当にありがとうございました。

その他の回答 (4)

  • tom11
  • ベストアンサー率53% (134/251)
回答No.4

こんにちは、 まず、順番に問題を解決した方が、良いと思います。 まず、流れとして 1:ファイルから、データを取り出し、ソート用に加工する 2:データをソートする 3:結果を出力する。 アクセスをもっていないので、エクセルを利用します。 アクセスとエクセルの影響のない部分のVBAで、 処理していますので、どちらでも、動作すると思います。 まず、元データ 青木 076 井上 081 江藤 066 柏原 092 小林 087 斉藤 059 佐久間 076 関根 088 塚田 096 富田 083 名前スペース点数で、メモ帳でも使って、 input.txtファイルを作成する。 まず、第一段目 Dim cd As New Collection Dim finput As Integer Dim d As String Dim i As Integer Dim dcount As Integer Dim dd() As String Dim dname() As String, yo() As Integer Dim dbun() As String finput = FreeFile 'input.txtがあるディレクトリー、自分の環境にあわせる Application.DefaultFilePath = "C:\Documents and Settings\????\My Documents\excel雑\" Open "input.txt" For Input As #finput Do While Not EOF(finput) Line Input #finput, d cd.Add d Loop Close #finput '以上で、データファイルの読み込み終わり 'ここから、ソートするためにデータを加工 ReDim dd(cd.Count - 1), dname(cd.Count - 1), yo(cd.Count - 1) For i = 1 To cd.Count dd(i - 1) = cd.Item(i) dbun() = Split(dd(i - 1), " ") dname(i - 1) = dbun(0) yo(i - 1) = CInt(dbun(1)) Debug.Print dname(i - 1), yo(i - 1) Next 以上で、ファイルから、データを読んで、ソートするデータを 作ります。 第一弾は終わり、ここまで、上手く行ったら、補足してください。 第二弾は、ソート、 第三弾は、出力 

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

UnibonさんのHPに参考になるプログラムがあります。 http://www.geocities.co.jp/SiliconValley/4334/unibon/asp/vbscriptsort.html VBScriptはアクセスなどで使うVBAとほぼ同類の言語です。 変数が全てVariant型という点や、細かい差異はあります。 ここの例ではVBScript特有のステートメントは無いので、 コピペしても実行可能です。 マネすれば課題はクリアですが、VB初心者には何やってるか サッパリだと思います。 あまり、凝った方法を使うとツッコミを入れられた時に困るので、 自分でも納得できたやり方を真似しましょう。

tao0417
質問者

お礼

参考になるURLありがとうございます。 おっしゃる通り、素人の私がいきなり課題ができても おかしい話なので、資料を参考にしながら、 取り組んでみたいと思います。

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.2

プログラム経験無しでいきなりソートですか? 無理っぽいと思います。 もっと基本を勉強してからではないでしょうか。 課題がどのような形で出てきているものか知り ませんが無茶な出し方だと思います。

tao0417
質問者

お礼

やっぱり無理なことをさせられていたのですね。 分かりました。ありがとうございます。

  • tom11
  • ベストアンサー率53% (134/251)
回答No.1

こんにちは、 VBと書くと、visual basic の V6とかnetの方が 連想されるので、アクセスのVBAと、書きましょう。 アクセスだと、SQLで、一発なのですが。 学校の課題なのか **********引用********* それをコーディングディングの最初に Open "C:\INFILE.txt" For Input As #1 Open "C:\OUTFILE.txt" For Output As #2 *********************** データベースソフトを使っていて、 普通、こんな処理しないのですが。 必須なのですか。??? そもそも、アクセス使っていると、 このような処理、VBAを使うまでもないのですが。 クエリ一発なのですが。 VBAを使うと言うのも必須なのですか。??

tao0417
質問者

補足

またご回答いただきありがとうございます。 以後アクセスのVBAと書きたいと思います。 今回の課題についてなのですが、 【開発環境としてAccessを使用する。ただし今回はAccess本来の機能は使用せずVBAの環境のみを利用してファイル操作プログラミングを行う】 とあり、「プログラミング工程の一連の流れの把握と、ロジック構築に主眼を置いたもの」と前置きがありました。 プログラミングに触ったことのない私にとって、これらのプログラミングが普通と思っていたのですが、そうじゃないようですね。 ただ、今回は上記のとおり、いろいろと制約があり、その中で答えを導かなければならないので、できることなら、教えていただければと思います。

関連するQ&A

  • ソート処理について

    毎回お世話になっています。課題でソート処理が出題されたのですが、フローチャートすら書けない状況なので、どなたか力を貸していただけないでしょうか? 【処理概要】 個人成績表からレコードを取得し、取得したレコードを点数の高い順にソートし、順位・氏名・点数を個人成績表に出力する といったものです。 個人成績表は、氏名と点数の2項目で、レコード数は自由です。 とりあえず、私は10レコード作ったのですが、いろいろな個人成績表に対応できるように「レコード数は不明」の前提で、コーディんグするようにとのことです。 個人成績順意表は、「順位・氏名・点数」の順に出力とあり、 ソートの考え方として、【レコードを配列に取り込む→レコードを取り込む際に件数をカウントし、件数をn件とする】 とありました。 VBは全くの素人で、ソートに種類があることすら知らず、使い分けも知りませんでした。 どなたか力を貸していただけないでしょうか? 【自作個人成績表】 青木        076 井上        081 江藤        066 柏原        092 小林        087 斉藤        059 佐久間       076 関根        088 塚田        096 富田        083 となっています。 よろしくお願いいたします。

  • sortコマンドの使い方

    一列目はクラス、二列目はテストの点数、三列目は氏名からなるデータ: # data.txt ---------- 1 80 安倍 1 100 小泉 1 90 小沢 2 80 松坂 2 70 松井 2 100 鈴木 ------------- があります。 これを sortコマンドで (1) 1列目昇順 (2) 2列目降順 で並び替えて # data2.txt ---------- 1 100 小泉 1 90 小沢 1 80 安倍 2 100 鈴木 2 80 松坂 2 70 松井 ------------- のように、クラスごとに得点順に並び替えたいと思っています。 sort のオプションは -k が並び替えの基準の列の指定 -r が逆順 -g が数値データ なので cat data | sort -grk2 | sort -k1 としてみましたがうまく行きません。 一つめ「sort -r -k2」でせっかく二列目降順に並び替えているのに、二つめ(右)の sort -k1 でその結果が無くなってしまって 1 100 小泉 1 80 安倍 ← !! 1 90 小沢 ← !! 2 100 鈴木 2 70 松井 ← !! 2 80 松坂 ← !! のようになってしまいます。 どうすればよいでしょうか?

  • excelでテストのランキングの表を作りたい

    excel2003で100人ほどのテストの点数のランキングの表を作りたいです。 元の表として「氏名」「点数」「順位」の項目をつくり、氏名、点数は手入力で、順位はRANKという関数で順位を与えました。 そして、その中で上位30位を別の表として「順位(1位から30位)」「点数」「氏名」という項目を作り表作成したいんですけど 点数に該当する氏名の表示方法がわかりません。 ・「順位」→RANKで1位から、30人分を表示(元の表の点数を変えると順位も変わる) ・「点数」→LARGEで点数の高い順に表示(元の表の点数を変えると順位も変わる) ・「氏名」→その点数に該当する氏名を表示する方法がわかりません。また、同じ点数が数名いる場合に氏名が重複しないようにするにはどうすればいいでしょうか。 エクセル初心者です。よろしくお願いします。 わかりにくい説明ですいません、何かあったら補足で説明いたします。

  • ファイル内のレコードからソートを行うには?

    氏名A 年齢A 性別X 出身J ・・・ 氏名B 年齢B 性別X 出身K ・・・ 氏名C 年齢C 性別Y 出身J ・・・  :  : というような内容のレコードファイルを読込み、 氏名順にソートを行いたいのですがどうすればいいでしょう? 構造体とかを使えばうまく行くのでしょうか? *氏名順になれば、さらに年齢や性別などをソートする必要はありません。 環境 WinXP / Borland C++

  • ソートアルゴリズム(c言語)

    この問題の番号の並び替えがどうしても分かりません。とき方を教えてください。 問題:nこの学生番号と音楽の点数からなる成績データを入力し、成績の順にデータを並び替えるプログラムを作りなさい。 入力             出力 10             ソート前データ 1 56           番号  音楽 2 47           1   56 3 85           2   47 4 57           3   85 5 96           4   57 6 75           5   96 7 81           6   75 8 31           7   81 9 50           8   31 10 76          9   50               10   76               ソート後データ               番号   音楽               5    96               3    85               7    81               10   76               6    75               ・    ・               ・    ・               (省略) 大変だとは思いますが、お願いします。

  • エクセルのソートで文字列がうまく並ばない

    スポーツの記録集計をしています。 A列に氏名,B列以降に記録,試合名,日時,順位などの個人のデータが入ったワークシートがあります。 試合ごとに記録を入力しているので,元々は試合名,日時順になっており,約90人分のデータが1年間で1700行余りになりました。一人が複数の試合や種目に参加しているので,これを個人別にまとめようとA列の氏名でソートしました。 すると,同じ名前なのに別名と判断されてうまく並ばない箇所がいくつかあります。 氏名は漢字なのでおそらくコード順に並ぶのだと思いますが,ほぼ読みの50音順に並んでいる感じです。ところが,たとえば「山田」さんだったら音読みの「さん」と訓読みの「やま」の2カ所に分かれて出てきたりします。一方のセルを他方のセルにコピーしてやり直せばもちろんうまくいきますが,データ数が多く,手作業はしていられません。またソートした後「山田」さんのデータが一つだけ別のところに飛んでいたりすると気がつかないことも考えられます。 スペースが入っていたりもなく,IF関数で同一のセル内容かどうか判断させると「同じ」という結果になります。どう見ても同じセルがソートで違うものと扱われるということはあるのでしょうか。また,こういうときはどう対処すれば良いのでしょうか。 エクセルに詳しい方,このような経験がおありの方,アドバイスをお待ちしています。

  • excelでテストの成績処理をしたいのですが

    私は塾の講師をしているのですが、毎日、生徒に5教科の小テストを行っています。 それで、毎日、5教科のそれぞれの点数と合計点数を打ち込んで、壁に張り出しています。 そのデータは、一つのブックに日付けごとでシートを分けて保存してあります。 今回、その日付別の表のデータから、毎回の成績を生徒別の表に変えて、プリントにして生徒一人一人に配ろうかと考えています。ですが回数と人数がとても多いので、一人一人「コピー→貼り付け」を繰り返していたのでは時間がかかりすぎます。 なので、マクロで自動的にやりたいと考えたまではいいんですが、実際どういうプログラムにすればいいのか皆目検討がつきません。 表の形はすべて、A列に順位、B列に名前、C列からG列までが各教科の点数、H列にSUM関数で合計点数。最後の行に各教科と合計の平均点を関数で出している。という表です。 表はすべて名簿の順にソートしてあります。 これらの表から一人一人の毎回の点数を取り出して、自分の毎回の点数が縦に並んでいる別の表を作成したいのです。 どういうやり方をすればいいのでしょうか?

  • excel2000で営業実績をまとめたい

    4月から毎月、各支店の職員の営業実績を取りまとめることになりました。職員100名ほどで、5商品の成績と、総合順位、各商品の順位を月計と年度累計で出します。2ヶ月間は何とかやっていたのですが、支店間の人事異動もあるのでなかなか上手くいきません。下記のような表を作ってランク付け、コピー、ソートを繰り返していたのですが、空欄(転勤者のセル)が上位に来たり、印刷時もレイアウトが上手くいきません。何かいい方法を教えてください。入力も大変なので、出来れば、個人の成績表から下のような表を作りたいのですが.. 総合 名前 支店 スコア  商品A   商品B 順位           順位 件数 順位 件数  2 鈴木 A店   5  3  10 2  15  4 佐藤 B店   7  2  12 5   9  5 田中 A店   9  5   8 4   8  1 加藤 B店   4  1  15 3  12  2 山本 C店   5  4   9 1  18          .          .          .      

  • EXCELで重複したデータの処理について

    氏名 | 点数 ----------- 山田 | ----------- 鈴木 | ----------- 小林 | ----------- 高橋 | ----------- 田中 | という表があるとします。 氏名 | 点数 ------------ 山田 | 80 ------------ 鈴木 | 100 ------------ 小林 | 70 ------------ 高橋 | 80 ------------ 田中 | 80 というように点数を入力すると 順位 | 名前 | 点数 ------------------- 1 | 鈴木 | 100 ------------------- 2 | 山田 | 80 ------------------- 2 | 高橋 | 80 ------------------- 2 | 田中 | 80 ------------------- 5 | 小林 | 70 のような表を自動的に作成できるようにしたいのですが、どうもうまくいきません。 順位と点数の並び替えは比較的簡単にできたのですが、それに対応した名前の並び替えがうまくできないのです。 VLOOKUP関数を使用して得点に対応した名前を表示させようとしたのですが、 順位 | 名前 | 点数 -------------------- 1 | 鈴木 | 100 -------------------- 2 | 山田 | 80 -------------------- 2 | 山田 | 80 -------------------- 2 | 山田 | 80 -------------------- 5 | 小林 | 70 となってしまい、80点の取得者が全て山田になってしまいました。 このような場合、どのようにすれば正常に並び替えを行うことができるのでしょうか。 言葉足らずで申し訳ありませんが、よろしくお願い致します。 OSはWindowsXP、ソフトはEXCEL2002を使用しています。

  • Access2000のクエリでクラスごとの順位表を作りたい

    成績表テーブルがあります。 フィールドは 学年、組、点数 です。 ここで 組(先に学年で抽出後)ごとに順位を出したいと思います。 単に順位を出すだけなら次の形ででそうなのですが、組ごとにする 場合はどうすればよろしいでしょうか? 順位:Dcount("[点数]","[成績表]","[点数]<" & [点数])+1