人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

エクセルのバッチ処理について教えてください。

同じ項目のcsvファイルが数千個あります。
すべてのファイルをHの列で単一化し指定のフォルダに保存しなおします。(ファイル名は元のファイル名と同じでOK)
単一化にはExcel2007の「重複削除」を使用しています。

これらの作業をバッチ処理する方法がございましたらご教授ください。

よろしくお願い致します。

●質問者: uluru5
●カテゴリ:コンピュータ
✍キーワード:CSV エクセル バッチ処理 ファイル フォルダ
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● きゃづみぃ
●20ポイント

バッチファイルでは 難しいですね。

以下のVBAで やってみたらいいでしょう。

なお 項目の1行目は 見出しとして扱ってます(重複チェックの対象外)

Sub main()
Dim p As String
'対象フォルダを指定してください。
'このフォルダに この実行用のブックは 入れないでください。

p = "C:\test\"

'処理対象となる拡張子を指定して 呼び出します。
Call jikkou(p, "csv")

End Sub



Sub jikkou(p As String, s As String)
f = Dir(p & "*." & s, vbNormal)

Do While f <> ""
 Set w = Workbooks.Open(Filename:=p & f, UpdateLinks:=False, ReadOnly:=False)
 
 With w.Sheets(1)
 .Columns("I:I").Insert Shift:=xlToRight
 .Columns("H:H").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range("I1"), Unique:=True
 .Columns("H:H").Delete Shift:=xlToLeft
 End With
 
 Application.DisplayAlerts = False
 w.Save
 w.Close
 Application.DisplayAlerts = True 
 f = Dir
Loop


End Sub

◎質問者からの返答

ありがとうございます!

しかし、これを実行する方法がわかりません。。。

なお、1行目に見出しはございません。

実行方法をご教授いただけると幸いです。

よろしくお願い致します。


2 ● fonya3
●20ポイント

答えになっていませんが、バッチ処理にExcelは不向きじゃないでしょうか?

Excel VBAでやろうとすると、フォアグラウンドの処理能力を占有してしまって

固まってしまうので、通常私はそのようなときはVBScriptかPerlなどでちょいと

書いて処理してます。VBScriptならVBAと同じように書けると思いますよ。

ファイルオブジェクトでフォルダを開く

中にあるCSVファイルを順番に開いて処理する

CSVファイルの先頭から一行ずつ読み込む

Hの列の値で連想配列が有効かチェックする

有効なら処理をパス

無効なら連想配列にセットして、結果書き出しようの変数に行データを入れる

ひとつのCSVファイルを読み終わったら、

元ファイルをリネーム

結果変数をファイルに書き出す

結果変数をクリアー

連想配列をクリアー

次のファイルを処理

処理が完了したらフォルダを閉じる


とか、こんな感じの処理のながれでしょうか。

すいませんが、ソースを書いてる時間が無いので、考え方だけです。

◎質問者からの返答

ありがとうございます。


3 ● きゃづみぃ
●20ポイント

http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_01_2007.html

マクロを何か記録してから そのソースと 以下のソースに置換してもらえればいいです。

見出しがないバージョンを作成しました。

Sub main()
Dim p As String
'対象フォルダを指定してください。
'このフォルダに この実行用のブックは 入れないでください。
p = "C:\test\"

'処理対象となる拡張子を指定して 呼び出します。
Call jikkou(p, "csv")

End Sub



Sub jikkou(p As String, s As String)
f = Dir(p & "*." & s, vbNormal)

Do While f <> ""
 Set w = Workbooks.Open(Filename:=p & f, UpdateLinks:=False, ReadOnly:=False)
 
 With w.Sheets(1)
 .Range("H1").Insert Shift:=xlDown
 .Range("H1") = "見出し"
 .Columns("I:I").Insert Shift:=xlToRight
 .Columns("H:H").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range("I1"), Unique:=True
 .Columns("H:H").Delete Shift:=xlToLeft
 .Range("H1").Delete Shift:=xlUp
 End With
 
 Application.DisplayAlerts = False
 w.Save
 w.Close
 
 f = Dir
Loop

<||
◎質問者からの返答

修正版ありがとうございました!

また、マクロの実行方法もありがとうございました。

しかし、何かしら作成したマクロは動くのですが、ソースを置き換えるとピクリともしません。。。

何か抜けている手順があるのでしょうか。

ソースを見る限り、マクロを実行すると「対象フォルダを指定してください。」というのが現れる感じですが、何も現れません。


4 ● a-kuma3
●20ポイント ベストアンサー

WSH から Excel を使ってあげれば、バッチ処理ができます。

' 対象のファイルが入っているディレクトリ
target_dir = "D:\test"

set fso = WScript.CreateObject("Scripting.FileSystemObject")
set folder = fso.GetFolder(target_dir)

set xlApp = CreateObject("Excel.Application")

for each file In folder.Files

 f = target_dir & "\" & file.Name
 WScript.Echo "--> " & f ' ファイル名をコンソールに出す (要らないか?)

 set xlBook = xlApp.Workbooks.Open(f)
 set xlSheet = xlBook.Sheets(1)

 ' A?H 列の範囲で、H 列で重複削除する
 xlSheet.Range("A:H").RemoveDuplicates 8, 2 '8: H列, 2: xlNo
 
 xlApp.DisplayAlerts = False
 xlBook.Save
 xlBook.Close
 xlApp.DisplayAlerts = True 

 set xlSheet = Nothing
 set xlBook = Nothing
next


set xlApp = Nothing

上記の内容を、convert.vbs というような名前のテキストファイルに保存しておいて、

コマンドプロンプトから、以下のように指定して実行。

d> cscript convert.vbs

格納先のディレクトリには、変換対象の CSV ファイルしか置いてないものとしています。

◎質問者からの返答

おおおおお!ありがとうごいます!!動きました!

ただ、1ファイルごとに「OK」を押さなければいけないのですが、そこを省くことはできますでしょうか?


5 ● a-kuma3
●20ポイント

ただ、1ファイルごとに「OK」を押さなければいけないのですが、そこを省くことはできますでしょうか?

あらっ、出さないようにしたつもりなんですけど。

一応、手元で動作させてみて、保存の問い合わせが出ないことは確認したんですけどね。


xlApp.DisplayAlerts = False

↑を入れることで、保存のときの問い合わせをしないようにしてます。

保存の前後で、True を設定してるのは、保存以外のときに、予期せぬ問い合わせを消してしまわないようにしてるつもりです。

そのままコピペしてると思うんですが、コードを確認してみてください。

◎質問者からの返答

ありがとうございます。

とりあえずやってみます。。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ