ドラッグ&ドロップしたファイルと同じフォルダに、いったん、「Dummy.csv」ファイルを作成し、そこに結果を書き込み、最後に元ファイルを削除して、「Dummy.csv」ファイルを元ファイルと同じファイル名にしています。
Option Explicit
Dim a, cv, dm, f, i, m, n, so, wa
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))
Set cv = so.OpenTextFile(wa(i), 1)
Set dm = so.OpenTextFile(f & "\Dummy.csv", 2, True)
Do Until cv.AtEndOfStream
a = Split(cv.ReadLine, ",")
If a(1) = "" Then
a(1) = "新規"
End If
dm.WriteLine Join(a, ",")
Loop
cv.Close
dm.Close
Set cv = Nothing
Set dm = Nothing
n = so.GetFileName(wa(i))
so.DeleteFile wa(i), True
Set m = so.GetFile(f & "\Dummy.csv")
m.Name = n
End If
Next
Set wa = Nothing
Set so = Nothing
MsgBox("Finished!")
簡単な説明です。
Option Explicit
「厳密に」とか「明確に」というような意味で、このオプションを設定すると、変数は、その使用の前に、必ず、「Dim」等によって宣言しておかなければなりません。
Set so = CreateObject("Scripting.FileSystemObject")
ファイルやフォルダ、テキストファイルを扱う「Windows」の機能を読み込んでいます。
Set wa = WScript.Arguments
ドラッグ&ドロップされるのを待っています。
For i = 0 to wa.Count - 1
ドラッグ&ドロップされたファイルの数だけ処理。
If LCase(so.GetExtensionName(wa(i))) = "csv" Then
「LCase()」は、英字を小文字にしますので、「Csv」や「CSV」も「csv」になります。
「so.GetExtensionName()」は「Scripting.FileSystemObject」の機能を使って(頭の「so.」)、拡張子を取得します。
したがって、ここは「もし拡張子がcsvなら」となります。
f = so.GetParentFolderName(wa(i))
ドラッグ&ドロップされたファイルが存在するフォルダを調べています。
Set cv = so.OpenTextFile(wa(i), 1)
「読み込み専用」(=「1」)で開いています。
Set dm = so.OpenTextFile(f & "\Dummy.csv", 2, True)
同じフォルダ内に「Dummy.csv」ファイルを、「書き込み専用」(=「2」)で、「新規作成を許可」(=「True」)しています。
Do Until cv.AtEndOfStream
ファイルの終端まで処理。
a = Split(cv.ReadLine, ",")
1行読み込み、区切り記号を使って配列変数に格納しています。
「Split()」は、配列変数に格納する関数です。
今回は「csv」ファイルということで、区切り記号は「,」ですから「Split(x, ",")」というように「,」を区切り記号として読み込みます。
そして、読み込んだ1行が、たとえば「a,b,c」の場合、「a(0) = "a"」、「a(1) = "b"」、「a(2) = "c"」となります。
If a(1) = "" Then
a(1) = "新規"
End If
2番目の項目が「空白」なら2番目の中身を「新規」にしています。
dm.WriteLine Join(a, ",")
「Dummy.csv」に書き出していますが、「Join()」は、「Split()」と逆のことをします。
すなわち「a(0) = "a"」、「a(1) = "b"」、「a(2) = "c"」なら「Join(a, ",")」で、「a,b,c」とします。
Loop
を、ファイルの終端まで繰り返しています。
cv.Close
dm.Close
Set cv = Nothing
Set dm = Nothing
両ファイルを閉じています。
n = so.GetFileName(wa(i))
ドラッグ&ドロップされた方のファイルのファイル名を調べています。
so.DeleteFile wa(i), True
削除しています。
Set m = so.GetFile(f & "\Dummy.csv")
「Dummy.csv」ファイルのファイル名を変更するためにファイルをゲット(「取得」)しています。
m.Name = n
ファイル名を、元のドラッグ&ドロップされたファイルと同じにしています。
End If
Next
を、ドラッグ&ドロップされたファイルの数だけ繰り返しています。
Set wa = Nothing
Set so = Nothing
「Set ~」で使った変数は、その使用後「Nothing」で解放しておきます。
MsgBox("Finished!")
いつ終わったか、分かりにくいので、最後に「Finished!」と表示しています。
お礼
何回もご回答していただき、お手数をかけしました。ご教示頂きました最新のコードのお陰でうまくいきました。 ありがとうございました!