access vbaで引数によって、関数を変えたい

このQ&Aのポイント
  • VBAを使用して、引数によって関数を切り替える方法を知りたいです。
  • Function 関数選択(関数)内で、条件分岐を使って引数に応じた関数を呼び出す方法を教えてください。
  • 戻り値を持つ関数を呼び出すために、引数に対応する関数を呼び出す方法を知りたいです。
回答を見る
  • ベストアンサー

access vbaで引数によって、関数を変えたい

引数名の関数を実行したいのですが、どうすればいいでしょうか? 【やりたいイメージ】 Function 関数選択(関数) 関数選択 = 関数() ← 引数の関数が"z"の場合、"Function z()"を呼びたい End Function -------------------- 呼び出す関数 -------------------- Function a() a = "a" End Function ~ Function z() z = "z" End Function -------------------------- "Function 関数選択(関数)"の中で、ifやswich すればできると思うのですが、ずらずら書くのもうっとおしいのでスマートにしたいと思っています。 call がいいと思ったのですが、戻り値がかえせません。 何かいい方法はないでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • m3_maki
  • ベストアンサー率64% (295/459)
回答No.5

No2 です。 >関数選択 = Eval(関数 & "()") > > を、関数選択 = Eval(関数 & "(" & 引数 & ")") 引数のデータ型が数値なら、これで OKです。 テキスト型なら Public Function 関数選択(関数 As String, 引数 As Variant) As Variant   関数選択 = Eval(関数 & "('" & 引数 & "')") End Function 返値の型とか、引数に NULL値が存在するかなど はっきりしない部分があるので ザックリとした回答になりますが。

a-z_A-Z
質問者

お礼

シンプルでわかりやすい回答をありがとうございます。 関数選択 = Eval(関数 & "('" & 引数 & "')") の "('" & 引数 & "')") のところの「’」ですが、 何で、ここに登場するの? って疑問が浮かびましたが、試してみるとうまくいきました。 とりあえず 「世の中の仕組みは、こんなものだ~」 と納得しています。 ありがとうございました。

その他の回答 (4)

  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.4

a-z_A-Zさん    引数が文字なのか数値なのか分かりませんが、Variant(無指定)の場合で 説明いたします。 ・引数が数値の場合はそのまま値を渡せば良いです。   答え= 関数選択("z",100)   ・引数が文字のの場合は"を付けて渡す必要があります。  注)VBの場合文字列に"を付ける場合は"を2つ続ける必要があります。   答え= 関数選択("a","""X""")      もし"を付けないで引数を渡した場合は    答え= 関数選択("a","X")      ↓ 答え= A(X)と同様な関数    なので変数Xの指定がないのでエラーになるかと思います。    Function 関数選択(関数 As String, 引数)  関数選択 = Eval(関数 & "(" & 引数 & ")") End Function Function a(引数)  a = "a" & 引数 End Function Function z(引数)  z = "z" & 引数 End Function    ご確認ください。

a-z_A-Z
質問者

お礼

ありがとうございます。 >注)VBの場合文字列に"を付ける場合は"を2つ続ける必要があります。 実は、追加の質問をした後に、いろいろと試してみました。 ダブルクォーテーションを増やしたり減らしたりと・・・ しかし、まさか3つも続けるとは思いませんでした。 いろいろと試した結果、引き数はあきらめ、引き数の値を返す関数をつくり、 その名前を入れると、とりあえずやりたいことが出来ました。 でも、改めてこのやり方で試してみたいと思います。 ありがとうございました。

  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.3

NO1です、   すみません、AccessとEXCELのマクロ(VBA)関数は同じだと思っていました。 AccessはEvaluateではなくEvalのようです。 よって次のようになります。    答え = Eval("a()") 答え = Eval("z()")  または 答え=関数選択("a") 答え=関数選択("Z")    Function 関数選択(関数 as String)  関数選択 = Eval(関数 & "()") End Function    Function a()  a = "a" End Function Function z()  z = "z" End Function    ご確認ください。

a-z_A-Z
質問者

お礼

ありがとうございます。 これで解決! と思ったのですが、呼び出す関数に引数が必要となりました。 >関数選択 = Eval(関数 & "()") を、関数選択 = Eval(関数 & "(" & 引数 & ")") とかやっているのですが、うまくいきません。 引数のある関数は無理なのでしょうか?

  • m3_maki
  • ベストアンサー率64% (295/459)
回答No.2

Access の場合は 「EVal 関数」 になります。 Eval 関数 http://office.microsoft.com/ja-jp/access-help/HA001228942.aspx

a-z_A-Z
質問者

お礼

ありがとうございます。 Eval 関数でいいみたいですが、さらに続きがあります。 その呼び出す関数に、引数があります。 引数がある場合が、うまくいきません。 どうすればいいのでしょうか?

  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.1

a-z_A-Zさん はじめまして。 Evaluateを使用すればできるかと思います。 答え = Evaluate("a()") 答え = Evaluate("z()")  または 答え=関数選択("a") 答え=関数選択("b")    Function 関数選択(関数 as String)  関数選択 = Evaluate(関数 & "()") End Function    Function a()  a = "a" End Function Function z()  z = "z" End Function

a-z_A-Z
質問者

お礼

ありがとうございます。 とてもかわいい猫ですね~ 猫好きの私としてはたまりません。 おっと、猫ではなくEvaluateですが、 subまたはfunctionが定義されていません。 ってでました。 何かライブラリの読み込みが必要なのでしょうか?

関連するQ&A

  • 引数のある関数と引数のない関数の設定

     お世話になっております。 PHPのプログラミングで関数をつくる際に、引数を渡す関数と引数がない関数がありますが、すでに定義済みの関数のように、引数がある場合と引数がない場合の両方を取り扱うにはどうしたらよいでしょうか? function example ($a) { if ($a == 0 || $a == '') { print '引数なし'; } else { print $a; } } のような関数で、 example(); という感じで引数を入れないと、 Warning: Missing argument … というエラーがでてしまいます。関数を example(''); と呼び出すと大丈夫なのですが。。。 プログラマーにとって基本的なことだと思うのですが、調べてもなかなか出てこないので質問させて頂きました。どなたかわかる方がいたらしたらおしえてください。 よろしくお願いします! }

    • ベストアンサー
    • PHP
  • fortran90 引数で渡された関数の呼び出し

    fortran90を始めて間もない者です。 メインプログラムより呼び出しているサブルーチンにユーザ関数を渡しています。 このサブルーチンを自前で作成するのが目的です。 引数で受け取った関数を、自前の別関数より呼び出すにはどうしたら良いでしょうか。 Cであれば関数のポインタをグローバルな変数にセットしてやれば可能だと思いますが・・・ !-------------------------------- subroutine sub(func1, a) real::a interface real function func1(x) real::x end function func1 real function func2(x) real x end function func2 end interface call sub2(func2, a) write(*,*) a return end subroutine sub !-------------------------------- real function func2(x) real::func2, x ! ここでfunc1を呼び出したい ! func2=func1(x) end function func2 !-------------------------------- subroutine sub2(funca, a) real::a interface real function funca(x) real::x end function funca end interface a=funca(10.) return end !-------------------------------- program main external func real a call sub(func, a) write(*,*) a end program !-------------------------------- function func(x) real func, x func=2.*x*x end function func

  • VBAでJavaのように関数の引数に関数を渡す方法

    やりたいことは、テキストファイルを読み込んで「一行ずつ何か処理」をさせたいです。 この、「一行ずつ何か処理」の部分を引数に渡し、関数の中身で「ファイルを1行ずつ読み込む」部分を実装する方法はないでしょうか。 <イメージ> Function ReadFile(path As String, eachFunc As Fcuntion)  Set fso = CreateObject("Scripting.FileSystemObject")  Set tso = fso.OpenTextFile(path)  Do Until tso.AtEndOfStream   Call eachFunc(tso.ReadLine)  Loop End Function 予め一行ずつ読み込む処理を作っておきモジュールとして使いたいです。 よろしくお願いします。

  • JSの高階関数とは?

    高階関数とは? 「関数を引数、戻り値として扱う関数」のことを高階関数と呼びます。 と聞いたのですが、関数が他の関数の引数として、ないしは戻り値とし使われている場合その引数、戻り値の関数のことを高階関数というのでしょうか? するとコールバック関数は引数として関数を使う場合のようですが、半分被りますよね?

  • Excel:メニューから関数に飛ぶ際に引数を持たせる

    Excel2003でマクロを組んでいます。 ThisWorkbookにて、  With Menu1   .Controls.add Type:=msoControlButton   With .Controls(1)    .Caption = "手順1"    .OnAction = "Jikkou"   End With  End With のように記述し、Menu1というオリジナルのメニューの中に、 「手順1」というメニューを表示させ、これを実行すると関数"Jikkou"が動くようにしました。 このJikkouという関数に、引数を持って行きたいのですが、 どのように記述すればよいでしょうか。 具体的には、異なるメニューを実行して同じ関数へ移動する際、 「どのメニューを選択してきたのか」によって、Jikkouの中で処理を分岐させたいのです。 引数を持たせられたら解決しそうだと思って質問しています。 他に何か方法があれば(例えば、それよりこちらの方が自然だ、のような方法があれば)教えていただきたいです。 以下、引数の持たせ方がわからず詰まった、自分の考えたコードです(勿論動きません)。 目的が伝われば幸いです。 ---▼ThisWorkbookの一部---------------------------  With Menu1   .Controls.add Type:=msoControlButton   With .Controls(1)    .Caption = "手順1"    a = 0    .OnAction = "Jikkou a"   End With  End With  With Menu1   .Controls.add Type:=msoControlButton   With .Controls(2)    .Caption = "手順2"    a = 1    .OnAction = "Jikkou a"   End With  End With ---▼関数Jikkou------------------------------------ Sub Jikkou(byVal a as integer)  if a = 0 then   msgbox "手順1から来た"  elseif a = 1 then   msgbox "手順2から来た"  end if End Sub

  • OpenOffice Basicで引数を2つ利用する関数が作れません

    OpenOffice Basicで引数を2つ利用する関数が作れません Open Office Calc 3.1.1を使っています。 できれば複数(3つ以上)引数を取る関数を作りたいのですが、 2つ引数を取ろうとすると演算結果が#NAME?になってしまいます。 切り分けにシンプルな関数を作ってみました。 以下で=test2(3,5)とすると結果が#NAME?になります。 Function test2(arg1 As Integer, arg2 As Integer) as Integer test2 = 3 + arg2 End Function #なお、関数内の演算内容はtest2 = arg1 + arg2でも変わらず#NAME?です 切り分けで以下を作ると=test3(3)で6が返されます Function test3(arg1 As Integer) as Integer test3 = 3 + arg1 End Function 関数名のタイプミスの可能性を排除するために、 test2関数を名前を換えずに引数の数を1つに変更してみると 計算できるのでタイプミスではないと思います。 やはり引数を複数とる取り方に問題があるように見えます。 お手数ですが何かアドバイスいただけないでしょうか?

  • 関数の引数の型と引数名を取得する方法

    こんにちは。 コンパイル時に関数の引数の型と引数名を取得する手段はありますでしょうか? 関数名は__FUNCTION__がありますが、引数をなんらかの方法で取得したいのですが手段はありますでしょうか? foo(int a0, int a1 ) なら"int a0, int a1"みたいな感じで取得できればと思っています。

  • 関数の引数のデフォルト値について

    PHP5.2.4を使用しています。 自作関数で、例えば数値や文字列を受け取る引数のデフォルト値を 「''」で入力されてないかをチェックする場合と、 「NULL」で入力されてないかをチェックする場合とでは、 どちらが良いというのはあるのでしょうか? function a($arg = '') {  if($arg == '')  {  } } //または function a($arg = NULL) {  if(is_null($arg))  {  } }

    • ベストアンサー
    • PHP
  • Excel VBA ParamArray 可変個引数の渡し方

    Excel VBAで 可変個引数関数Fanc1から、その引数を 可変個引数関数Fanc2に渡したい。 下記例では、A1=a, B1=b, C1=cのとき、#VALUE!となります。  Concatenate2(A1:B1,C1,"po")="abcpo" 問題無し  Fanc1(A1:B1,C1,"po")=#VALUE! Fanc1でも上と同じ出力にしたいのです。 Function Concatenate2(ParamArray MyArray()) As String Dim S As String Dim v As Variant Dim c As Variant For Each v In MyArray If TypeName(v) = "Range" Then For Each c In v S = S & c.Value Next Else S = S & v End If Next Concatenate2 = S End Function Function Fanc1(ParamArray MyArray()) As String Fanc1 = Concatenate2(MyArray()) End Function

  • VBAの関数で引数渡しでエラー

    関数呼び出しでObject型を渡したいのですが「引数の型が一致していません」との エラーになってしまいます。 以下のプログラムをどのように修正すればよいのでしょうか? Sub Test() Dim obj As Object Set obj = CreateObject("Scripting.Dictionary")     :   Sample(obj) End Sub Function Sample(obj As Object) End Function

専門家に質問してみよう