数字の各桁の合計値を求めるプログラム を書いてみます。
たとえば「 1234 」という数値を入力して、
という結果を得るのが目的です。マクロの構造自体は単純ですが、変数のデータ型の取り扱いがやや面倒なので中級者向けのプログラムとなっています。
数字の各桁を取り出すマクロ
足し算する前に、まずちゃんと桁を取り出すことができているのかを確認するマクロから作ってみます。
Dim x As Variant
Dim i As Long, keta As Long, dig as long
x = InputBox("数値を入力してください")
'入力値の桁数を求めます
keta = Len(x)
'大きな位から順に数字を取り出します
For i = 1 To keta
dig = Mid(x, i, 1)
Debug.Print dig
Next i
End Sub
マクロを実行すると数値を入力するように促されるので、たとえば「 1234 」と入力してみると、イミディエイトウィンドウに「 1, 2, 3, 4 」という数字が並ぶはずです。
Variant型変数
入力値 x を Variant型で宣言しています。 Variant型とは、整数でも文字列でも、あるいはセル範囲でも好きな値を格納できる便利なデータ型です。このようなデータ型を使用している理由は以下で説明します。
Len関数
Len関数は文字列を引数に指定すると、その文字数を返してくれます。
今の場合は入力された x を引数として
という記述によって、文字数つまり桁数を得ているのです。しかしこの x が Integer や Long, Double などの数値型であった場合、 Len関数は文字数ではなくバイト数を返してしまいます。そこで、本当は数値として欲しい x をいったん Variant型で格納しておけば、 Len関数の引数として指定した場合に文字列として処理されて文字数(桁数)を Long型で返してきます。それを keta という変数に代入しておけば、あとはループ処理の中で普通に数値として扱うことができるという仕組みになっています。
Mid関数
For...Next の中で各桁の数を取り出すために Mid関数が用いられています。Mid関数は
という形で記述しますが、この関数も最初の引数 [文字列] は文字列型 (String あるいは Variant) で指定する必要があります。
数字の各桁の合計値を求めます
桁の総和を格納する変数 sum をループ処理の中に組み込めば、各桁の数字を足し合わせるマクロになります。
Dim x As Variant
Dim i As Long, keta As Long, dig as long, sum As Long
x = InputBox("数値を入力してください")
keta = Len(x)
For i = 1 To keta
dig = Mid(x, i, 1)
sum = sum + dig
Next i
Debug.Print sum
End Sub
マクロを実行して「 1234 」という値を入力すると、イミディエイトウィンドウに桁の総和「 10 」が表示されます。 ≫ VBA 数値計算