人に聞けない痔の悩み、これでスッキリ >>

初心者なので申し訳ございません
いろいろとネットで調べてみたのですが、うまく出来ないので質問させて下さい。
CSVファイルで以下の様なデーターがあります。

バナナ,oooo300,xxxx
リンゴ,oooo200,xxxx
パイナップル,oooo500,xxxx

3番目の項目を数字の大きい順に並び替えて別ファイルに保存したいのです。

ファイルを読み込む

並び替える

書き込む

ファイル保存

の順番と思ってやっているのですが・・・・
並び替え方法が分かりません

宜しくお願いします。m(__)m

このQ&Aに関連する最新のQ&A

A 回答 (9件)

方法として、自分でソートする方法もありますが(ソートアルゴリズムでぐぐってみるといっぱいでてきます)


、VB2010ということなので一番簡単な方法は以下の方法だと思います。
<並び替えの部分だけ>
(1)数字の部分を抜き出し、コレクション(arraylist)に投入する。
(2)コレクションのソート機能を利用してソートする。
(3)ソート後、もとのリストがどの位置に移動したか移動後の添字を取得する。
(4)もとのソースを移動後の添字に準じて、配列(コレクションでもok)へ格納する。

なお、上記方法にて行なった場合、同一キーが存在すると不具合が起こるります。
そこで、元のファイルのキーとなる部分にはあらかじめ連番を振っておくことで回避できるかと思います。

   300、200、500ー> 3001、2002、5003 みたいに...(振る連番桁数は絶対に桁変更が起きないように
   桁数を揃えてね!)これをソートのキーとする。
ソートの方法は色々とあるようですが、自分で導きだす筋道をしっかりと検討して、その方法が一番効率がよい
かがポイントとなります。やり方によっては、非常にマシンに負担のかかる処理だったり、件数が多ければ多いほど
、反比例的に遅くなってくるとかなどの現象が発生したりします。
 いきなりソースをごちゃごちゃと弄るよりも、紙ベースでしっかりと方式を検討しましょ!



  
    • good
    • 0

おはよう御座います。


昨日は、何度も混乱させしまうようなことばかりですいませんでした。
回答する場所がなくなってしまいましたので、ここから返信させていただきました。

実際のCSVファイルがありませんので、十分なテストが出来ていませんので、万が一昨日のサンプルを参考にされる場合は、テストを十分に行ってください。

とくに、降順、昇順の部分は、ひとそれぞれのプログラムの仕方が違いますので、要注意です。

>あとファイルのreaderBのcloseを入力すれば良いのですね^^
上記のように、KenKen1978さんは十分な力を持っていますので、不備な点はご自分で直してください。


>もうだんだん迷路に入ってしまったので
相当、頑張りましたね。


>いろいろと試してみたのですが
プログラムする際は、重要な点だと思います。これからも試行錯誤を続けてください。(一部試行錯誤が禁止されている部分もありますが)


>bybalsendercaseさんはレベルの高い部分
それは、ないない、私もVB初心者ですから。

CSVファイルの順番を替えてしまいましたが、もとに戻せますか?
方法は、どこか途中で記入しましたが、それでも、戻せない場合は再度返信してください。
それでは、残りの部部をがんばってください。
    • good
    • 0

何回もすいません、文章を読み違えてしまいました。

KenKen1978 さんの場合は降順ですね。コードを追加してください。

artest.Sort() '並べ替え
artest.Reverse() '降順   ←この一文を追加してください。

私のサンプルは、非合法ですので、最終手段でお願いします。(Sortを使っているため)
    • good
    • 0
この回答へのお礼

いろいろと教えて下さり、本当に感謝しています

自分の力が無いので実現できませんでした・・・・

大変申し訳なかったです・・・・・
別に質問をUPしました

スイマセン・・・・・

お礼日時:2012/07/28 03:54

たびたび申し訳ありません、文字制限のため書ききれませんでしたので再度投稿させて頂きます。


それと先ほどのサンプルはかなり、悪い例ですので他の方の回答で試して、それでも難しい場合に使用してください。

KenKen1978 さんのCSVファイルの数字が7桁以内を想定しています。

数字が、下記のように、全てが7桁ではない事を想定してIf文を挿入しています。
バナナ,oooo300,xxxx
リンゴ,oooo200,xxxx
パイナップル,oooo500,xxxx
イチゴ,50,xxxx
数字が全部7桁ですと、If文は必要ありません。
それと、最後にtest3.csvに保存するときにCInt(st2)のように、数値に変換していますがこれも必要ありません。
CInt(st2)→st2


実験する際プログラムの先頭に下記のコードを入れておくと、実験が楽になります。
IO.File.Delete(Application.StartupPath & "\test2.csv") 'test2.csv削除する
IO.File.Delete(Application.StartupPath & "\test3.csv") 'test3.csv削除する


解決を目指してがんばりましょう。
    • good
    • 0

KenKen1978さん、こんにちは。

かなり非合法ではありますが、超簡単なサンプルを作成しましたので、コピペして動作を確認してみてください。できればプログラムの先頭で'test2.csvと'test3.csvを削除してください。
Dim reader As New IO.StreamReader(Application.StartupPath & "\test1.csv", System.Text.Encoding.GetEncoding("Shift-JIS"))
Dim line As String 'CSVファイルの一行
Dim item1() As String '配列の各項目
Dim st1 As String 'item(0)
Dim st2 As String 'item(1)
Dim st3 As String 'item(2)
Dim int06 As String 'item(1)の文字数が1桁の場合は、先頭に000000を付ける。
Dim int05 As String 'item(1)の文字数が1桁の場合は、先頭に00000を付ける。
Dim int04 As String 'item(1)の文字数が1桁の場合は、先頭に0000を付ける。
Dim int03 As String 'item(1)の文字数が2桁の場合は、先頭に000を付ける。
Dim int02 As String 'item(1)の文字数が2桁の場合は、先頭に00を付ける。
Dim int01 As String 'item(1)の文字数が2桁の場合は、先頭に0を付ける。
Dim stlen As Integer 'item(1)の文字数
line = reader.ReadLine
Do Until IsNothing(line)
item1 = line.Split(",")
st1 = item1(0)
st2 = item1(1)
st3 = item1(2)
stlen = st2.Length 'item1(1)の文字数を調べる。
If stlen = 1 Then 'item(1)の文字数が1桁の場合は、先頭に000000を付ける。
int06 = "000000" & st2
test2(int06, st1, st3) '順番を並び替えてtest2.csvに保存
ElseIf stlen = 2 Then 'item(1)の文字数が1桁の場合は、先頭に00000を付ける。
int05 = "00000" & st2
test2(int05, st1, st3) '順番を並び替えてtest2.csvに保存
ElseIf stlen = 3 Then 'item(1)の文字数が1桁の場合は、先頭に0000を付ける。
int04 = "0000" & st2
test2(int04, st1, st3) '順番を並び替えてtest2.csvに保存
ElseIf stlen = 4 Then 'item(1)の文字数が2桁の場合は、先頭に000を付ける。
int03 = "000" & st2
test2(int03, st1, st3) '順番を並び替えてtest2.csvに保存
ElseIf stlen = 5 Then 'item(1)の文字数が2桁の場合は、先頭に00を付ける。
int02 = "00" & st2
test2(int02, st1, st3) '順番を並び替えてtest2.csvに保存
ElseIf stlen = 6 Then 'item(1)の文字数が2桁の場合は、先頭に0を付ける。
int01 = "0" & st2
test2(int01, st1, st3) '順番を並び替えてtest2.csvに保存
ElseIf stlen = 7 Then
test2(st2, st1, st3) '順番を並び替えてtest2.csvに保存
End If
line = reader.ReadLine
Loop
reader.Close()
Dim artest As New List(Of String) 'test2.csvの一行をリストにする。
Dim readtest As New IO.StreamReader(Application.StartupPath & "\test2.csv")
Dim testlline As String 'test2.csvの一行
testlline = readtest.ReadLine
Do Until IsNothing(testlline)
artest.Add(testlline) 'test2.csvの一行を、artestにAddする
testlline = readtest.ReadLine
Loop
readtest.Close()
artest.Sort() '並べ替え
Dim txt As String '要素
Dim item2() As String 'test2.csvファイルの各項目
Dim txt1 As String 'item2(0)
Dim txt2 As String 'item2(1)
Dim txt3 As String 'item2(2)
For Each txt In artest '再度ファイルの一行を分解する。 
item2 = txt.Split(",")
txt1 = item2(0)
txt2 = item2(1)
txt3 = item2(2)
test3(txt2, txt1, txt3) 'test3ファイルに保存
Next
End Sub
Private Sub test2(ByVal st1 As String, ByVal st2 As String, ByVal st3 As String)
Dim writer As New IO.StreamWriter(Application.StartupPath & "\test2.csv", True)
writer.WriteLine(st1 & "," & st2 & "," & st3)
writer.Close()
End Sub
Private Sub test3(ByVal st1 As String, ByVal st2 As String, ByVal st3 As String)
'ファイルパスは、Application.StartupPathになってますが、"C:\~"のように、任意でよい。
Dim writer As New IO.StreamWriter(Application.StartupPath & "\test3.csv", True)
writer.WriteLine(st1 & "," & CInt(st2) & "," & st3)
writer.Close()
End Sub
>いろいろとネットで調べてみたのですが←大変立派なことだと思います。文字数制限が~ 他にも書き足りないことが~ プログラムの先頭にファイルを削除するコードがあったんですが、後他のかたの回答も全部良い回答です。 制限が~
    • good
    • 0

1)ODBCTextDriverでCSVファイルへ接続。


2)項目3をキーとして、降順に取得
3)取得した行を「別ファイル」に出力
    • good
    • 0

Module Module1



'果物データ構造体
Structure KUDAMONO_DATA_STRUCT
'果物名
Public strFruitsName As String
'説明
Public strScript As String
'価格
Public nPrice As Integer
'予備説明2
Public strScript2 As String
End Structure
Public gAllKudamonoData() As KUDAMONO_DATA_STRUCT '果物データ
Public gnAllKudamonoNum As Integer '果物データ総件数

Sub KudamonoDataBSort(ByVal nEnd As Integer, ByVal UpperFlag As Byte)

Dim Loop1 As Integer
Dim Loop2 As Integer
Dim Tmp As KUDAMONO_DATA_STRUCT

For Loop1 = 1 To nEnd - 1
Tmp.nPrice = gAllKudamonoData(Loop1).nPrice
Tmp.strFruitsName = gAllKudamonoData(Loop1).strFruitsName
Tmp.strScript = gAllKudamonoData(Loop1).strScript
Tmp.strScript2 = gAllKudamonoData(Loop1).strScript2
For Loop2 = Loop1 To 1 Step -1

If (UpperFlag = 1) Then
If gAllKudamonoData(Loop2 - 1).nPrice > Tmp.nPrice Then
gAllKudamonoData(Loop2).nPrice = gAllKudamonoData(Loop2 - 1).nPrice
gAllKudamonoData(Loop2).strFruitsName = gAllKudamonoData(Loop2 - 1).strFruitsName
gAllKudamonoData(Loop2).strScript = gAllKudamonoData(Loop2 - 1).strScript
gAllKudamonoData(Loop2).strScript2 = gAllKudamonoData(Loop2 - 1).strScript2
Else
Exit For
End If
End If
If (UpperFlag = 2) Then
If gAllKudamonoData(Loop2 - 1).nPrice < Tmp.nPrice Then
gAllKudamonoData(Loop2).nPrice = gAllKudamonoData(Loop2 - 1).nPrice
gAllKudamonoData(Loop2).strFruitsName = gAllKudamonoData(Loop2 - 1).strFruitsName
gAllKudamonoData(Loop2).strScript = gAllKudamonoData(Loop2 - 1).strScript
gAllKudamonoData(Loop2).strScript2 = gAllKudamonoData(Loop2 - 1).strScript2
Else
Exit For
End If
End If

Next Loop2
gAllKudamonoData(Loop2).nPrice = Tmp.nPrice
gAllKudamonoData(Loop2).strFruitsName = Tmp.strFruitsName
gAllKudamonoData(Loop2).strScript = Tmp.strScript
gAllKudamonoData(Loop2).strScript2 = Tmp.strScript2
Next Loop1

End Sub

End Module


ソートボタンなんかでKudamonoDataBSort(データ総数、1:昇順 2:降順)関数をCallすれば
入れ替えソートをやってくれるはずです。

参考URL:http://japan.internet.com/developer/20080418/26. …
    • good
    • 0
この回答へのお礼

きっと出来ると思ってeternazx9rさんの教えて下さったコードも自分用に置き換えて試してみました・・・・
しかし、僕がアホ過ぎて失敗に終わりました。

大変失礼しました・・・・

新しく自分のコードを入れて質問を再UPしました。

スイマセン

お礼日時:2012/07/28 03:57

やり方としては、


1.データを入れるための構造体を用意して、Dim データ() As データ構造体 で宣言しておく
2.ファイルを開いて行数を取得してファイルを閉じる
3.行数=データ件総数なので Redim データ(行数)で改めて宣言
4.またファイルを開いて一件1項目ずつデータを格納していきファイルを閉じる
5.バブルソートをする
6.ファイルを開いて一行分の情報をPrintLineで書き込んでファイルを閉じる
というような流れになります。

まずは「バブルソート VB」で検索してみましょう。
サンプルがどこかに転がっているはずです。

5.のバブルソートは
データの入っている配列を先頭から次の配列のデータと大小の比較していき(この場合は価格のところですね)、
昇順或いは降順の状態にマッチしていたら入れ替える、という処理を行います。
入れ替えの方法は
バッファ←A
A←B
B←バッファ
という順序でできますよ。

参考URL:http://www5d.biglobe.ne.jp/~tomoya03/shtml/algor …
    • good
    • 0

> 並び替え方法が分かりません


原始的な方法は分からないとかじゃないと思う。

If 前の行の数値 < 後の行の数値 Then
 データを入替える
End If
これだけのことでは?
それを繰り返すのが一番単純なバブルソート。

クイックソートくらいになればちょっと教えてもらわないと
ぱっと見では理解できない事もあるだろうけど、
データの並び替えなんてプログラムの学校なり、入門書なり
入門サイトなりで紹介されている初歩的なもの。
自分で勉強して分からないなら、プログラム自体しない方がいい。

この回答への補足

おっしゃっている事は凄く良く分かるのですが、その方法を教えて下さると助かるのですが・・・・

現在ReadLineで読み込んでsplitで分けてIfで比較しようとしていたのですが、どの様に次の行と(前の行と)比較したらよいのやら・・・・

手厳しいお言葉おそれいります・・・・

補足日時:2012/07/25 15:00
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qcsvファイル内にてソートする方法

ご協力お願いします。

あるログデータを取得したcsvファイルを作成しました。しかし、データ量も多く見やすいようにソートをかけたいのですが方法がわかりません。csvファイルの中身は以下のようになっています。
___________________________
| 端末ID | ユーザーID | 日付 | 時間 |
―――――――――――――――――――――――――
| ITD002 | 00000001 |2005/08/22| 11:00 |
―――――――――――――――――――――――――
| ITD002 | 00000003 |2005/08/22| 21:00 |
―――――――――――――――――――――――――
| ITD001 | 00000001 |2005/08/22| 12:00 |
―――――――――――――――――――――――――
| ITD001 | 00000002 |2005/08/22| 18:20 |
―――――――――――――――――――――――――
以上のような中身になっています。レコード量は、もっと多いです。このランダムな順番に取得したレコードを 端末ID(昇順)ユーザーID(昇順)日付(降順)時間(降順)でソートする方法をご教授お願いします。

ご協力お願いします。

あるログデータを取得したcsvファイルを作成しました。しかし、データ量も多く見やすいようにソートをかけたいのですが方法がわかりません。csvファイルの中身は以下のようになっています。
___________________________
| 端末ID | ユーザーID | 日付 | 時間 |
―――――――――――――――――――――――――
| ITD002 | 00000001 |2005/08/22| 11:00 |
―――――――――――――――――――――――――
| ITD002 | 00000003 |2005/08/22| 21:00 |
―――――――――――――――――――――...続きを読む

Aベストアンサー

ODBCドライバーに、テキストドライバーがあるので組み込み、
ソートするクエリを作成して、結果を出力してしまう。

ただし、別ファイルになりますので、どうしても同じファイルで、というなら
出力をワークとして作成後、元ファイルにコピーで上書き&ワーク削除する。

QCSVから読み込んだデータの保持とソート

お世話になっています。VB.NET+CSVに関する質問です。
現在VB.NETで、CSVから読み込んだレコードをある項目を基準に並び替え、一覧にして画面に表示するというプログラムを作っています。

こういう場合のCSVから読み込んだデータの保持の方法と、その並び替えの方法にはどういうやり方がありますか?
いくつかのパターンがあると思いますが、教えてください。

以下はCSVの情報です。
・1行が1件のレコード
・項目1を昇順で並び替える
・CSV項目:項目1(半角英数字)項目2(タブ)項目3(半角・全角文字)
・CSV件数:1000行以下

Aベストアンサー

すみません、ANo.3です。
もうちょっと書いておいた方が良いかもしれませんね。
私が書いている方法では、まずは、例えば構造体の配列等にCSVの内容を入れておきます。
で、IComparerを持つクラスの中で、比較したい構造体の「メンバを指定」しつつ
(ここが単純なSortメソッドでは不可能)比較し、大小関係を <0、=0、>0 で
指定してやれば良いです。
但しその際、Compareメソッド内で、比較する2値(Object型)を、該当の構造体に
変換してからでないと、比較できません。
CTypeかDirectCastで変換は可能かと思います。
…このぐらい書いておけば大丈夫かな?

QVBA-読み込んだテキストファイルを並び替えて書き出したい

VBA-読み込んだテキストファイルを並び替えて書き出したい

ch1=FreeFile
Open A for Input as ch1

ch2=FreeFile
Open B for Input as ch2

DO while Not EOF(ch1) Line Input #ch1,buf
Print #ch2,buf
Loop

Close #ch1,#ch2

で読み込み、書き出すことはできました。

やりたいことは、書き出す時に、項目を並べ替えたいのです。


にんじん りんご ねこ
だいこん バナナ いぬ


りんご ねこ にんじん
バナナ いぬ だいこん

よろしくお願いいたします。
区切りはタブです。

Aベストアンサー

#1です。
例示のコードは、配列内容を完全に入れ替えますので、ご希望の順に調整してください。
forループの部分です。

QConsole.WriteLine で表示されない

VB2008でプログラムミングしておりますが、プログラミング試験の為によく使われる、「Console.WriteLine」ですが、表示されないのです。
何処に表示されるのでしょうか。
デバックを行っても何処にも表示されません。

Console.WriteLine("Hello World")
でも表示が何処にも有りません。

初歩的な質問ですが、私には大事な一歩なので宜しく御願い致します。

Aベストアンサー

質問者さんはもう見ていないかもしれませんが、一つ。
質問者さんはプロジェクトのタイプをFormにしているので、コンソールに表示されないのです。
プロジェクトのタイプをコンソールアプリケーションにすれば良く見られるDOS窓に表示されます。
Formアプリケーションタイプでも、確かプロジェクトのプロパティをいじればできたはずです。

QVBAでcsvファイルを読み込んで並び順を変える方法

こんにちは。VBAについて質問させてください。
当方まだ勉強し始めたばかりのかなりの初心者です。
見当違いの質問かもしれません…
どなたかご教授よろしくお願い致します。


以下のようなcsvファイルがあります。

Andou,tokyo,25,
andou,aichi,16,
iijima,fukushima,22,
----以下略------


「名前」「出身地」「年齢」の順に
並んでいるだけのファイルです。
これを
「出身地」「年齢」「名前」の順に
並べ変えたいのですがどうしたら良いでしょうか?


(1)一度シートにcsvファイルを読み込む
(2)シート上で列をcut,pasteで並び替える

なら方法は分かるのですが、
csvファイルが物凄く長いため
シート上にcsvファイルを読み込めない状況です。
どうしたらよいのでしょうか?

何かアドバイスだけでもあれば教えて下さい。
なにとぞ宜しくお願い致します。

Aベストアンサー

エクセルで(長くて)読み込めないのだから、エクセルでやる必要もないと思います。
VBScriptで、
以下の様にconv.vbsとして保存して実行すると
data.cvsをdata_cnv.cvsとして変換出力します。
---------------------------------------------------------------
Dim fso, inf, outf, aLine, field, wk

Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set inf = fso.OpenTextFile("data.csv",1)
Set outf = fso.OpenTextFile("data_cnv.csv",2,true)

Do until inf.AtEndOfStream
aLine = inf.ReadLine
field = split(aLine,",")
'列の並び替え
wk=field(0)
field(0)=field(1)
field(1)=field(2)
field(2)=wk
aline = join(field,",")
outf.WriteLine(aline)
Loop
inf.Close
outf.Close

エクセルで(長くて)読み込めないのだから、エクセルでやる必要もないと思います。
VBScriptで、
以下の様にconv.vbsとして保存して実行すると
data.cvsをdata_cnv.cvsとして変換出力します。
---------------------------------------------------------------
Dim fso, inf, outf, aLine, field, wk

Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set inf = fso.OpenTextFile("data.csv",1)
Set outf = fso.OpenTextFile("data_cnv.csv",2,true)

Do until inf.AtEndOfStream
...続きを読む

Q文字列の後ろから必要分だけ削除したい。

例1 Dim str As String = "あいうえお1234"

文字列の中の1234だけ削除したい場合は、
str = str.Remove(5,4)
という風に、5文字目の後から4文字削除にすればよいのですが、

例の"あいうえお"の部分の長さが毎回処理する度に異なる場合は、
文字列の頭から何文字目という指定ができないので、”後ろから4文字を削除したい”となります。その場合は、どのようなプロパティを使えばいいのでしょうか。

.NET環境です。

Aベストアンサー

Length(str)で文字数を取得できますので、後ろから4文字目は先頭から何文字目かは計算できると思いますが、どうでしょうか?

QVB.NETのコンボボックスについて

VB6からVB.NETでプログラミングを始めました。
コンボボックスのクリアの仕方や設定の仕方、また
取り出し方等を教えて下さい。

色々とヘルプも見てみたのですが、よく解りません。
宜しくお願い致します。

Aベストアンサー

クリアだけだと思ってました。
追記します。

Itemを操作します


'登録
For i = 1 To 10
  Me.ComboBox1.Items.Add(i.ToString)
Next

'取得
For i = 0 To Me.ComboBox1.Items.Count - 1
  MsgBox(Me.ComboBox1.Items(i).ToString)
Next

'完全クリア
Me.ComboBox1.Items.Clear()

部分クリア
Me.ComboBox1.Items.RemoveAt(Index値)

Qテキストファイルを後ろから読む方法(VB2008)

やりたいことを先に書くと、最終的には
Linuxのtailに毛が生えたようなアプリをつくりたいと思っています。
開発環境はVB2008 Express Editionです。


で、まずはテキストファイルを後方から読む方法でつまっています。
指定した行数を後方から読むようにしたいと思っています。

最初は全行をいったん読み込んで配列に入れて処理という
書き方をしたのですが、大きなファイルの際にメモリを大量に消費し、
処理速度も遅くなったのでボツになりました。


今はとりあえず、バイナリで後ろから読み込んで改行文字列を
自分で見つけて処理をするという原始的な方法を思い浮かべていますが、
今っぽくないプログラミングであるような気がしています。

このようなことを実現する便利なクラス・機能やエレガントな記述等を
教えていただきたいと思っています。

よろしくお願いします。

Aベストアンサー

FileStreamからバイナリデータとして読み込んで文字列の配列に読み込むといった具合でしょう

dim Buf( 1023) as Byte

FileStreamのSeekメソッドでファイルの末尾へ移動 ... 1)
Seekで読み取りバッファ分だけファイルの先頭側へ移動 ... 2)
Read(Buf, 0, Buf.Length)で読み込み
CR(&H0D)やLF(&H0A)を探しながら BufをLength-1から0へ向けて検索および文字列化 ... 3)
希望の行数未満の場合は1)へ戻って 2)を繰り返し回数分戻して繰り返す
といった具合でしょう

3)の文字列化ですが UnicodeのファイルならSystem.Text.Encoding.Unicodeで
Shift_JIS(含むANSI)などのファイルならSystem.Text.Encoding.Defaultなどで変換が必要でしょう

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

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

同じような質問を以前こちらでさせていただいたのですが、質問ないようが粗かったため、再度させていただきます。
前回の→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
:          :

同じような質問を以前こちらでさせていただいたのですが、質問ないようが粗かったため、再度させていただきます。
前回の→http://soudan1.biglobe.ne.jp/qa4920320.html

どなたかお力を貸していただければと思います。

【処理概要】
個人成績表からレコードを取得し、取得したレコードを点数の高い順にソートし、順位・氏名・点数を個人成績順位表に出力する

といったものです。
個人成績表は、氏名と点数の2項目で、レコード数は自由です。
とりあえず、私はサクラエディタに10レコード作りまし...続きを読む

Aベストアンサー

第二弾と、第三弾を追加

ソート関数

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なので、これで良しとしてください。

第二弾と、第三弾を追加

ソート関数

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 ...続きを読む


人気Q&Aランキング