[Excel VBA] 関数を作ってみよう

関数を使ってより見やすいコードに 

Excel自体にもsumとかifとか色々な関数があって、事務作業をする人ならみんな使ったことがあると思うけど、 考え方はこれと全く同じです。

何か計算対象の値を関数に渡すと、答えが返ってくる感じ。例えば=Sum(1,2)だったらSumという関数に1と2を渡すと、1+2をした結果の3がかえってくるよね。もし関数にあまり馴染みがなかったら、Googleで「Excel 関数」で検索して、いろいろ試してみて感じをつかんでね。

VBAの関数というのは、関数を自作することなんだ。とは言っても別に難しい計算式を入れるわけではないから安心して。この関数を使いこなせば、キミのコードはより見やすく進化します。

それではコードを見てみましょう。っとその前にまずはすでにあるコードについてコメント化する方法を教えるよ。

コメントアウト(コメント化)について 

コードをコメント化しておくことで、プログラムとしては無視されるけど、そのまま残しておくことが出来るよ。

今までのコードはコメント化して一応残しておいて、後で見直せるようにしておこう。

コメントアウトの効率的なやり方だけど、Visual Basicの画面のメニュバーの表示 – ツールバー – 編集をクリックして、↓のようなメニューバーが出てくるから、好きな位置に固定して、そのあとコメント化したい箇所を↓みたいに選択して、コメントブロックのボタンを押せば、一気にコメント化できるよ。

 それでは改めて、コードの説明です!

Sub ボタン1_Click()

    Call ColoringCells

End Sub


Function CellColorSet(TargetString)

        '株式会社が名前についていたら、セルをオレンジ。ついてなければ白
        'Instrという関数は特定の文字が含まれていたら、その文字の開始位置を返すよ。
        If InStr(1, TargetString, "株式会社") > 0 Then
            'ColorIndex = 45はオレンジを表しているよ
            CellColorSet = 45
        Else
            'ColorIndex = 2は白を表しているよ
            CellColorSet = 2
        End If

End Function

'セルに色を付けるプログラムだよ。
Sub ColoringCells()

    Const SheetName As String = "顧客マスタ"
     
    '行数カウンター
    Dim RowCounter As Integer
    '顧客名
    Dim CustName As String
    
    'データが始まるのは2行目から
    RowCounter = 2
    
    '1列目が空白になるまでループ
    '2行目の1列目からチェックするよ。途中で空白があったらそこで繰り返しはおしまいになるよ。
    Do Until Sheets(SheetName).Cells(RowCounter, 1) = ""
    
        'RowCount行目の2列目にある顧客名をCustNameへ代入
        CustName = Sheets(SheetName).Cells(RowCounter, 2)
        
        '顧客名を引数として、CellColorSet関数を呼び出す。セルの色が戻り値になる
        Sheets(SheetName).Cells(RowCounter, 2).Interior.ColorIndex = CellColorSet(CustName)
        RowCounter = RowCounter + 1
    
    Loop

End Sub

 まずはコードをキミのExcelに貼り付けて、ステップ実行してみよう。

↓の位置でFunction CellColorSet(TargetString)へ移動するのがわかったかな。

Sheets(SheetName).Cells(RowCounter, 2).Interior.ColorIndex = CellColorSet(CustName)

ちなみに関数はFunction ~ End Functionで囲むんだけど、これを記述する位置は最後の行のEnd Subのあとでも大丈夫。

CellColorSet(CustName)と記述してあるけど、CustNameがカッコの中にあるよね。これはFunction CellColorSetにCustNameの値を渡しているよ。CustNameは顧客名を入れてある変数だから、Functionに対して顧客名を渡しているんだ。

Function の名前はCellColorSet でカッコの中はTargetStringとなっているね。ここは変数名だから何でもいいんだけど、このFunctionではTargetStringという名前にしているよ。

Functionの中身は以前の記事で説明した内容と全く同じで、顧客名に株式会社がついていればオレンジを表す数値、なければ白を表す数値を設定しているよ。

ここでポイントなのが、CellColorSet = 45 というようにFunction名を変数のようにして、取得した数値を設定しているね。

その数値が元の呼び出し元に戻ってくるんだ。例えば2行目のシロマル株式会社をFunctionに渡した場合、45が返ってくるから、↓みたいなイメージになるよ。

Sheets(SheetName).Cells(RowCounter, 2).Interior.ColorIndex = 45

Functionを追加したことで、Sub ColoringCells 内が以前よりもスッキリしたのがわかるかな。

このようにして、なるべく1つ1つのサブプロシージャ(sub) やファンクション(function) を短くして、より分かりやすいコードを目指そう。

例えば、今回の例だと、Function CellColorSet(TargetString)がセルの値によってセルの色を決めてくれる関数としたら、もし色付けの条件が増えたら、そのfunctionの中を編集してあげればいいし、もし他のExcelファイル内でも同じことがしたければ、ただこのfunctionを丸ごとコピーして、使い回しが出来るよ。

よく使うサブプロシージャやファンクションを1つの標準モジュールにまとめておいて、必要に応じてそれを丸ごとコピーして使い回すのもいいかもね。

今まで教えてきたプログラムは、Visual studioを開いて実行するか、ボタンを押して実行だったけど、今回はExcelファイルを保存...