- ベストアンサー
VBAでXCOPYの実行結果を取得する方法
- VBAのshell関数を利用してXCOPYを実行し、ファイルのコピー結果を取得する方法をまとめました。
- 実行結果に表示されるファイルのコピーに失敗したファイル名のみを取得することは可能でしょうか?
- 検索しても答えが見つからず、わからないという方に対して、XCOPYの実行結果から失敗したファイル名を取得する方法を教えていただきたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ええと、テキストファイル中のファイル名を取り出す方法ですよね? ファイル名に「-」を含んだ物がないと言う前提ですが、テキストファイルをExcelで開いて、データの区切り位置を「-」にするとB列にコピーできなかったファイル名が出ますがそれでは駄目ですか? マクロでやるなら↓こんな感じでしょうか。 取り出したファイル名をSheet1のA列に貼り付けてます。 Sub Sample() Workbooks.OpenText Filename:="C:\log.txt", Other:=True, OtherChar:="-" Columns("B:B").Copy ThisWorkbook.Activate Sheets("Sheet1").Columns("A:A").Select ActiveSheet.Paste Application.CutCopyMode = False Windows("log.txt").Close End Sub ファイルにアクセス出来ない為にコピーに失敗した場合などは別の内容になりますので、違う方法が必要になります。
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 例えば、Dir関数 で、コピー先を調べるという方法は、思いつくのかもしれませんが、こちらで試してみると、一旦、Shell の子プロに出てxcopy を実行するので、そのスピードとはマッチしないので、コピーが成功しても、誤認識して、ファイルが見当たらないと出てしまいました。 以下のように、コマンドプロンプトの 戻り値(ErrorLevel) を取る方法はあります。 命令 ="xcopy D:\test\ssss.txt D:\test2" ExecCmd 命令, Ret MsgBox Ret '-------------------------------- Function ExecCmd(sCmd As String, Ret As String) _ As Boolean Dim objShell As Object Dim objExec As Object Set objShell = CreateObject("WScript.Shell") Set objExec = objShell.Exec("%ComSpec% /c " & sCmd) Do Until objExec.Status: DoEvents: Loop If Not objExec.StdErr.AtEndOfStream Then ExecCmd = True Ret = objExec.StdErr.ReadAll ElseIf Not objExec.StdOut.AtEndOfStream Then Ret = objExec.StdOut.ReadAll End If Set objExec = Nothing Set objShell = Nothing End Function ただ、こういう方法は、VB/VBAの範囲ではありません。 VB なら、FileCopy などがありますから、それを使えばよいと思います。
お礼
確かに、FileCopy を利用すれば、簡単に結果を取得することも出来ますね。。 ご提示いただいた内容で一度試して見ます。 ひとまず、お礼まで。 ありがとうございました。
- F_PAPA
- ベストアンサー率40% (8/20)
>D:\>xcopy D:\test\ssss.txt D:\test2 >ファイルが見つかりません - ssss.txt >0 個のファイルをコピーしました では、ssss.text が見つからないので「0個」と表示されているのですよね? ということは、「ない」ファイル名を取得することは出来ないのではないでしょうか?
お礼
ありがとうございます。 大変参考になりました。確かにコピーできなかったファイル名には区切り文字"-"があります。気づかなかった・・・。 この方法で試してみます。 ありがとうございました。