2018年5月4日金曜日

CopyFileとFileCopy

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

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

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

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

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

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


0 件のコメント:

コメントを投稿