プロが教える店舗&オフィスのセキュリティ対策術

wshのプログラムで困っているため教えてください。

wshでcsv(カンマ区切り)のファイルのソートを行い、Escel形式で保存するプログラムを書いています。
調べてみたところ、wshではソート関数がないようで、
adodbのsort関数を使用して対処しようとしていますが、どうもうまくいきません。
(※adodbの必要はないのですが、ExcelVBAのsortのコードを書こうとするとエラーになってしまったので、adodbにしています。)

<仕様>
csvファイルのソートのキーになるのは、「判定区分」の値で昇順に行いたいです。
csvファイルの一行目は、カラム名としてソート対象にはなりません。
読み込んだcsvファイルをexcel形式に保存したいです。

■csvファイルの形式は、以下のような形です。

性別,年代,判定区分,生年月日,日付
女性,10,0,2010/01/10,2013/7/7 23:57
男性,50,2,2000/03/30,2013/7/7 13:7
女性,10,0,1990/01/20,2013/7/7 15:22
女性,20,1,2001/12/10,2013/7/7 8:10
*-----------------------------------
<ソース>
Set con = CreateObject("ADODB.Connection")
With con
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Path & ";" _
& "Extended Properties='text;HDR=Yes;FMT=Delimited'"
.Open
End With

Set rec = CreateObject("ADODB.Recordset")
rec.Open "select * from " & csvfile & " order by 判定区分", con
*-----------------------------------
うまくいかないため
↓でも書いています。
*-----------------------------------
Const adDate = 7
Const adVarChar = 200
Dim ans

Set objADO = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
Set re = CreateObject("VBScript.RegExp")

rs.Fields.Append "性別", adVarChar, 255
rs.Fields.Append "年代", adVarChar, 255
rs.Fields.Append "判定区分", adVarChar, 255
rs.Fields.Append "生年月日", adDate
rs.Fields.Append "日付", adDate

rs.Open

ans = ""
rs.Sort ="判定区分 ASC"
rs.MoveFirst
Do While Not rs.EOF
ans = ans & rs.Fields(0).Value & vbCrLf
rs.MoveNext
Loop
MsgBox ans


エラーになってしまいます。
ソート処理だけですでににっちもさっちもいかないため、教えていただきたいです。

どうぞ宜しくお願いいたします。

A 回答 (1件)

こんな感じの VBS でどうでしょ。


E:\TMP フォルダ中に test.csv があると仮定しています。
なお、下記はExcelの標準モジュール(Sub モジュール)でも可。
※日付フィールドの書式変更はそちらで行ってください。

Dim cn
Dim rs
Dim xl, bk
Dim i

Set cn = CreateObject("ADODB.Connection")
With cn
.Provider = "Microsoft.JET.OLEDB.4.0"
.ConnectionString = _
"Data Source=E:\TMP;" _
& "Extended Properties='text;HDR=Yes;" _
& "FMT=Delimited'"
.Open
End With

Set rs = CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM test.csv order by 判定区分", cn', 0, 1, 1

Set xl = CreateObject("excel.application")
xl.Visible = True
Set bk = xl.Workbooks.Add

For i = 0 To rs.Fields.Count - 1
bk.Sheets(1).Cells(1, i + 1) = rs.Fields(i).Name
Next

bk.Sheets(1).Cells(2, 1).CopyFromRecordset rs
xl.UserControl = True
rs.Close:set rs = Nothing
cn.Close:set cn = Nothing
    • good
    • 0
この回答へのお礼

回答してくださってどうもありがとうございます。
本当にとても助かりました。
ADODBの使用ははじめてだったので早急にご回答いただいてとても助かりました。
ありがとうございました。

お礼日時:2013/09/05 12:55

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