TOP

ExcelVBAオブジェクト指向
プログラミング説明・デモ動画
はじめに
世の中にExcelVBAを説明するコンテンツはたくさん出回っていて、わかりやすく説明するものも多いです。しかし、 ExcelVBAの クラスモジュールの活用をオブジェクト指向の観点から説明するコンテンツは少ないと考えます。
そのため、クラスモジュールを活用しオブジェクト指向のプログラミングをしてみたいが、手が出ない方も多いのではないかと思います。
私は、ExcelVBAの表操作の自動化に、オブジェクト指向の考え方適用することにより、かなり、高品質でメンテナンス性の良いアプリケーションが作れると考えています。
そのため、Excel VBAでクラスモジュールを使用したオブジェクト指向プログラミングを説明することにしました。
オブジェクト指向の
メリット
操作対象をクラスとして扱うと単純なパラメータ設定でプログラミングができるようになります。
よく使用する機能をクラスにすることで、それを利用するメインプログラムは非常に単純化されわかりやすいものとなります。
オブジェクト指向の
プログラミング概要
  1. クラスを定義し、クラスを中心にコーディングを進めるのがオブジェクト指向のプログラミングの進め方です。
  2. クラスは管理対象の特徴(プロパティとメソッド)を定義したものです。

    デモ動画では、Studentがクラスです。生徒の成績グラフをクラスとして扱っています。 プロパティはname(生徒名)、startPos(シートの書き出しセル)などです。 drawScore(シート上にグラフを表示する機能)がメソッドです。

  3. クラスをうまく設定すると、バグが少なく、メンテナンスもしやすいプログラムを作成することができます。
  4. クラスは指定されたプロパティやメソッドを持つことを示しているにすぎません。クラス を実際のプログラムで使用するためには、クラスを具現化したインスタンスを作成する必要があります。 ちなみに、インスタンスがオブジェクトでもあります。
    クラスからインスタンスを作成し、インスタンスに値を設定し、メソッドを起動するのが典型的なオブジェクト指向のプログラミングの進め方です。
    デモ動画では、Set a =New StudentとSet b=New Studentがインスタンスの作成部分です。
ExcelVBAで
オブジェクト指向を
適用する手順
ここからは、ExcelVBAオブジェクト指向プログラミングに説明したいと考えます。
  1. クラスの抽出
    オブジェクト指向設計の根幹にあたる部分です。 基本は、システム化の対象から、クラスとして扱うものを見つけ出す作業です。 これは、デモ動画の生徒の棒グラフのように、名前とか、成績が変わったとしても 同じプロパティやメソッドを持つものを見つけ出すことから始まると考えます。
  2. クラスの設計
    クラスとして扱うものをプロパティとメソッドを確定する作業です。
  3. メインプログラムの作成
    クラスからインスタンスを作成します。 次に、インスタンスのプロパティに値を設定します。 値の設定されたインスタンスを操作しながら、プログラムを組み立てていきます。
クラスの設定方法
デモ動画を例にクラスの設定方法を説明します。 クラスの構成は以下の通りです。
クラス名Student
プロパティ
startPos Range型
name String型
studentNo Integer型
scoreKokugo Integer型
メソッド
drawScore プロパティの値を基に棒グラフを表示する
この構成をクラス化する手順を示します。VBEでの作業になります。
  • ①[挿入]-[クラスモジュール]
  • ②プロパティウィンドウの(オブジェクト名)を「Student」に書き換える
  • ③プロジェクトブラウザのクラスモジュール配下の「Student」をクリックし、コードウィンドウを表示する
  • ④コードウィンドウに登録するコード
    今から行う設定によりデモ動画のa.startPosやa.drawScoreのように、<インスタンス>.<プロパティ>や<インスタンス>.<メソッド> の形でプロパティやメソッドを扱えるようになります。
    デモ動画で使用しているソースコードを説明します。

    mainプロシージャ

    
            Sub Main()
                Dim a As Student
                Set a = New Student
                Set a.startPos = Range("B2")
                a.name = "山田"
                a.studentNo = 1
                a.scoreKokugo = 10
                a.drawScore
            End Sub
                            
    startPosの設定
    宣言部

    
            Private startPos_ As Range
                        
    Set a.startPos=Range(“B2”)を実行したとき、変数startPos_にRange(“B2”)が代入されます。 変数startPos_は、クラスで定義されるメソッドで利用されます。 つまり、変数startPos_は、プロパティに設定された値を保持する変数になります。 変数名から対応するプロパティが分かるためにプロパティ名に「_」を付けています。 Privateを宣言することで、startPos_は次に説明するPropertyステートメントを介さない限り、 他のプロシージャから参照できない変数となります。
    Propertyステートメント

    
            Public Property Set startPos(inStartPos As Range)
                Set startPos_ = inStartPos
            End Property
                        
    Set a.startPos=Range(“B2”)を実行したとき、変数startPos_にRange(“B2”)を代入するための ステートメントです。Publicは、他のプロシージャからアクセス可能なことを示します。 Property Setは、オブジェクトを代入するときに使用します。 引数inStartPosにRange(“A2”)が代入され、それが Set startPos_ = inStartPosでstartPos_に代入されます。
    
            Public Property Get startPos() As Range
                Set startPos = startPos_
            End Property
                        
    Public Property Get startPos()は、startPos_をa.startPosに設定することを示します。Publicは どのモジュールのプロシージャでも利用できることを示します。
    nameの設定
    宣言部

    
            Private name_ As String
                        
    a.name=“山田”を実行したとき、変数name_に”山田”が代入されます。 変数name_は、クラスで定義されるメソッドで利用されます。 つまり、変数name_は、プロパティに設定された値を保持する変数になります。 変数名から対応するプロパティが分かるためにプロパティ名に「‗」付けています。 Privateを宣言することで、name_は次に説明するPropertyステートメントを介さない限り、 他のプロシージャから参照できない変数となります。
    Propertyステートメント

    
            Public Property Let name(inName As String)
                name_ = inName
            End Property
                        
    a.name=“山田”を実行したとき、変数name_に”山田”を代入するための ステートメントです。Publicは、他のプロシージャからアクセス可能なことを示します。 Property Letは、オブジェクト変数以外を代入するときに使用します。 引数inNameに“山田”が代入され、それが name_ = inNameでname_に代入されます。

    
            Public Property Get name() As String
                name = name_
            End Property
                        
    Public Property Get name()は、name_をa.nameに設定することを示します。publicは どのモジュールのプロシージャでも利用できることを示します。
    studentNoとscoreKokugoの設定

    データ型がStringからIntegerに代わりますがnameと同様の設定をします。一度自分で試し てみてください。
    darwScoreメソッド

    
            Public Sub drawScore()
                startPos_.Value = name_
                startPos_.Offset(0, 1).Value = studentNo_
                Range(startPos_.Offset(0, 2), startPos_.Offset(0, scoreKokugo_ + 1))_
                    .Color =&H9ACD32
            End Sub
                    
    メソッドは、標準モジュールのSubプロシージャ形式もしくは、Functionプロシージャ形式で コーディングします。 今回は、Subプロシージャ形式のサンプルになっています。生徒の成績のグラフを表示するメソッドです。 赤色の変数が、プロパティの値を保持する変数です。
自己紹介
経歴
外資系コンピュータメーカーで25年、プログラマ、SE、教育インストラクタ、コンサルタント、を経験してきました。
特に、教育インストラクターとしては、Microsoft認定講師として、WindowsServerシステム管理、AccessVBA、ExcelVBAなどMicrosoftの技術を教育しました。 現在は、エンベックスエデュケーションの認定講師としてJavaのServlet中心に新人教育に携わっています。
また、UdemyにてAccessVBAプログラミング講座を提供中です。 過去のIT技術から 時代に合わせた最新のIT技術まで幅広く提供できます。

経歴
外資系コンピュータメーカーで25年、プログラマ、SE、教育インストラクタ、コンサルタント、を経験してきました。

特に、教育インストラクターとしては、Microsoft認定講師として、WindowsServerシステム管理、AccessVBA、ExcelVBAなどMicrosoftの技術を教育しました。 現在は、エンベックスエデュケーションの認定講師としてJavaのServlet中心に新人教育に携わっています。
また、UdemyにてAccessVBAプログラミング講座を提供中です。 過去のIT技術から 時代に合わせた最新のIT技術まで幅広く提供できます。
主なスキル
Excel VBA、AccessVBA、Java言語オブジェクト指向プログラミング, SQLServerシステム管理、Oracle11gシステム管理、 Transact-SQL
提供サービス
  • ①いつでも、どこでも学べるオンライン動画講座のUdemyにてExcelVBAオブジェクト指向プログラミングを提供開始
  • ②同じく、UdemyにAccessVBAプログラミングを提供しております。(2024年7月現在、121名の方にご受講いただいています)
  • ③プログラミング家庭教師
その他
中小企業診断士資格を取得しています。企業様向けにWordPressベースのHP作成( PHP、JQuery プログラミングを含む)およびSEOコンサルティングも手掛けております。 現在、2社のWebサイト構築とSEOコンサルティングを実施中です。