- ベストアンサー
vbs csv編集 プログラム
- vbsでcsv編集プログラムを作成したいです。
- 具体的には、A列に値がある場合はその値をA列にコピーし、A列に値がなくB列に値がある場合はその値をA列にコピーし、B列に値がなくC列に値がある場合はその値をA列にコピーします。
- また、A列、B列、C列すべてに値がある場合はA列の値をA列にコピーします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
これから処理したい「csv」ファイルを、プログラムファイルにドラッグ&ドロップしてください(複数可)。 ドラッグ&ドロップしたファイルが、「abc.csv」なら、同じフォルダ内に「abc(Result).csv」という結果ファイルを作成します。 Option Explicit Dim a, cr, cv, f, i, j, n, wa, so, x Set so = CreateObject("Scripting.FileSystemObject") Set wa = WScript.Arguments For i = 0 to wa.Count - 1 If LCase(so.GetExtensionName(wa(i))) = "csv" Then f = so.GetParentFolderName(wa(i)) n = so.GetBaseName(wa(i)) Set cv = so.OpenTextFile(wa(i), 1) Set cr = so.OpenTextFile(f & "\" & n & "(Result).csv", 2, True) Do Until cv.AtEndOfStream a = Split(cv.ReadLine, ",") For j = 0 to UBound(a) If a(j) <> "" Then x = a(j) Exit For End If Next cr.WriteLine x & "," & Join(a, ",") Loop cv.Close cr.Close Set cv = Nothing Set cr = Nothing End If Next Set wa = Nothing Set so = Nothing MsgBox("Finished!") 簡単な説明です。 基本的には「vbs csv内の一部の値を連結」をお読みください。 For j = 0 to UBound(a) If a(j) <> "" Then x = a(j) Exit For End If Next ここだけが、違います。 「UBound()」は、配列変数の添え字(「()」内の数字)の最大値を返します。 すなわち「a(0) = "a"」、「a(1) = "b"」、「a(2) = "c"」なら、最大値は「2」ですので、「For i = 0 to 2」と記述しているのと同じです。 そして、配列変数に格納された値を1つずつ調べ、初めて空白でない値が見つかると、その値を「x」に入れておきます。 見つかり、それ以上調べてはいけないので、「Exit For」で、「For j = 0 to UBound(a) ~ Next」を抜け出しています。 cr.WriteLine x & "," & Join(a, ",") 「x」+「,」と、元々読み込んだ1行と同じもの(=「Join(a, ",")」)を結果ファイルに書き込んでいます。
その他の回答 (3)
- Prome_Lin
- ベストアンサー率42% (201/470)
申し訳ございません。 私の説明が悪かったです。 列「G」は、「7」列目です。 しかし、配列変数は「0」から始まるので、「0」からカウントしなければなりません。 すなわち、列「A」が「0」、列「B」が「1」、・・・列「G」は「6」です。 したがって、「For j = 4 to 6」にしてください。 これで、
- Prome_Lin
- ベストアンサー率42% (201/470)
必ず「G」列まで存在するのでしたら、全く問題ありません。 質問者の環境に合わせて、お使いください。
補足
度々、すみません。 先程のFor j = 5 to 7 と記述して実行した結果ですが、「インデックスが有効範囲にありません」とエラーが出てしまいます。出力結果に関しては問題ないと思われるのですが何が原因と考えられるでしょうか。
- imogasi
- ベストアンサー率27% (4737/17069)
ExcelVBAでもできるのに、なぜVBSでやるのか。 >可能でしたら というほどの課題じゃない。 >ご教示お願いいたします ここはコードを請け負うコーナーではないと思う。 どこまで質問者が、調べ、考えたかが問題(特に処理ロジック)。丸投げ質問になっている。 ーー VBSでやる場合は、、OPEN、CLOSE、READ,WRITEに当たる行は、VBSのステーツメント、コマンドに変えれば仕舞い。 Gogleで「VBS ファイル 入出力」で照会のこと。 http://neos21.hatenablog.com/entry/2016/03/13/195949 のような記事参照。 ーー SPLIT関数とJoin関数を活用させてもらった例。VBSでも使える。 Sub test01() Dim x As Variant Open "C:\Users\XXX\ドキュメント\Documents\質問例1.csv" For Input As #1 Open "C:\Users\XXX\ドキュメント\Documents\質問例1B.csv" For Output As #2 '--- While Not EOF(1) Line Input #1, s s = "," & s '先頭列を1 列追加に相当 x = Split(s, ",") '配列に展開 If x(1) = "" Then '2列目(元の1列目)が空白なら For i = 2 To UBound(x) If x(i) <> "" Then '非空白列まで順次探して x(0) = x(i) s = Join(x, ",") Exit For End If Next Else x(0) = x(1) s = Join(x, ",") End If Print #2, Join(x, ",") Wend '----- Close #1 Close #2 End Sub ーーー 結果 Excelシートで確認。A-D列 aaa@aaa.jp aaa@aaa.jp bbb@bbb.jp ccc@ccc.jp bbb@bbb.jp bbb@bbb.jp ccc@ccc.jp ccc@ccc.jp ccc@ccc.jp
お礼
ご回答ありがとうございます。 コードの読み取りが苦手な私ですが、 理解しやすかったです。 ありがとうございました。
補足
ご回答ありがとうございます。 勉強不足で恐縮なのですが、 UBoundのところで、G列からI列のみ対象とする場合はどのような記述になるでしょうか? 試しにFor j = 5 to 7 と記述して実行した結果、上手くいったように見えました。間違いはありますでしょうか? よろしくお願いいたします。