見習いエンジニアがゆく

見習いエンジニアの勉強帳 VBA・NWなどなどITの勉強用ブログです。のんびり、のんびり。

【VBAエキスパートの勉強】ExcelVBAベーシック ~3.プロシージャとは~

プロシージャとは、マクロの最小実行単位のことです。

Subプロシージャの場合は、「Sub マクロ名」から始まり、「End Sub」で終わります。

 

 

プロシージャを考える

以下のようにセルA1に「hello world」を入力し、B列にA1の文字列を1文字ずつ抜き出す処理をVBAで記述した場合のプロシージャを考えてみましょう。

 

コード例

Sub sample()
    Range("A1").Value = "hello world"
End Sub
 
Sub sample2()
    Dim num As Long, i As Long '変数の宣言
    num = Len(Range("A1")) 'セルA1の文字数を変数numに代入
   
    For i = 1 To num '繰り返し処理
        Cells(i, 2) = Mid(Range("A1"), i, 1)
    Next i
End Sub
Sub sample()
    Range("A1").Value = "hello world"
End Sub
Sub sample2()
    Dim num As Long, i As Long '変数の宣言
    num = Len(Range("A1")) 'セルA1の文字数を変数numに代入
   
    For i = 1 To num '繰り返し処理
        Cells(i, 2) = Mid(Range("A1"), i, 1)
    Next i
End Sub

 処理結果

f:id:melancholy198x:20190415200632j:plain

 

この場合は、以下の2つのプロシージャでマクロが作られています。

  • Sub sample:セルA1に「hello world」を入力するプロシージャ。
  • Sub sample2:セルA1の文字列を1文字ずつB列に入力するプロシージャ。

 

今回使ったMid関数はこちら

www.heilnervba.work

 

 

プロシージャの種類

プロシージャには以下の種類があります。

  • Subプロシージャ
  • Functionプロシージャ
  • Propertyプロシージャ (クラスモジュール内で使用するプロシージャ)

※Propartyプロシージャについては、試験範囲外です。

 

SubプロシージャとFunctionプロシージャの違いは、以下の通りです。

  • Subプロシージャは処理の結果を返さない。
  • Functionプロシージャは処理の結果を返す。

 

処理した結果の値を返すかどうかがSub・Functionプロシージャの違いです。

マクロ内でFunctionプロシージャを呼び出し、処理をさせて、その結果を呼び出し元に返すことができます。

処理の結果(値)を返すので、関数と同じ働きを持つのでFunction プロシージャのことを「ユーザー定義関数」と呼ぶこともあります。

 

Functionプロシージャに引数を渡してみる

例として、セルA1に入力した数値を消費税込みに計算する処理を考えます。

コード例

Option Explicit
Public Const tax As Double = 1.08 '定数を宣言しておく
 
Sub sample()
    Dim Yen As Long, taxPlus As Long
    Yen = Cells(1, 1)
     taxPlus = 税金計算(Yen)
     MsgBox taxPlus
End Sub
 
Function 税金計算(Yen As Long)
    税金計算 = Yen * tax
End Function

 

 Subプロシージャの「sample」から処理が始まり、セルA1に入力した値をFunctionプロシージャの「税金計算」に渡して、結果を戻り値として「sample」に戻しています。

メッセージボックスに税込みの数値が表示されます。

※消費税は滅多に変更されないので、Subプロシージャ前の宣言ブロックで宣言しました。(2019年増税はどうなるんでしょう。。)

 

別プロシージャの呼び出し

別のプロシージャの呼び出しは、Callステートメントを使って行います。

Callステートメントの利用例

Sub goodMorning()
    Call HELLO 'HELLOを呼び出す

    MsgBox "GoodMorning"

End Sub
 
Sub HELLO()
    MsgBox "HELLO"
End Sub

上の例の場合は、Sub goodMorningを実行すると、まずCallステートメントでSub HELLOが呼び出されて、画面に「HELLO」と表示します。

その後、Sub goodMorningの処理で画面に「GoodMorning」と表示します。

 

このCallステートメントは省略も可能ですが、「Call」ステートメントを使った方が他のSubプロシージャを呼び出していることが明確にわかるので、Subプロシージャ呼び出し時には省略しない方が良いです。

※Callステートメントですが、「戻り値を取得する場合はCallステートメントを省略する」などのルールがあります。