Kの備忘録(仮)

Python、VBA、Excelを中心に記事を投稿

Excelライブラリを学ぶ

はじめに

しばらくブログを書いていなかったので、リハビリとして、2か月前に受けたVBA中級講座の第4回の「Excelライブラリ」の内容について、(リハビリで選ぶには、ハードな題材だけど・・・)一部まとめを書きます。

◆目次◆

VBAで出てくる用語のおさらい

まずはExcelライブラリと向き合うにあたって、出てくる用語の意味を調べなおします。

用語 意味
ライブラリ モジュールをまとめたもの
クラス クラスモジュールにオブジェクトとそのメンバーを定義したもの
モジュール 宣言ステートメントをまとめたもの
オブジェクト 操作対象のすべてのもの(セル、シート、ブック、グラフなど)
コレクション 同じ種類のオブジェクトをまとめたもの
メンバー コレクションの1つ1つのオブジェクトのこと
グローバル どこからでも同じように参照できるもの
(対義語は「ローカル」、あるいは「プライベート」)

これらをふまえて、Excelライブラリとは何かを確認します。

Excelライブラリとは

Excelライブラリの概要

Excelを操作するためのライブラリです。

Excel VBAでは初期状態で「Microsoft Excel 16.0 Object Library」が参照可能な状態になっています。

f:id:lbibouroku:20211120001229p:plain

Excelライブラリでは、Excelのさまざまなものが、クラスとして定義されています。

f:id:lbibouroku:20211120001242p:plain

このExcelライブラリを使ってVBAで操作することを「Excel VBA」といいます。

VBAではExcelを操作するときに、上位のオブジェクトから配下のオブジェクトをたどって操作対象のオブジェクトを取得します。

Excelライブラリの階層構造はこんな感じです。

Applecation
    |
    |- WorkSheets
        |
        |- Sheets
            |
            |- Range

Excelライブラリの参照

Excelライブラリはすべてクラスで構成されています。言い換えると、Excelライブラリはすべてオブジェクトモジュールでできています。

Excelライブラリには、取得するオブジェクト型と同名のプロパティ名が存在します。配下のオブジェクトを取得するには、以下のようにコードを書きます。

オブジェクト.プロパティ

でも、VBAで以下のようにコードを書いてもエラーにはならないですよね(上位オブジェクトが省略できます)。

Sub test1()
    Debug.Print Range("A1")
End Sub

本来であれば、Rangeオブジェクトを操作するには、Applecationクラスからたどるように、コードを書かないといけないはずです。

なぜエラーにならないのでしょうか。

それは、VBAでは「グローバルのメンバーは上位オブジェクトを省略できる」というルールがあるからです。

(すべてのメンバーを表示しきれていませんが)以下の赤枠内「<グローバル>のメンバー」は、上位オブジェクトを省略できます。

f:id:lbibouroku:20211120001257p:plain

以下のとおり、RangeはExcelライブラリのグローバルのメンバーです。

f:id:lbibouroku:20211120001313p:plain

上位オブジェクトを省略できたのは、こういう背景があったのですね。

上位オブジェクト省略時の注意事項

さて、Excelライブラリのグローバルのメンバーであれば、上位オブジェクトを省略できることはわかりました。

しかし、むやみに省略すると問題が発生する場合あります。大きな理由は以下の2点です。

  • モジュールによって省略の意味が変わるから(シートモジュールと標準モジュールでは結果が異なる場合がある)
  • ユーザー操作の干渉を受けるから(ユーザーが選択しているオブジェクトによって結果が異なる場合がある)

さいごに

Excelライブラリについて、講座の内容をひとつずつかみ砕きながら解き進めました。今回の肝はここでした。

それは、VBAでは「グローバルのメンバーは上位オブジェクトを省略できる」というルールがあるからです。

実は、講座では続きがあって、「既定のメンバー」について解説を受けました。

が、長くなるので、それはまた別の機会に書きます(そのときは_Defaultプロパティについて書くのか、大変だなあ・・・)。