Excel VBAからエクセルファイル(ブック)を扱う方法です。
オブジェクト
Workbookオブジェクト
がブックを表しています。
このオブジェクトを管理しているのがWorkbooksオブジェクト
です。
単語の最後にs
が付いただけです。Workbookの複数形です。
管理しているといいましたが、いわゆるコンテナです。
開いているブック全てが格納されています。
これから開くブックに対してもこのオブジェクトから呼び出します。
特別なブック
上記のWorkbooksオブジェクトを使わずにアクセスできるブックがあります。
まず、VBA(実行しているマクロ)が入っているブックで、ThisWorkbook
で表します。
もう一つ、アクティブになっているブックをActiveWorkbook
で表すことができます。
ThisWorkbook.Path
でパスが取得できます(基点となるのでよく使います)。
ThisWorkbook.Name
でファイル名が取得できます(まぁ、使いませんけど)。
ActiveWorkbookはあまり使いません。明記していない場合はActiveWorkbookが補完されることが理由の一つ、さらに、Excelでは新たに開いたブックが自動でActiveWorkbookになってしまうことから、実行環境によって意図しない結果になる可能性があるからです。
ブックを開く
Workbooks(Workbookの管理者)に.Add
や.Open
メソッドを使ってブックを開きます。
これらのメソッドは開いたブックオブジェクト
を返すので、set + 変数 =
で受け取ります。
新規ブック
Dim wb As Workbook
Set wb = Workbooks.Add
既存のブック
既存のブックを開くにはパスが必要です。
Dim wb As Workbook
Set wb = Workbooks.Open(Filename:=パス)
パスは相対パスでも絶対パスでも使うことができます。
名前を付けて保存
SaveAs
メソッドを使います。引数にパス(ファイル名)を指定します。
wb.SaveAs Filename:=パス
閉じる
Close
メソッドを使います。
個人的にはsavechanges:=false
を付けることが多いです(ほぼ全て)。
この引数は「変更あるけど保存しなくていいの?」というエクセルからのメッセージを出さないようにするものです。
事前に保存していれば問題ありません。
wb.Close savechanges:=False
小技
開く速度を上げる
エクセルはブックを開いた際、いろいろなことをやっているようです。
再計算してみたり、画面描写を計算したり。
ブックを開く速さはブックの容量によっても変わります。
出来るだけ早くする方法がいくつかあります。
- 画面描写を止める
- イベントを止める
- 再計算を止める
' 止める
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
' ここに処理を記述
' 元に戻す
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.ScreenUpdating = True
場合によっては再計算が必要なときもあります。
イベントのことはついつい忘れてしまいます。
なのでマクロが動いているのを見る必要がなければ画面描写(ScreenUpdating)を止めるだけでかなり速くなります。
ReadOnlyを付けて少しだけ速く開く、そして安心感を得る
読み込み専用で開くことで、ほんの少し早く開けるようです。
また、データを変更してしまったかもしれないという不安を除いてくれます。
Openメソッドの引数にReadOnly:=Trueを追加します。
Set wb = Workbooks.open(Filename:=パス, ReadOnly:=True)
おわり
流れとしては、実行ファイル(ThisWorkbook)は手動で開きます。
以降はマクロで、データを保管するファイルを開き(Addで作る)、
データの元が入っているファイルも開いて、保管ファイルにデータを移したりします。
元ファイルが複数ある場合は、処理済みのファイルは閉じてから、新しいファイルを開きます。
なので同時に開いているのは3ファイルということになります。
ただ、数千ファイルを連続で開いて~閉じて~、 開いて~閉じて~とやっていくと、挙動がおかしくなることがあります。
私の経験では5,000ファイルを超えるとアクティベートが変わったり、すごく時間がかかったりします。
面倒ですが、2,000ファイル位に分割して処理することをおすすめします。