カラーチャート コード説明 Macユーザー向け Excel VBA 入門 [05] Excel2019 for Mac

Excel2019 VBA Primer[05] CatchImage(Png)

 [05] VBA「カラーチャート」コードの説明!
 【おまけ解説】 ※ Excel for Mac では「 VBA ユーザーフォーム」を利用できない!

・「プロジェクトエクスプローラー」と「コードウィンドウ」、「プロパティウィンドウ」の利用方法

・プロシージャ内で、 変数定数 を宣言する(変数の とは?)

For 〜 Next 制御文でループ(繰り返し)処理を実行!

・条件分岐は、 If 〜 Then 〜 Else 〜 End If 制御文を利用!




 [05] VBA「カラーチャート」、コードの説明! 

 まず、Excel メニューバーの [ヘルプ] - [更新プログラムのチェック] にて、適用されていないアップデートがあれば行ってください。

 (コードの説明が続くと)眠くなりがちなので、ガムや飴を用意しておくと良いでしょう!


 「プロジェクトエクスプローラー」と「コードウィンドウ」、「プロパティウィンドウ」の利用方法 

 VBAコードを記述する「モジュール」の種類 

 VBAコードはモジュール内に(記述)保存されます! マクロ記録すると、デフォルトで Module1 モジュール内に「マクロ名を付けた Subプロシージャ」として保存。

 Excelオブジェクトに対応するドキュメントモジュール(該当するイベントプロシージャ [後日、説明] を記述)には、Worksheetオブジェクトに対応する「シートモジュール」や、Workbookオブジェクトに対応する「ブックモジュール」などがある。

 ドキュメントモジュール以外は「標準モジュール」と呼ばれ、 Module1 も「標準モジュール」となります。 「標準モジュール」は複数のモジュールに分割可能で、「モジュール」フォルダを右クリックして挿入可能。 厳密には「標準モジュール」をオブジェクト指向対応させた「クラスモジュール」や、Excel2019 for Mac で利用できない ユーザーフォームに対応する「フォームモジュール」も存在する。
 ちなみに、ドキュメントモジュールは クラスモジュールを利用して実装されているとのこと。


 Excel for Mac では「 VBA ユーザーフォーム」を利用できない!

Mac版Excelにて「ユーザーフォーム」をサポートする予定は無く、その代替として「Officeアドイン(Excelアドイン)」を利用して欲しい
とのこと!

 残念ですが、 社の方針なので仕方ありません。  Windows版Excel ではもちろん「ユーザーフォーム」を利用できますが、( Exce2016以降 Excel2019も含め、社の方針が変わらない限り) Mac版Excelでは「ユーザーフォーム」を利用できません。  以下に、その回答を示したフォーラム記事と 「Officeアドイン(Excelアドイン)」に関する記事のリンクを添付します。

 筆者個人は、「ユーザーフォーム」っぽい「Excel ワークシート」を作成するしかないかなと思います! 「ワークシートの保護」等の機能をうまく利用して... もちろん、「ワークシートの保護」や「セルのロック」も VBAから制御可能です!





vba2019_primer[05] 01_png

 「コードウィンドウ」は既に利用していますね! 対象モジュール(オブジェクト)を指定・挿入・削除できる「プロジェクトエクスプローラー」の下にあるのが「プロパティウィンドウ」で、選択オブジェクトのプロパティ名に対応するプロパティ値を表示または(コードを記述せずに)変更が可能。 左側でプロパティ名を表示 右側でプロパティ値を表示・変更 可能で、Module1 などのモジュール名の変更もできる。


 コードウィンドウ には、2種類の表示モードがある! 

vba2019_primer[05] 02_png

 コードウィンドウ には2種類の表示モードがあり、「指定したモジュールに記述された 全VBAコードを表示」するモードと 「指定したプロシージャの VBAコードのみを表示」するモードがある。

vba2019_primer[05] 03_png
vba2019_primer[05] 04_png

 パブリック変数モジュールレベル変数の詳細は、後日にて! 本日覚えて欲しいのは、変数(定数)には有効範囲(適用範囲、プログラム用語では「スコープ」と呼ぶ)があり、プロシージャ内で宣言した変数(定数)は そのプロシージャ内でしか 利用できないこと。



 以下に、「カラーチャート」の全VBAコード(45行)を表示。

Option Explicit

Sub ColorChart()     ' 標準コードのフォントを「MS Gothic 16point」に変更
' ColorChart Macro
' カラーチャート

    Const iSTEP As Integer = 32     ' 64  32  16  8  のどれかを選択
    
    Dim iRed As Integer, iGreen As Integer, iBlue As Integer
    Dim lRow As Long, lCol As Long
    Dim sTemp1 As String, sTemp2 As String
    
    ActiveSheet.Cells.Clear         ' アクティブシートのクリア

    For iRed = 0 To 256 Step iSTEP
        lCol = iRed / iSTEP + 1
        lRow = 0
        
        For iGreen = 0 To 256 Step iSTEP
            For iBlue = 0 To 256 Step iSTEP
            
                lRow = lRow + 1
                If iRed > 255 Then
                    iRed = 255
                End If
                If iGreen > 255 Then
                    iGreen = 255
                End If
                If iBlue > 255 Then
                    iBlue = 255
                End If

                Cells(lRow, lCol).Interior.color = RGB(iRed, iGreen, iBlue)
                Cells(lRow, lCol).Value = iRed & ", " & iGreen & ", " & iBlue
    
            Next iBlue
        Next iGreen
    Next iRed
    
    sTemp1 = Cells(lRow, Int(lCol / 2)).Address(False, False)
    Range("A1:" & sTemp1).Font.color = rgbWhite
    sTemp2 = Cells(lRow, lCol).Address(False, False) ' CellsのRange表記を取得
    Range(sTemp2).Select     ' 選択セルが見えるよう、スクロールされる
    
End Sub

 プロシージャ内で、 変数 と 定数 を宣言する(変数の 型 とは?) 

 変数や定数は言わば「空き箱」で、その中に値やオブジェクトを格納して利用します!  変数や定数の「」を利用すると 格納できる値やオブジェクトに制限をかけることができ、バグが発生しにくくなります。

 モジュールの先頭に「Option Explicit」と記述することにより変数や定数を宣言しないと利用時にVBAのコンパイルエラーが発生しますが、「Option Explicit」無しだとコンパイルエラーになりません。 「宣言無し」で変数を利用した場合は その中に値やオブジェクトを何でも格納可能で、変数の「型」は Variant型。 型を指定しないで変数を宣言した場合も Variant型 となりますが、誤動作を引き起こす原因となる可能性があるため オススメできません。

 7行めの Const iSTEP As Integer = 32 では、 Integer型の 定数 「iSTEP」を宣言し 32 を代入。
 Const はコンスタントの略でしょうね、定数宣言時のステートメントです。 As [型名] で、型を制限。 Integer は整数型の型名で、-32,768~32,767 の整数を格納可能。 Long(長整数)型だと -2,147,483,648~2,147,483,647 の整数を格納可能で、整数を格納する場合 面倒なら 全部 Long 型で宣言しても構いません。

 9〜11行めでは、 Dim ステートメントを用いて Integer、Long、String(文字列) 型の変数を 1行で複数 宣言しています。
 Dim lRow, lCol As Long と省略記述してはいけません。 他のプログラム言語においては lRow と lCol 両方 同一の型で宣言できる事が多いのですが、VBA を含む VB ( VisualBasic ) 6.0系 では 最初の lRow は Variant型 で宣言されます。
 初心者にありがちなミスですので、要注意!  変数や定数を1個ずつ As 付きで必ず宣言するか、1行に変数や定数を1個ずつ 宣言するように努めてください! 

 13行目は 現在選択中の Worksheet (Sheet1)が ActiveSheet で参照できるため、そのシート全体を初期化するためのメソッド(命令)を実行。 iSTEP に 16 指定で実行後に 32 指定など前回より大きな値で実行すると、前回の描画内容が残ったままで カラーチャート描画結果がおかしくなるための対応コードです。 この行までが「前処理」。


 For 〜 Next 制御文でループ(繰り返し)処理を実行! 

 For 〜 Next 制御文でループ(繰り返し)処理を実行でき、メイン処理の 15〜38行めで 3重のループ(繰り返し)処理を実行。
 For 〜 Next ループ変数 で挟まれた範囲のコードを繰り返し実行し、 For iRed = 0 to 256 の部分でループ変数の 初期値最終値 を指定し iSTEP で増減値 を指定。
 Next iRed まで 実行すると iRed = iRed + iSTEP が実行され iRed の値が増減される。 iSTEP が 32 指定の場合、 0 , 32, 64, ... 256 のように繰り返してこのループを抜け出し、Next iRed の次の行以降(後処理)を実行する。

 RGB色要素 iRed、iGreen、iBlue の順番で 3重のループ(繰り返し)処理を実行するが、注目すべきは16行めの lCol = iRed / iSTEP + 1 にて iRed の値で 格納列を決定。 A列(1), B列(2), C列(3), ... I列(9)
 また、17行めの lRow = 0 にて、格納列が変わる度に 格納行が初期化される。 2重や3重の入れ子構造のことをプログラミング用語で「ネスト」と呼ぶ

 iBlue ループ(繰り返し)処理の前後で何も行なっていないため、 iBlue の繰り返し処理が終了しても 格納行 lRow は初期化されず +1ずつ増えていく。( 22行めの lRow = lRow + 1 )

 条件分岐は、 If 〜 Then 〜 Else 〜 End If 制御文を利用! 

 23〜31行めでは、3つの If 文(条件分岐のステートメント)を行い、 iRow, iGreen, iBlue の値がそれぞれ 255 を超えた場合 その値を 255 に再設定。(RGB色要素は 0〜255の範囲で設定しなければならないため)
 If (条件式) で(条件式)が成立する場合、 ThenEnd If で挟まれた範囲のコードを実行する。
 (条件式)が不成立の場合に実行するコードも 同時に記述でき、If (条件式) Then 〜 Else 〜 End If を用いる。 (条件式)が成立する場合、 Then から Else で挟まれた範囲のコードを実行し、(条件式)が不成立の場合、 Else から End If で挟まれた範囲のコードを実行する。 For ステートメント のように、ネスト構造が可能。

 33〜34行めにて、セルの背景色と セルの値 を代入設定。 & は文字列結合を行う演算子。 ", " のようにダブルコーテーションで囲った部分を 文字列リテラル と呼ぶ 。
 あれ? 整数型と文字列型を結合しても大丈夫なのかな? と思ったあなた、正解です! iRed, iGreen, iBlue の整数型変数の格納値は 「暗黙の型変換」がそれぞれ自動的に行われ、文字列化された後に結合されます。
VBA任せにせず「型変換」を明示的に行なった場合のコードは、   Cells(lRow, lCol).Value = CStr(iRed) & ", " & CStr(iGreen) & ", " & CStr(iBlue)  となる。 文字列化を行う CStr関数は VB関数として提供されています。

 実行したら 想像した以外の結果になった場合、コードを省略せず かつ 明示的に「型変換」を行う ように変更するのもバグ対策の一つの手段です!

 残りは「後処理」の4行のみの説明ですので、もう少し頑張ってくださいね!

 Cells.Address(False, False) は セルの位置(番地)を行・列両方とも相対参照形式($が付かない形式)で取得するプロパティ で文字列が返ります。  Int関数は 整数化(切り捨て)を行うVB関数。
 ちなみに、Cells.Address だと セルの位置(番地)を行・列両方とも絶対参照形式($が付く形式)で取得可能。  40〜41行めで、左半分の列のセルの文字色に rgbWhite ( XlRgbColor定数として定義済みの「白」の値 ) を代入設定。

42行めは、一番最後に変更したセルの位置(番地)を 文字列として取得。
43行めで上記セルを選択したため、選択セルが表示されるよう 自動的に スクロールされます!



 [command] + [Q] にてまず VBE を終了し、Excel のウィンドウ内を選択して [command] + [Q] にて Excel も終了させます。 「作業中のブック」を保存するか確認のダイアログ画面が表示された場合は 「保存」しましょう。 「自動保存」済みの場合、保存するかどうかの確認ダイアログ画面は表示されません。


 大変、お疲れ様でした! 筆者も久しぶりにキーボードをたくさん叩きましたよ。 次回は、Excelワークシートからも呼び出せる「関数」を作成してみましょう!





広告
  




Macブログ ランキング アイコン
最後まで読んでいただき、ありがとうございます。 また、お越しくださいませ。
// アタル
For follow LINE Reader Group!Subscribe to this blog on Feedly!

Next Post Previous Post
No Comment
Add Comment
comment url