• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel2003 VBA Functionの定数に関して教えて下さい)

Excel2003 VBA Functionの定数に関する回避方法

このQ&Aのポイント
  • Excel2003 VBA Functionの定数に関して、シート上の値を使用する場合、定数を宣言するか変数として扱う方法がありますが、どちらも利点と欠点があります。
  • 定数を宣言する方法では、同じ定数を複数の場所で宣言する必要があり、後からプログラムを書き直す際に不便です。
  • 変数として扱う方法では、関数の呼び出し時に引数として渡す必要があり、見た目がごちゃごちゃして見にくくなります。Constを使用する方法もありますが、シート上のデータを代入したい場合には不向きです。他のスマートな方法があるかどうか、教えていただけますか?

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

  • ベストアンサー
  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

標準モジュールで Public A As Integer Public B As Integer Public C As Integer と宣言して Private Sub Workbook_Open() A = Worksheets(x).Cells(3, 5) B = Worksheets(x).Cells(3, 6) C = Worksheets(x).Cells(3, 7) End Sub で代入して利用すればいかがですか

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

>一つ目の方法では、こういったFunctionの数が増えてくると、 >同じ定数を複数の場所で宣言することになり、後からプログラムを書き直そうとしたときに >極めて不便です。 本来、こういう質問はご自身が工夫するしかないと思うし、スマートって格好良さだと思いますが、そういうスマートさというよりも結果論で収まってしまうものです。それを他人に求めても、私は、どうしようもないものだと思います。 それぞれの回答者の方のご意見もっともですが、私の視点からすると、「Functionの数が増えてくる」という言葉に引っかかります。Function が増えるということに疑問を感じます。おそらく、Sub プロシージャで処理するべきものを、Function ユーザー定義にしているのだろうと思います。どこかで設計自体が間違っているとしかいいようがないですね。いまさらと言われても困るかもしれませんが、Sub プロシージャでセルの値を拾えば、それで済むはずです。 何も面倒なはずはないので、それでうまくできないようなら、技術的な問題だと思います。

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

関数になら、変数になる部分は引数にするべきだと思います。 Function test(x, y, A, B, C) Z=(1,2,Cells(3,5).Cells(3,6),Cells(3,7)) ただ、A,B,Cはほとんど変更がないとのことだと思いますので、デフォルト値 を指定し、A,B.Cを省略できるようにすれば便利かと思います。 Function test(x, y, Optional A = 1, Optional B = 2, Optional C = 3)   test = A * x + B * y + C End Function 関数の呼び方は以下のように指定することができます。 z = test(1, 2) z = test(1, 2, Cells(3, 5).Cells(3, 6), Cells(3, 7)) z = test(1, 2, , , Cells(3, 7)) z = test(1, 2, C:=Cells(3, 7))

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

>Function test(x, y, A, B, C) WindowsのAPIを使っていると、引数の5個位あたりまえで、どうって事はないと思いますが... 構造体を使えばすっきりしますか? Type myType A As Range B As Range C As Range D As Range E As Range End Type Sub test() Dim mt As myType With mt Set .A = ActiveSheet.Range("A1") Set .B = ActiveSheet.Range("A2") Set .C = ActiveSheet.Range("A3") Set .D = ActiveSheet.Range("A4") Set .E = ActiveSheet.Range("A5") End With Debug.Print funcTest(mt) End Sub Private Function funcTest(mt2 As myType) With mt2 funcTest = .A.Value + .B.Value + .C.Value + .D.Value + .E.Value End With End Function

関連するQ&A