Excel VBAでWorksheetではなくユーザー定義のオブジェクトを取得する

最終更新日

Comments: 0

検証環境 Excel 2013

普通に考えたら単純なんですが地味にハマッたのでメモ。

例えばオブジェクト名”unko”のシート名”Sheet1″のシートがあった場合は、

ではなく

As Worksheet 抜きで取得してやると Worksheet オブジェクトではなく、ユーザー定義のunkoがオブジェクト取得できる。

このオブジェクトの場合、もちろんunko(Sheet1)に定義された関数や変数にアクセス可能。worksheetオブジェクトで取得するとアクセスできない。

  • unko(Sheet1)

以下のVBAを実行コード

出力

言い換えれば、Worksheets()や、ActiveSheet()など、Worksheetを取得する系の関数はユーザー定義のオブジェクトが返却されるので、変数にオブジェクトを入れる時だけ注意すれば良い。

unkoシートをコピーして使用することで、別インスタンスのオブジェクトとして生成されるためメンバ変数、関数を持ったクラスの用な使い方ができる。

出力

コピー時オブジェクト名は必ず重複しない名前となり、上記の例の場合、新規に作成したシートオブジェクト名は”unko1″となる。

また、オブジェクト名はObjectのメンバとして”CodeName”に設定されている。

出力

これを利用して、シートに配置しているボタンのマクロ等を動的に設定ができる。

シートにラベル”kuso_button”と設定したシート”Sheet1″を作成。

unko(Sheet1)に以下のVBA追加

以下のVBAを実行

“Sheet1(2)”シートが追加されるので、”Sheet1″、”Sheet1(2)”それぞれのボタンを押下すると以下のように出力される。

おわい

シェアする