Workbook Object - Excel 97

Workbook
Excel
VBA
Tips to handle Workbook Objects using Excel VBA.
本文を折り畳む 本文を開く

はじめに

今回のテーマは、Workbook Object の操作です。前回扱った Worksheet Object の親玉にあたり、xls ファイルと一対一で対応する単位になります。

実例

Workbook の追加と破棄

  1. 新規ワークブックを追加するには、Workbooks Collection に対して、Add を指示します。このメソッドは、新規追加された Workbook Object を返します。
    Sub Workbook1()
        Dim wb As Workbook
        Set wb = Workbooks.Add
        MsgBox wb.Name, vbOKOnly, wb.FullName
    End Sub
    
  2. template ファイルを指定して、新規ワークブックを追加するには、Add メソッドの引数に template ファイル名称を指定します。
    Sub Workbook1B()
        Dim wb As Workbook
        Set wb = Workbooks.Add("C:\usr\VBA\temp.xls")
        MsgBox wb.Name, vbOKOnly, wb.FullName
    End Sub
    
  3. すべてのワークブックを一気に閉じるには、 Workbooks Collection の Close メソッドを用います。ただし、このメソッドは、保存を確認するダイアログをユーザーに提示し、ユーザーがキャンセルボタンを押した場合にはエラーを返します。
    Sub Workbook2()
        Workbooks.Close
    End Sub
    
  4. 一つのワークブックを閉じるには、 Workbook Object の Close メソッドを用います。このメソッドは、保存を確認するダイアログをユーザーに提示し、ユーザーがキャンセルボタンを押した場合にも、エラーを返しません。
    Sub Workbook3()
        ActiveWorkbook.Close
    End Sub
    
  5. 保存確認のダイアログを出さずに Close メソッドを用いたい場合には、引数 SaveChanges に必要な値を指定します。ワークブックを保存せず、破棄する場合には SaveChanges:=False を指定します。
    Sub Workbook4()
        ActiveWorkbook.Close SaveChanges:=False
    End Sub
    
    Workbook Object は、ディスク上に実体のあるファイルと対応するため、削除という概念はありません。「閉じて」メモリから開放すれば Excel の仕事は終わりで、ハードディスク上の実体ファイルを消すとかどうとかは、シェルが担当する分野になるからです。
  6. 保存確認のダイアログを出さずに Close メソッドを用いたい場合には、引数 SaveChanges に必要な値を指定します。ワークブックを保存する場合には SaveChanges:=True を指定します。一度も保存していないブックの場合には、引数 FileName も与える必要があります。
    Sub Workbook4B()
        ActiveWorkbook.Close SaveChanges:=True, 
                             FileName:="C:\usr\VBA\temp.xls"
    End Sub
    

ファイルを開く

  1. ファイル名を指定して、ワークブックを開くには、 Workbooks Collection の Open メソッドを用います。このメソッドは、開いた Workbook Object を返します。
    Sub Workbook5()
        Dim wb As Workbook
        Set wb = Workbooks.Open("C:\usr\VBA\temp.xls")
        MsgBox wb.Name, vbOKOnly, wb.FullName
    End Sub
    
  2. テキストファイルを、ワークブックとして開くには、 Workbooks Collection の OpenText メソッドを用います。引数 FileName だけを指定した場合には、拡張子に応じて動作が変わります。デフォルトは単一列への読み込みを行いますが、.csv のファイルの場合には、カンマ区切りとみなして読み込みます。
    Sub Workbook6()
        Workbooks.OpenText FileName:="C:\usr\VBA\temp.csv"
    End Sub
    
    OpenText メソッドは多数の引数を持ち、テキストファイルウィザードが持つ機能をすべて利用できます。これを上手に利用すれば、テキストファイルの取り扱いに際して、強力な武器になります。 Workbooks.OpenText の詳細についての解説と、簡易版ウィザードをこちらに用意しました。

ファイルに保存する

  1. ワークブックを保存するには、 Workbook Object の Save メソッドを用います。ファイル名は固定で、一度も保存していないブックも、現在の名称のままで、カレントディレクトリに保存されます。
    Sub Workbook8()
        ActiveWorkbook.Save
    End Sub
    
  2. Workbook Object の SaveAs メソッドは、 Save メソッドと同じ働きも持っています。引数を何も指定しなければ、ファイル名固定のままで保存されます。
    Sub Workbook9()
        ActiveWorkbook.SaveAs
    End Sub
    
  3. Workbook Object の SaveAs メソッドに、引数 FileName を指定すれば、指定したファイル名で保存できます。
    Sub Workbook10()
        ActiveWorkbook.SaveAs FileName:="C:\usr\VBA\temp.xls"
    End Sub
    
  4. Workbook Object の SaveCopyAs メソッドは、引数 FileName にファイル名を指定して、複製を保存します。 SaveAs メソッドと違い、現在開いているブックの状況に影響しません。たとえば、 Saved プロパティも、保存前の状態から変化しません。
    Sub Workbook11()
        ActiveWorkbook.SaveCopyAs FileName:="C:\usr\VBA\temp.xls"
    End Sub
    
  5. ワークブックの保存状態を知るには、 Workbook Object の Saved プロパティを利用します。新たに保存すべき情報が何も無い時、この値は True を示し、それ以外のときには False を示します。
    Sub Workbook12()
        If (ActiveWorkbook.Saved) Then
            MsgBox "このワークブックは、前回保存された後、何も変更されていません。", 
                    vbOKOnly, ActiveWorkbook.Name
        Else
            MsgBox "このワークブックには、保存されていないデータがあります。", 
                    vbOKOnly, ActiveWorkbook.Name
        End If
    End Sub
    

Workbook に関する、その他の操作

  1. Workbook Object の Activate メソッドは、対象となる Workbook を Active に切り替えます。この例題は、一定間隔を置きながら、Active な Workbook を順次切り替えていきます。
    Sub Workbook14()
        Dim wb As Workbook
        For Each wb In Workbooks
            wb.Activate
            Application.Wait Now() + 1 / 24 / 3600
        Next wb
    End Sub
    

小噺

Workbook を特定する、いくつかの方法

数多くの Workbook Object の中から、目的の Workbook を選び出す方法は、いくつかあります。
用例解説
ActiveWorkbookActive になっている Workbook Object を特定する。
ActiveSheet.ParentActiveSheet の上位 Object として指定する。
ActiveWindow.ParentActiveWindow の上位 Object として指定する。
ThisWorkbook実行中の VBA コードの箱として特定する。
Workbooks(1)Workbooks Collection の item 順位を利用する。1から始まる連番を指定する。
Workbooks.Item(1)Workbooks Collection の item 順位を利用する。上の方法の丁寧な表現。*1
Workbooks("Book3")Workbooks Collection に対して、Workbook Object の Name プロパティを与える。
Windows(1).ParentWindows Collection の item 順位を利用する。1から始まる連番を指定する。
Workbooks.Item(1).ParentWindows Collection の item 順位を利用する。上の方法の丁寧な表現。*2
Windows("Book5.xls").ParentWindows Collection に対して、Window Object の Caption プロパティを与える。
  1. Workbooks Collection の Item 数は、Count プロパティで取得できます。
  2. Windows Collection の Item 数は、Count プロパティで取得できます。

ActiveWorkbook と ThisWorkbook

Workbook Object を、単独で指定できる便利なキーワードが、 ActiveWorkbook と ThisWorkbook です。これらを上手に使い分けるだけで、たいがいの局面では、必要な Workbook Object を素早く特定できます。ActiveWrokbook は、Excel 上で表面に出ているブックを指しますから、時々に応じて変化するものです。ユーザーにとって、目の前にあるものが操作(マクロ実行)の対象になるという感覚は、もっとも受け入れやすいものであるため、ActiveWorkbook は最も重宝します。一方、一時的な作業シートといったような、ユーザーと無関係なプログラム上の都合で利用する場合には、ユーザーの操作に左右されない、固定のワークブックが便利です。こういった時に、ThisWorkbook の利用が向いています。これは、 VBA コードが埋め込まれている Workbook Object を返します。つまり、me や this のような、自分自身を指すキーワードです。

名前に関するいくつかのこと

標準で利用する名称は、Workbook Object なら Name 、 Window Object なら Caption です。これらは、Excel 内でユニークになるように設計されており、各々の Collection から、単一の Object を特定する際のキーワードとして利用できます。 Worksheet Object の時とは異なり、 Workbook Object の CodeName プロパティは、ほとんど役に立ちません。ActiveWorkbook.CodeName は、常に "ThisWorkbook" という名称を返します。これは、設計時にプロジェクトエクスプローラ上のプロパティを利用して、他の名称に変更できますが、それが画期的に役に立つものでは無さそうです。
ブックを新規作成した時、 FullName プロパティは、Name プロパティに一致します。Path はブランクとなっています。これらは、ファイルを保存した時に、然るべき値に設定され、個別に変更することはできません。新規作成時に template file を利用した場合には、そのファイル名に連番の数値を与えたものが、自動的に作られる Name プロパティの値になります。

Workbooks Collection と Windows Collection

Workbooks Collection と Windows Collection とは、時に並立する立場であり、時には親子関係になります。Application.Windows は、開いているすべての Window を示すため、Workbooks Collection と似通った集合体ですが、Workbooks(2).Windows とした場合には、単一の Workbook Object に所属する Windows Collection の集合体となります。Workbook(2).Windows.Count は、同じブックで複数 Window を開かない限り 1 です。Workbook(2).Windows Collection は、Application.Windows Collection の部分集合になります。

上位 Object

Workbook Object の上位 Object は、Application Object です。これは、Excel そのものを指しています。次のように、Parent プロパティを使って、Excel Application Object を示すことができます。
ThisWorkbook.Parent
上の表現は、Application と同じものを返します。

Download a Sample Code

上記の解説で用いたサンプルコードは、以下のリンクからダウンロードできます。テキストファイルとして用意しているので、保存して Excel の Visual Basic Editor にインポートしてください。
  1. Save a program source (sample-vbaxlwb1-1.bas) on your local disk.
  2. Start Microsoft Excel with a blank(new) book.
  3. Open the Visual Basic Editor. (Tool/Macro/Visual Basic Editor)
  4. Import the downloaded program source. (File/Import Files)

History

2002/3/24
URL移転
2001/2/13
Workbook.OpenText という誤植を Workbooks.OpenText に修正。
2001/2/12
sample-vbaxlwb1-1.bas put
2001/2/12
初版
本文を折り畳む back to home index of VBA