ExcelマクロVBA技術解説 | VBAのクラスとは(Class,Property,Get,Let,Set) | ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説



最終更新日:2018-08-28

VBAのクラスとは(Class,Property,Get,Let,Set)

VBAを覚えて、いろいろ作りながらネットで調べたりしていると、
クラスやらオブジェクト指向やらという言葉に出くわします。
いくら言葉を尽くしても、これらクラスやオブジェクト指向を完全に説明しつくすことは難しいと思われます。


オブジェクトとは
操作対象の事ですと説明されたりしますが、
まずは何かの物体、つまりは対象物と理解すれば良いでしょう。


オブジェクト指向とは

オブジェクト同士の相互の作用として、システムの動作をとらえる考え方であり、
対象物を部品を使って組み立てるように表現してプログラミングしていく事になります。


クラスの必要性と利点

オブジェクト指向のプログラムを作るにはクラスが必要です。
といいますか、オブジェクト指向の独自オブジェクトを作るためにクラスが存在しています。

クラスを使って、オブジェクト指向を目指すと、
「プログラムの強度や凝集度は高まり、結合度は下がる」
これが利点と言われても、まあ大抵の人は「何それ」ってことになるはずです。

そもそもクラスを使用しないと実現できない処理はほとんどありません。

クラスが必要になる処理としては、
RaiseEventで、自作のイベント処理を作るような場合に限られそうですが、
これとて、他の方法で実装できるものがほとんどになるはずです。
※RaiseEventの説明は割愛します、興味のある方は別途調べて下さい。

つまり、余程大規模なシステムを作る以外では、
無くてはならないものではなく、使えれば便利なものだということです。
逆の言い方をすれば、
クラスが使いこなせるようになると、これほど便利なものはなく、
もし一切クラスを使わずに作れと言われると困ってしまうくらいの存在となります。


これらを延々と文章で説明しても、かえって混乱するだけのようにも思えます。
「百聞は一見に如かず」
とにかく「やってみる」という事も時には重要な事だと思います。

ただし、最低限の知識として、
第12回.エクセルの言葉を理解する(オブジェクト、プロパティ、メソッド)
このページくらいは理解していることとして説明をしていきます。

以下はMSDNより・・・MSDN(Microsoft Developer Network)はMicrosoft社のソフトウェア開発者向けサポートサービス

オブジェクトの概要
オブジェクトは、データおよびそのデータを操作するメソッドを含む構造体のことです。
Visual Basicで行うほとんどすべての作業は、オブジェクトにかかわっています
classはある対象の抽象表現であり、オブジェクトはそのクラスを表す実例です。

オブジェクトとクラス
Visual Basic の各オブジェクトは、クラスによって定義されます。
クラスによって、オブジェクトの変数、プロパティ、プロシージャ、およびイベントが説明されます。
オブジェクトは、クラスのインスタンスです。クラスを定義すると、必要なだけオブジェクトを作成できます。
オブジェクトとクラスの関係は、クッキーとクッキーの抜き型にたとえることができます。
クッキーの抜き型はクラスです。抜き型は、大きさや形など、それぞれのクッキーの特徴を定義します。
このクラスを基にオブジェクトを作成します。このオブジェクトに相当するのがクッキーです。



少し簡単に言うとと、
クラスは型(オブジェクトの設計図)で、型を使って実体化(インスタンス)したものがオブジェクトです。
つまり
オブジェクトとは、クラスのインスタンスであるという事になります。


以下では、自動車というクラスを作る場合の例えになります。

自動車クラス

プロロパティ
名前

重量
長さ

ドアの数
排気量

このように、プロパティはオブジェクトの性質を表すデータになります。

Dim 自動車オブジェト As New 自動車クラス
自動車オブジェクトを作るには、自動車クラスのインスタンスを生成することで作成します。

自動車オブジェトのプロパティを設定
自動車オブジェ.名前 = フェラーリ
自動車オブジェ.色 = 赤
自動車オブジェ.重量 = 1.5t
自動車オブジェ.長さ = 3.8m
自動車オブジェ.幅 = 1.9m
自動車オブジェ.ドアの数 = 4
自動車オブジェ.排気量 = 4,000cc

これで上で設定したような仕様の自動車が出来上がるという事です。
出来上がった自動車で、いろいろな事をしていくことになります。



具体的には

「61.FileSystemObjectの使い方」で出てきた
Dim objFSO As FileSystemObject
Set objFSO = New FileSystemObject

FileSystemObject
これがクラスです。

New FileSystemObject
これでインスタンスを生成します。

そして、objFSOがオブジェクトとして使用可能となります。
定義しただけでは、Dim objFSO As FileSystemObject、これだけでは、オブジェクトとして使用できません。
インスタンスを生成して、初めてオブジェクトとして使用できるようになります。

Dim objFSO As New FileSystemObject
これは、型の定義とインスタンスの生成をまとめて行っている事になります。

一般的な書き方をすると
Dim 変数 As クラス名
Set 変数 = New クラス名
または、
Dim 変数 As New クラス名



同じクラスのオブジェクトは、いくつでも作る事が出来ます

同じクラスから、複数のインスタンスが生成できます。
Dim 変数1 As New クラス名
Dim 変数2 As New クラス名
変数1と変数2は、同じクラスからインスタンス生成した、別々のオブジェクトです。

自動車というクラスをもとに、
セダンやSUVを作り出すという感じで理解すれば良いでしょう。



では、いよいよ実際にクラスを作っていきましょう。
クラスを作ると言う事は、オブジェクトを作ると言う事です。

クラスの挿入

メニューの「挿入」→「クラス」、ショートカットはAlt+I+C
プロジェクトウインドウで右クリックからも挿入できます。


クラス名の変更

プロパティウインドウのオブジェクト名で変更します。


プロパティの作成

Property Get
プロパティの値を取得するプロシージャです。
取得とは、クラスを使う側(オブジェクトを使う標準モジールのプロシージャー)から見て取得ということです。
変数 = Range("A1").Value
このValueプロパティがGetです。

Property Let
プロパティの値を設定するプロシージャです。
設定とは、クラスを使う側(オブジェクトを使う標準モジールのプロシージャー)から見て設定ということです。
Range("A1").Value = 100
このValueプロパティがLetです。

Property Set
プロパティのオブジェクトを設定するプロシージャです。
オブジェクトの場合は、Letではなく、Setになります。

GetとLet、または、GetとSetは同一の名前が使えます。
通常は、同一名にして、ペアで作成します。
つまり、値の設定と取得を同じプロパティ名にすることで使いやすくできるという事です。
RangeのValueプロパティには、GetとSetがあるので、設定と取得が同じValueで使えています。

読み取り専用プロパティとは、Getプロパティのみのプロパティになります。
RangeのAddressプロパティは設定できません。
つまりGetのみの読み取り専用プロパティということです。


メソッドの作成

Subステートメント、Functionステートメントで作成します。
標準プロシージャーでの扱いと同様になります。

クラス内にPublicで定義されたSubまたはFunctionは、
そのクラスのインスタンスから使用することが出来ます。
メソッドは、そのオブジェクトに何らかの動作をさせるものです。

Rangeであれば、
Delete
Insert
AutoFilter
これらのように、さのオブジェクトに何らかの振る舞いをさせるものになります。



使用例

以下は、独自のワークシートを作るクラスです。
クラスを挿入し、貼り付けて下さい。

Private pSheet As Worksheet

'扱うシートを設定
Public Property Set MySheet(argSheet As Worksheet)
  Set pSheet = argSheet
End Property
'扱うシートを取得
Public Property Get MySheet() As Worksheet
  Set MySheet = pSheet
End Property

'シート名を変更
Public Property Let Name(ByVal argName As String)
  MySheet.Name = argName
End Property
'シート名を取得
Public Property Get Name() As String
  Name = MySheet.Name
End Property

'セル範囲を(開始セル,行数,列数)で指定できるようにする
Public Property Get MyRange(sRange As Range, ByVal RowSize As Long, ByVal ColumnSize As Long) As Range
  Set MyRange = sRange.Resize(RowSize, ColumnSize)
End Property

'セルを(行位置,列位置)で指定できるようにする
Public Property Get MyCells(ByVal RowIndex As Long, ByVal ColumnIndex As Long) As Range
  Set MyCells = MySheet.Cells(RowIndex, ColumnIndex)
End Property

'指定セルのアクティブセル領域に罫線を引く
Public Sub CurrentBorders(sRange As Range)
  sRange.CurrentRegion.Borders.LineStyle = xlContinuous
End Sub

MySheet
扱うシートを設定・取得できるようにしているプロパティです。
設定するプロパティとして、Property Set
取得するプロパティとして、Property Get
シートはオブジェクトなので、Property Setを使います。

Name
シート名を変更・取得できるようにしているプロパティです。
設定するプロパティとして、Property Let
取得するプロパティとして、Property Get
シート名は単なる値なので、Property Letを使います。

MyRange
セル範囲を(開始セル,行数,列数)で指定できるようにするプロパティです。
Property Getだけなので、読み取り専用プロパティとなっています。

MyCells
セルを(行位置,列位置)で指定できるようにするプロパティです。
Property Getだけなので、読み取り専用プロパティとなっています。

CurrentBorders
指定セルのアクティブセル領域に罫線を引くメソッドです。
戻り値が必要ないので、Subプロシージャーで作成しています。

標準プロシージャーで上のクラスを使う場合です。

Dim myClass As New Class1
Set myClass.MySheet = ActiveSheet
With myClass
  .Name = "クラスTEST"
  .MyCells(2, 1) = 1
  .MyRange(.MyCells(3, 1), 1, 3) = 10
  .CurrentBorders sRange:=.MyCells(2, 1)
End With


最初は遊びがてら、上記のコードをいじってみるところから初めてみると良いと思います。
いきなり書籍やWEBで、しっかりクラスを理解しようとしてもかなりの苦労が待ち受けているだけだと思います。
標準モジュールでも簡単に実現できるような簡単なコードから使い始めれば良いでしょう。

ただし既に書いている通り、クラスは無くてはならないものではありませんので、
VBAの基本及び応用において、一通り習得できた後にチャレンジしてみるくらいで十分です。




同じテーマ「マクロVBA技術解説」の記事

リボンを非表示、2003以前ならメニューを非表示
印刷ページ設定の余白をセンチで指定する(CentimetersToPoints)
文字列としてのプロシージャー名を起動する方法(Run,OnTime)
ドキュメントの作成者を取得(GetObject,BuiltinDocumentProperties)
画像サイズ(横x縦)の取得について
文字種(ひらがな、全半角カタカナ、半角英大文字等々)の判定
オブジェクトとプロパティの真実
オブジェクト式について
オブジェクトの探索方法
条件付きコンパイル(32ビット64ビットの互換性)
VBAのクラスとは(Class,Property,Get,Let,Set)

新着記事 ・・・新着記事一覧を見る

エクセルVBAでのシート指定方法|VBA技術解説(9月8日)
VBAのクラスとは(Class,Property,Get,Let,Set)|VBA技術解説(8月28日)
VBAこれだけは覚えておきたい必須基本例文10|VBA技術解説(8月22日)
VBAの省略可能な記述について|ExcelマクロVBA技術解説(8月11日)
複数条件判定を行う時のコツ|ExcelマクロVBA技術解説(7月11日)
For Next の使い方いろいろ|VBA技術解説(6月14日)
VBAを定型文で覚えよう|ExcelマクロVBA技術解説(3月26日)
VBAスタンダード試験対策まとめ|MOS VBAエキスパート対策(3月16日)
ユーザーフォームとメニューの操作|MOS VBAエキスパート対策(3月14日)
ファイルの操作|MOS VBAエキスパート対策(3月14日)

アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数とデータ型(Dim)|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.RangeとCellsの使い方|ExcelマクロVBA入門
6.定数と型宣言文字(Const)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.とにかく書いて見よう(Sub,End Sub)|VBA入門
9.繰り返し処理(For Next)|ExcelマクロVBA入門
10.ひらがな⇔カタカナの変換|エクセル基本操作



  • >
  • >
  • >
  • VBAのクラスとは(Class,Property,Get,Let,Set)

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。





    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。

    本文下部へ

    ↑ PAGE TOP