Google グループは Usenet の新規の投稿と購読のサポートを終了しました。過去のコンテンツは引き続き閲覧できます。
表示しない

ファイル名にワイルドカードが使えない

閲覧: 119 回
最初の未読メッセージにスキップ

前村眞一郎

未読、
2004/04/22 19:32:442004/04/22
To:
挙動が理解できませんのでどちら様かお教えください。

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

前村 眞一郎

koun...@mbh.nifty.com

未読、
2004/04/23 0:05:582004/04/23
To:
"前村眞一郎" <shin1...@yahoo.co.jp> wrote in message
news:c69mm5$6od$1...@localhost.localdomain...

>
> Sub File_Copy()
> Dim myFSO As New FileSystemObject
> myFSO.CopyFile "d:\temp\abc*.csv", "d:\vba_test\test_file.txt"
> End Sub
>
> しかし、実行すると「パスが見つかりません」と怒られます。
>
> 試しにabc20040423.csvのようにファイル名をフルで記述すると思惑通り実行され

> す。

"test_file.txt"はファイル名なのですかそれともフォルダ名なんでしょうか。
abc20040423.csvでうまくいくのは,abc20040423.csvをファイル名test_file.txtで
コピーしているからだと思います。ワイルドカードを使用した場合は,
test_file.txtをフォルダ名と解釈(でないと複数ファイルを同一名で上書きするこ
とになって意味がないためではないかと?)するためで,「パスが見つかりません」
と出るのだと思います。

目的の事がしたいのであれば,いったんフォルダにコピーして,名前変更で拡張子を
".txt"に変更する方法はどうでしょうか。

--
******************************
keizi kounoike
******************************

前村眞一郎

未読、
2004/04/23 4:36:112004/04/23
To:
ご回答ありがとうございます。

> 目的の事がしたいのであれば,いったんフォルダにコピーして,名前変更で拡張子

> ".txt"に変更する方法はどうでしょうか。

との事ですが、要するに私としては日々変化するabc年月日時分秒.csvというファイ
ルをマクロ実行の度に固定したファイル名(今回の場合test_file.txt)に上書き更
新したいのです。拡張子はcsvでも良いのですが。
勿論、上書き更新後はabc年月日時分秒.csvは削除するつもりです。
だから、どこかでワイルドカードを使う必要があると思われます。
もう少しうまい方法を試行してみます。

丁寧なご指摘ありがとうございました。
AccessでのDoCmdみたいなのが使えるとDosのバッチでも動かすのですが…

前村 眞一郎

koun...@mbh.nifty.com

未読、
2004/04/23 7:40:482004/04/23
To:
"前村眞一郎" <shin1...@yahoo.co.jp> wrote in message
news:c6amh0$qif$1...@localhost.localdomain...
> との事ですが、要するに私としては日々変化するabc年月日時分秒.csvというファ

> ルをマクロ実行の度に固定したファイル名(今回の場合test_file.txt)に上書き


> 新したいのです。拡張子はcsvでも良いのですが。
> 勿論、上書き更新後はabc年月日時分秒.csvは削除するつもりです。
> だから、どこかでワイルドカードを使う必要があると思われます。

それじゃ,例えば

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"に変
更して保存するようにしています。

前村

未読、
2004/04/23 9:59:432004/04/23
To:
何度もお手数をおかけします。

> 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のバッチ起動)が使えるように準備
されないのでしょう。
やり方次第ではできるのかも知れませんが。
重ね重ねありがとうございました。

前村 眞一郎

Gyako

未読、
2004/04/23 17:01:172004/04/23
To:
> でも、どうしてDOSコマンド(正確にはDODのバッチ起動)が使えるように準

> されないのでしょう。

Sub test1()
Shell ("c:\test.bat")
End Sub
http://www.gyako.mls.ad.jp/excel6.htm

Gyako

前村眞一郎

未読、
2004/04/23 23:04:442004/04/23
To:
なるほどですネ。

> Sub test1()
> Shell ("c:\test.bat")
> End Sub
> http://www.gyako.mls.ad.jp/excel6.htm
>
> Gyako
>

私の読んだ本では「shell関数は、拡張子がexeのファイルアプリケーションを起
動します。…」
と書いてあったので、てっきりDOSのバッチは実行できないと決め付けていまし
た。

やってみるもんですネ。

Gyakoさんどうもありがとうございました。

前村 眞一郎

新着メール 0 件