TopProgramming LanguageVB/VBA > 2014年3月
2014年3月28日

Excel VBAで関数名に変数を使う方法

March 28,2014 1:55 AM
Tag:[, ]
Permalink

Excel VBAで関数名に変数を使う方法を紹介します。

1.問題点

仕事で、セルに設定した1から10の値を関数名の一部(call_1,call_2…)として起動させる必要が生じました。

具体的には、次のように関数Testの中でセルの値を変数nameに保持し、その値を使って関数call_1やcall_2を起動させなければなりません。

Sub Test()
    Dim name As String
    Dim i As Integer
    For i = 2 To 11
        name = Worksheets("Sheet1").Cells(i, 2).value
        '???
    Next i
End Sub
 
Sub call_1()
    '...
End Sub
 
Sub call_2()
    '...
End Sub
 
(中略)
 
Sub call_10()
    '...
End Sub

もう少し簡単なサンプルに修正して不明点を示します。

変数nameの値「1」をそのまま関数名として扱い、関数call_1を起動したいということです。

Sub Test()
    Dim name As Integer
    name = 1 '1を関数名の一部として起動させたい
    '???
End Sub
 
Sub call_1()
    '...
End Sub

他の言語で、変数をそのまま関数名として扱うことがありますが、VBAではどのように記述すれば実現できるのか不明です。

2.VBAで関数名に変数を使う

関数名に変数を使うには、Application.Runメソッドを利用します。

次のようにApplication.Runの直後に文字列や変数を設定すれば、その文字列を関数とみなして起動してくれます。

Sub Test()
    Dim name As String
    name = 1
    Application.Run "call_" & name
End Sub
 
Sub call_1()
    MsgBox "OK"
End Sub

Application.Runは他のブックのマクロを起動するときに、

Application.Run "test.xls!Test1"

というような指定をするのですが、指定するブック名やマクロ名は文字列として設定します。

したがってこの部分に変数を設定すれば、変数展開された値が適用される仕組みになっているようです。

3.関数に引数を追加する

関数に引数を追加する場合は、関数名の後方にカンマ区切りで追加します。複数設定する場合は複数のカンマで区切ります。

Sub Test()
    Dim name As String
    name = 1
    Dim id As Integer
    id = 100
    Dim value As String
    value = "bar"
    Application.Run "call_" & name, id, value
End Sub
 
Sub call_1(id As Integer, value As String)
    MsgBox id & value
End Sub

4.その他

冒頭のサンプルでは、そもそもセルの値を関数名ではなく引数にして同じ関数を起動する(その中で処理を振り分ける)という代替案もあります。

Sub Test()
    Dim name As String
    Dim i As Integer
    For i = 2 To 11
        name = Worksheets("Sheet1").Cells(i, 2).value
        call(name)
    Next i
End Sub
 
Sub call(name As Integer)
    '...
End Sub

が、要件によっては今回のような起動方法が必要となる場合もあるので、覚えていて損はないテクニックだと思います。

Comments [0] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3