みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBAでFunctionの使い方

エクセルのVBAでFunctionの使い方がいまいちよくわかりません。

Function msg()
Dim h As Integer
h = Hour(Time)
Select Case h
Case Is < 12: msg = "おはようございます。"
Case Is < 17: msg = "こんにちは。"
Case Else: msg = "こんばんは。"
End Select
End Function

Sub 挨拶()
MsgBox msg
End Sub

とやってみたら一応正しく動くようですが、これであっているのでしょうか?
他の例などを見るとFunction msg()の()内にも何か入れなければならないようなのですが、わかりません。

投稿日時 - 2007-07-01 15:49:25

QNo.3130664

困ってます

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

Functionは、関数と約されていますように、パラメーター(引数)を与えて、戻り値を得るという目的で使われる場合が多いです

moooonさんの例では、引数が有りませんが、特に問題は有りません

もし、例のFunction msg()を、関数らしくするとすれば、こんな感じになります

Function msg(ti)
 Dim h As Integer
 h = Hour(ti)
 Select Case h
  Case Is < 12: msg = "おはようございます。"
  Case Is < 17: msg = "こんにちは。"
  Case Else: msg = "こんばんは。"
 End Select
End Function

Sub 挨拶()
 MsgBox msg(Time) 'Timeの値が引数として、tiに渡されます
End Sub

投稿日時 - 2007-07-01 16:39:04

お礼

なるほど、引数があってはじめて関数なんですね。
ありがとうございました。

投稿日時 - 2007-07-02 23:23:04

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

関数について
(A)引数
(1)引数があり、
(2)引数なし、
(3)一般にあるとしているが今回なし(Optional)
(B)値を返す点で
(1)値を返さない
(2)値を返す
と分けてみると
質問は(A)(2)且つ(B)(1)のケースですが
一般には(A)(1)且つ(B)(2)が多いわけです。
(3)(1)はSUBプロシージャーと変わらなくなる。
今回はVBA(例えばエクセル)ですので、Functionの中で
他のセルの値や書式などを一切触らせてくれません。
言語によっては値を返すのが基本というのがあり、Subプロシージャと余り変わらず、なんでもできるのもある。
(1)値を計算(導出)主体
    (A)値を返すが本旨
    (B)主義を通して、VOIDを宣言
(2)計算以外の処理をするが主体
引数は今回はTimeというシステムから時刻を採る特殊なものだったので、引数が無くても結果を返せたのです。
送でなければ、円周率パイを計算するような定数と計算だけで値が出る以外のケースでは、処理の材料になるデータ(エクセルの場合はセル番地を指定して知らせるセルの値)が必要です。
すなわち諮問者は特殊なケースの関数を書いて、質問しているわけです。
エクセルVBAでは、普通のエクセルワークシート関数が、99%()内に引数があるように、通常は引数はあるといえるでしょう。
数学の関数のように
セルの値ーーー(普通関数・ユーザー関数で)写像ーーー>値
ですから元の値が無いケースは、例外的です。
ーーー
エクセルVBAでは、Functionはユーザー定義関数で使うと思えばよいと思うが、他のプログラム言語を見通すと色々あるようです。

投稿日時 - 2007-07-01 21:02:15

お礼

ありがとうございました。
勉強になります。

投稿日時 - 2007-07-02 23:26:45

ANo.3

そうですね。
Functionの使用(利用)方法には、いろいろありますので、あながち あなたのような 使用方法も 否定出来ません。
しかし、本来は、もっと違った方法が、一般的です。
詳細は、下記 URLを参照してください。

1.お勧め URLは下記から Excel(エクセル) VBA入門:ユーザー定義関数を利用するから [ Functionプロシージャ(Procedure) ]を参照します。
http://pcsoft.okwave.jp/kotaeru_reply.php3?q=3130664

2.次点 URLは、http://www.moug.net/boards/index.htm
から入って、左ペイン から 即効テクニック を選択し
Function を検索してください。

一発で 開けるか自信ないです(登録制なので)が、URL は、http://www.moug.net/tech/exvba/0150074.htm をクリックして見るのも良いでしょう。( 例; 引数が不定の場合-ParamArrayキーワード)
追加です。下記も参考にね。
http://www.moug.net/tech/exvba/0090039.htm

3.3番目は、ステートメント(基礎編)から
11 Function ステートメント をクリックしてみてください。
サンプルもありますので、初心者向きでしょう。

参考URL:http://www.geocities.jp/cbc_vbnet/kisuhen/statement.html

投稿日時 - 2007-07-01 16:44:44

お礼

ありがとうございました。
参考になりました。

投稿日時 - 2007-07-02 23:23:56

はい、正しいです。

投稿日時 - 2007-07-01 16:29:24

お礼

ありがとうございます。

投稿日時 - 2007-07-02 23:21:51

あなたにオススメの質問