2018年5月4日金曜日

CopyFileとFileCopy

VBAでファイルをコピーしたい。
でも、書き込み先が、ReadOnlyで開いていて書けないコトがある。
とゆー状況。
FileCopyステートメントを使ったら頻繁に実行時エラーが出てしまう。
on Error GoToでエラー処理するようcodingしてみた。
On Error GoTo ErrorHandlerSJ
    FileCopy source, destination
    Shell_Return = Shell(browser_exe, vbNormalFocus)
Exit Sub
ErrorHandlerSJ:
    MsgBox ("ErrorSJ")
Exit Sub
…なんか、美しくないな…( ゚-゚)~゚
やっぱりね、プロシージャの途中で終わるなんての、ダメだよね。
やっぱりね、返り値で成否を教えてくれないステートメントなんか使うのが
いけないよね。

そんなわけで、ちゃんと返り値で教えてくれる、おりこうさんな、
FileSystemObjectのCopyFileメソッドを使ってみた。
…実行時エラーでやがりましたorz
美しくないぜMicrosoft!

そんなわけで、
Dim FSO As FileSystemObject
Set FSO = New FileSystemObject
(中略)
On Error Resume Next
FSO.CopyFile source, destination
Select Case Err.Number
  Case 0
    Shell_Return = Shell(browser_exe, vbNormalFocus)
  Case Else
    MsgBox ("ErrorSJ:" & Err.Number)
End Select
こーなりました。
でも、入れ子になったりしたら、
On Error GoToですっ飛ばして終わりにしたほうがキレイなんだろうなぁ…

ちなみに、FileSystemObjectを使うには、参照設定に、Microsoft Scripting Runtimeが必要です。MSDNに書いてなくて探した探した(笑
もちろん、実行時バインディングすれば参照設定はいりません。

…ふと思ったんだけど、VBAの場合は実行時バインディングの方がいいんじゃなかろうか。
よほど多量じゃない限り、オーバーヘッドなんかたかが知れてるし、
違う環境(参照設定していないマシン)でも動くモノを~と考えると、
実行時バインディングの方が有利なんじゃないかと…

人様向けに作るときに改めて考えてみよう( ゚-゚)~゚


0 件のコメント:

コメントを投稿