d:\tempフォルダにファイルabc20040423.csvが一つあります。
これをFileSystemObjectを使って別のフォルダにコピーしようとして参照設定の
MicrosoftScriptingRuntimeをセットした上で以下のマクロを記述しました。
Sub File_Copy()
Dim myFSO As New FileSystemObject
myFSO.CopyFile "d:\temp\abc*.csv", "d:\vba_test\test_file.txt"
End Sub
しかし、実行すると「パスが見つかりません」と怒られます。
VBAのヘルプでFileSystemObjectのCopyFileの説明を見るとワイルドカードが使え
るように書いてあります。
試しにabc20040423.csvのようにファイル名をフルで記述すると思惑通り実行されま
す。
他に参照設定が必要なのでしょうか。
私の環境
Windows 2000 Pro SR4 Excel 2000 SP3
前村 眞一郎
"test_file.txt"はファイル名なのですかそれともフォルダ名なんでしょうか。
abc20040423.csvでうまくいくのは,abc20040423.csvをファイル名test_file.txtで
コピーしているからだと思います。ワイルドカードを使用した場合は,
test_file.txtをフォルダ名と解釈(でないと複数ファイルを同一名で上書きするこ
とになって意味がないためではないかと?)するためで,「パスが見つかりません」
と出るのだと思います。
目的の事がしたいのであれば,いったんフォルダにコピーして,名前変更で拡張子を
".txt"に変更する方法はどうでしょうか。
--
******************************
keizi kounoike
******************************
> 目的の事がしたいのであれば,いったんフォルダにコピーして,名前変更で拡張子
を
> ".txt"に変更する方法はどうでしょうか。
との事ですが、要するに私としては日々変化するabc年月日時分秒.csvというファイ
ルをマクロ実行の度に固定したファイル名(今回の場合test_file.txt)に上書き更
新したいのです。拡張子はcsvでも良いのですが。
勿論、上書き更新後はabc年月日時分秒.csvは削除するつもりです。
だから、どこかでワイルドカードを使う必要があると思われます。
もう少しうまい方法を試行してみます。
丁寧なご指摘ありがとうございました。
AccessでのDoCmdみたいなのが使えるとDosのバッチでも動かすのですが…
前村 眞一郎
それじゃ,例えば
Sub File_Copy()
Dim myFSO As New FileSystemObject
Dim fd As Folder
Dim fs As Files
Dim fl As File
myFSO.CopyFile "d:\temp\abc*.csv", "d:\vba_test"
Set fd = myFSO.GetFolder("d:\vba_test")
Set fs = fd.Files
For Each fl In fs
fl.Copy "d:\vba_test\filetest.txt"
fl.Name = WorksheetFunction.Substitute(fl.Name, ".csv", ".bak")
Next
End Sub
ではどうでしょうか。ただし,最新ファイルがfiletest.txtとしてコピーされる保証
はありませんが。(複数のファイルがあった場合,最後にコピーしたものになる。
フォルダd:\tempにファイルが常に1つなら保証されますが。)
上の場合,上書き更新後はabc年月日時分秒.csvは削除はせず,拡張子を".bak"に変
更して保存するようにしています。
> Sub File_Copy()
> Dim myFSO As New FileSystemObject
> Dim fd As Folder
> Dim fs As Files
> Dim fl As File
>
> myFSO.CopyFile "d:\temp\abc*.csv", "d:\vba_test"
> Set fd = myFSO.GetFolder("d:\vba_test")
> Set fs = fd.Files
> For Each fl In fs
> fl.Copy "d:\vba_test\filetest.txt"
> fl.Name = WorksheetFunction.Substitute(fl.Name, ".csv", ".bak")
> Next
>
> End Sub
>
> ではどうでしょうか。ただし,最新ファイルがfiletest.txtとしてコピーされる保
証
> はありませんが。(複数のファイルがあった場合,最後にコピーしたものになる。
> フォルダd:\tempにファイルが常に1つなら保証されますが。)
> 上の場合,上書き更新後はabc年月日時分秒.csvは削除はせず,拡張子を".bak"に
変
> 更して保存するようにしています。
教えていただいた方法で実現できました。
For Each文があることは知っていましたがこのような使い方があるとは気が付き
ませんでした。
ファイル一覧を取得するだけのものと思っていました。
もっと勉強が必要ですネ。
今回の例は今から作ろうとしているマクロのほんの入り口にしか過ぎませんがますま
す精進します。
でも、どうしてDOSコマンド(正確にはDODのバッチ起動)が使えるように準備
されないのでしょう。
やり方次第ではできるのかも知れませんが。
重ね重ねありがとうございました。
前村 眞一郎
Sub test1()
Shell ("c:\test.bat")
End Sub
http://www.gyako.mls.ad.jp/excel6.htm
Gyako
> Sub test1()
> Shell ("c:\test.bat")
> End Sub
> http://www.gyako.mls.ad.jp/excel6.htm
>
> Gyako
>
私の読んだ本では「shell関数は、拡張子がexeのファイルアプリケーションを起
動します。…」
と書いてあったので、てっきりDOSのバッチは実行できないと決め付けていまし
た。
やってみるもんですネ。
Gyakoさんどうもありがとうございました。
前村 眞一郎