前提・実現したいこと
VBAで取り込んだcsvファイルのデータをソートしたいのですがうまくいきません。
3列目の数字をキーにして昇順ソートを行ってからデータを扱いたいです。
よろしければソートの手法やソートが実現できるコードを教えて頂けませんでしょうか。
お手数お掛けいたしますがご教授をよろしくお願いします。
csvファイルはテキストファイルで作成し拡張子をcsvにしております。
■使用するCSVのデータ
"富田","男","104","神奈川"
"村田","男","106","沖縄"
"山田","女","103","福岡"
"前田","男","101","北海道"
"栗田","男","103","東京"
"藤田","男","102","大阪"
"三田","女","106","愛媛"
"園田","女","105","愛媛"
該当のソースコード
Public Const COLNUM = 3 Public Function CntConfirmation(ByVal pfilePath As String)As Boolean CntConfirmation = False Dim agoRecord As String Dim newRecord As String Dim cntStorage As String 'CSV行格納配列 Dim fileDataTable() As String Dim FSO As Object Dim dataFile As Object Set FSO = CreateObject("Scripting.FileSystemObject") Set dataFile = FSO.OpenTextFile(pfilePath) 'ここが焦点になります。 '******************************** 'ここの処理でソートを試みてみました。 dataFile.sort Key := Range("C1"), _ Order := xlAscending '******************************** Do while readCSV(dataFile,fileDataTable) newRecord = fileDataTable(COLNUM - 1) If agoRecord = newRecord Then cntStorage = cntStorage + 1 End If agoRecord = newRecord loop CntConfirmation = True End Function
補足情報(FW/ツールのバージョンなど)
Excel2016
FileSystemObjectにソート機能はないと思いますが(私が知らないだけかもしれませんが)、
FileSystemObjectでソートを行うことができるという情報は、どこから入手したのでしょうか。
そのURL等を提示していただければ幸いです。
私が思うに、適当なワークシートにファイルの内容を展開し、ワークシート上でソートするのが、一番簡単かと思うのですが、いかがでしょうか。
tatsu99さん回答ありがとうございます。
FileSystemObjectでソートを行おうとしていなくオブジェクト型に格納した後で処理を通してソートできないか探っている所です。
エクセルで開いてフィルタでソートをするのが手っ取り早いのは事実でございますがなんとかコード上で昇順ソートを実現したく困っております。。
OpenTextFileの戻り値は「TextStream オブジェクト」ですね。仮にこれを並べ替えられたとしても、意味ないかと思います。
エクセルの機能を使いたくないなら、ご自身でソート機能を実装すれば良いです。
>FileSystemObjectでソートを行おうとしていなくオブジェクト型に格納した後で処理を通してソートできないか探っている所です。
meg_さんも書かれていますが、OpenTextFileの戻り値は「TextStream オブジェクト」です。
TextStream オブジェクトはSortメソッドを持っていません。
vbaで最も使用されるソートは、Rangeオブジェクトのソートです。Rangeオブジェクトはセルの集合です。したがって、「適当なワークシートにファイルの内容を展開し、ワークシート上でソートする」ことになります。この場合、人間の手作業は発生しません。全て、マクロで行います。
それで良ければ、提示可能です(案1)。ただし、この場合、ワークシートを1枚使用するので、そのワークシートを予め、確保しておく必要があります。そんな、みっともないことはしたくないということであれば、実行時にワークシートを追加し、完了後にワークシートを削除することになります。
Rangeオブジェクトのソートは使いたくないということであれば、SortedListの使用が考えられますが、ソートの条件は1つのキーという制約があります。また、キーの重複を許さないので、特別な手当てが必要になります。それで良ければ、提示可能です。(案2)
又、ソートのキーですが3桁固定なのでしょうか。もし、そうでないなら、文字列としてソートするのか数字としてソートするのか、どちらでしょうか。
数字のソート昇順の場合、以下のようになります。
"50"
"223"
"1234"
文字のソート昇順の場合、以下のようになります。
"1234"
"223"
"50"
結局最終的には、何がほしいのでしょうか。
fileDataTable()にソートされた結果がほしいのでしょうか。
readCSVのソースが提示されていないので、よくわかりませんが、
fileDataTableの要素は、1レコードですか、それとも、3列目のキーのみでしょうか。
キーの重複件数をカウントしているようにも見えますが、キーの重複件数がほしいためにだけソートしているのであれば、ソートせずに、キーの重複件数のみを取得する方法もあります。(dictionaryを使います)
ご返事ありがとうございます。dataFile(CSVのデータ)に対して
3列目をキーにして昇順ソートをしたいです。
CSVは毎回レコード数が違います。
10万レコードだったり1万レコードだったりします。
3列目は値は桁数が同じ数字になります。
分かりやすく3桁にしております。
そして重複した値があります。
fileDataTableは1レコードの3列目の値(数字)を差していてそれを交互に比較していき差異があった場合にカウントをするコードを作成したく迷っておりました。
私がほしいものは
Set dataFile = FSO.OpenTextFile(pfilePath)
のdataFileを3列目を基準に昇順ソートを行いたいです。
.NETのArrayListのSortメソッドでもソート出来そうです。
回答3件
あなたの回答
tips
プレビュー