wrote :: 2001.12.05

トップページ > Excel > VBA > 講座:ファイルの操作 > 作業用ブックを開く


作業用ブックを開く

さて、ブックを開いたり閉じたりするケースは意外と多いものです。ここでは、ユーザーに内緒でこっそりブックを利用する方法をご紹介しましょう。といっても、難しいことはないんですけどね……

まず押さえておきたいポイントは「ブックを開くと、開いたブックがアクティブになる」ということです。ユーザーに内緒でブックを開きたいのに、そのブックが見えてしまってはいけません。そこで、開いたブックが見えないように画面の表示を止めます。内緒のブックを開いたら元のブックをアクティブにしてから画面を更新します。

Sub Sample16()
    Application.ScreenUpdating = False
    Workbooks.Open "D:\Book2.xls"
    Workbooks(1).Activate
    Application.ScreenUpdating = True
End Sub

画面の更新を抑止するのは ScreenUpdating プロパティです。このプロパティもプロシージャが終了すると自動的に True がセットされるのですが、予期せぬトラブルを避けるためにも明示的に True を設定した方がいいでしょう。

さて、Book2.xls を開いた後で元のブックを表示しているのですが、Workbooks(1).Activate というのは美しくありません。これは 1 番目の Workbook オブジェクトを指し示しているだけで、決して「元のブック」と決まっている訳ではないからです。より安全なマクロを目指すなら Book2.xls を開く前に、現在開いているブックを記憶しておきましょう。

Sub Sample17()
    Dim ReturnBook As Workbook, TargetBook As Workbook
    Set ReturnBook = ActiveWorkbook
    Application.ScreenUpdating = False
    Set TargetBook = Workbooks.Open("D:\Book2.xls")
    ReturnBook.Activate
    Application.ScreenUpdating = True
End Sub

ここでは、ReturnBook というブック型のオブジェクト変数を宣言しました。Book2.xls を開く前のアクティブブックを変数 ReturnBook に格納します。この ReturnBook はオブジェクト型の変数ですから、格納されるのはアクティブブックのそのものであり、アクティブブックの名前ではありませんので注意してください。

ついでに TargetBook という変数も使いました。どうせ開いた Book2.xls を後で使うのですから変数に入れておいた方が便利だからです。実は Open メソッドには開いたブックを返すという性質があります。このように返り値を使う場合には Open メソッドの引数を括弧でくくらなければなりません。

さて、内緒で開いたブックは、やはり内緒で閉じなければなりません。この際「変更を保存しますか?」などというマヌケな確認メッセージを表示してはいけません。内緒で開いたブックに対してどんな編集を行ったにせよ、閉じる前に Saved プロパティを操作して確認メッセージを抑止しましょう。

Sub Sample18()
    Dim ReturnBook As Workbook, TargetBook As Workbook
    Set ReturnBook = ActiveWorkbook
    Application.ScreenUpdating = False
    Set TargetBook = Workbooks.Open("D:\Book2.xls")
    ReturnBook.Activate
    Application.ScreenUpdating = True
    
    ''ここで Book2.xls に編集を加える
    
    TargetBook.Saved = True
    TargetBook.Close
End Sub

■一時ファイルの使い方

既存のブックを開くのではなく、途中の計算やテンポラリな作業領域として一時的なブックを使いたい場合もあります。ただ使うだけならよいのですが、その一時ファイルをディスクに保存するときには工夫が必要です。次のサンプルは、新しいブックを作成しランダムな名前を付けて保存して閉じます。

Sub Sample20()
    Dim TargetFile As Workbook
    Set TargetFile = Workbooks.Add
    With TargetFile
        .Worksheets(1).Range("A1") = Now()
        .Saved = True
        .SaveAs Filename:=Int(Rnd * 100000) & ".xls"
        .Close
    End With
End Sub

確認のために画面の更新は抑止していません。まず、新規ブックを格納するオブジェクト変数 TargetFile を宣言します。次に Workbooks.Add で新規ブックを作成します。ここでは、仮の作業として新規ブックのセル A1 に日付と時刻を代入しています。さあ問題はここからです。この一時ファイルを仮の名前で保存するのですが、ここでは Rnd 関数で発生させた乱数をファイル名として保存しています。なぜなら、Book1.xls では、もしかするとそこに同名のファイルが存在するかもしれないからです。

Sample20 を実行した結果、私の環境ではカレントフォルダに 70554.xls というファイル名で保存されました。70554 の部分が Rnd 関数で得られた乱数です。しかし、本当にこれでいいのでしょうか?そのフォルダに 70554.xls というファイルが存在しないと誰が断言できるのでしょう?「それなら、まず 70554.xls が存在するかどうかを DIR 関数で調べて……」なるほど、その手もありますね。では、もし存在したら?また乱数を生成するんですよね。しかし、そのファイル名が使われていないと誰が断言……(以下、繰り返し)

「乱数を生成する」と「DIR 関数で存在を調べる」を、Do Loop などでループさせて存在しないファイル名が生成されるまで繰り返す方法もあります。一般的に考えると、数回の乱数で終わるでしょう。では、保存するフォルダはどこにします?カレントフォルダ?カレントフォルダがフロッピーディスクだったら?書き込み禁止だったら?マイドキュメントにしますか?My Documents フォルダが必ず存在すると誰が断言できますか?

キリがありませんね。なるべく安全確実な一時ファイルを作成しようとすると、このように不眠症になってしまうんです。そこで、FileSystemObject オブジェクトを使って間違いのない一時ファイルを使う方法をご紹介しましょう。ただし、FileSystemObject オブジェクトは Office 2000 で追加されたオブジェクトです。Excel 95/97 で使用できませんのでご了承ください。

FileSystemObject オブジェクトは、ディスクやフォルダを 1 つのオブジェクトとして操作できます。フォルダ内の全サブフォルダを取得したり、フロッピーディスクが挿入されているかどうかを調べたり、使いこなせるとかなり強力な武器になります。ここでは、Windows が使用している一時フォルダを調べて、そこにランダムな名前のファイルとして保存します。FileSystemObject オブジェクトの詳しい使い方は「FileSystemObject オブジェクトとは」をご覧ください。

Sub Sample21()
    Dim TargetFile As Workbook
    Dim tmpFolder As String, tmpName As String
    With CreateObject("Scripting.FileSystemObject")
        tmpFolder = .GetSpecialFolder(2)
        tmpName = .GetTempName
    End With
    MsgBox tmpFolder & "に" & vbCrLf & tmpName & "を作成します。", vbInformation

    Set TargetFile = Workbooks.Add
    With TargetFile
        .Worksheets(1).Range("A1") = Now()
        .Saved = True
        .SaveAs Filename:=tmpFolder & "\" & tmpName & ".xls"
        .Close
    End With
End Sub



FileSystemObject オブジェクトGetSpecialFolder メソッドは引数に数字を指定することで Windows が使用している特別なフォルダを取得することができます。

0  Windows がインストールされているフォルダ
1  システムファイルが格納されているフォルダ
2  一時ファイルを格納するフォルダ


GetTempName メソッドは実行するたびに異なる名前のランダムファイルを生成します。実は、GetTempName メソッドで生成されるファイル名には「.tmp」と拡張子が付けられています。しかし、SaveAs メソッドで明示的にファイルのタイプを指定しない限り、Excel のブック形式で保存されますので心配はいりません。


[ブックの一覧を取得する]戻る← | →進む[ファイルの存在を調べる]