• ベストアンサー

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()の()内にも何か入れなければならないようなのですが、わかりません。

  • moooon
  • お礼率70% (118/167)

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

  • ベストアンサー
  • ASIMOV
  • ベストアンサー率41% (982/2351)
回答No.2

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

moooon
質問者

お礼

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

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.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はユーザー定義関数で使うと思えばよいと思うが、他のプログラム言語を見通すと色々あるようです。

moooon
質問者

お礼

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

  • Nayuta_X
  • ベストアンサー率46% (240/511)
回答No.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
moooon
質問者

お礼

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

回答No.1

はい、正しいです。

moooon
質問者

お礼

ありがとうございます。

関連するQ&A

  • エクセルVBAのFunction簡素化したいのです・・・。

    時間により挨拶の内容を変えるCODEを作りました。一応、当初の目的どおりのは答えを返すのですが、時間と分で2つFunctionが出来てしまいます・・・・。 あと、もっとスマートなやり方はないものかと質問させていただきました。 くだらないと思われそうですがなにとぞよろしくお願いします。 Sub 挨拶test() MsgBox hmsg(Time) & Chr(10) & messe(Time), , "*・゜゜・*:.。. .。.:*・゜゜・*" End Sub Function messe(t) As String t2 = Hour(t) t3 = Hour(TimeValue(t) + TimeValue("01:00")) m = Minute(t) Select Case m Case Is < 15: messe = t2 & "時を回りましたね。 。(^o^)/" Case Is < 30: messe = "もうすぐ" & t2 & "時半になりますね。 (〃^∇^〃) " Case Is < 45: messe = t2 & "時半を過ぎてますね。 (=´▽`)ゞ" Case Else: messe = "もうすぐ" & t3 & "時になるんですね。(^∇^)" End Select End Function Function hmsg(t) As String Select Case Hour(t) Case Is <= 11: hmsg = "おはようございます。" Case Is < 17: hmsg = "こんにちは。" Case Else: hmsg = "こんばんは。" End Select hmsg = UCase(Environ("UserName")) & "さん、" & hmsg End Function

  • エクセルVBAのFunctionについて

    エクセル2000です。 以下は、時間を与えれば、それに相当する挨拶が返ってくるFunctionのつもりです。 一応期待通りの働きはしてくれます。 質問は、Functionから ”messe” として返ってくる文字列を、Function内部で生成している、”hmsg”、”mes”、”s”、”kao(i)” にわけて取得できないかということです。 もちろん Functionを複数つくったり、返ってくる文字列”messe”を、”。”の位置を取得してMID関数等で分ければ取得できるのはわかるのですが、そんな手間をかけず、たとえば、MsgBox hmsg のような感じで簡単に ”hmsg”、”mes”、”s”、”kao(i)” それぞれの文字列を取得する方法があったらご教示くださいませ。 Sub test01() MsgBox messe(TimeValue("17:46")) End Sub Function messe(t As Date) As String Dim t2 As Integer, t3 As Integer, m As Integer, i As Integer, n As Integer Dim kao Dim s As String t2 = Hour(t) t3 = Hour(TimeValue(t) + TimeValue("01:00")) m = Minute(t) kao = Split("o(^o^)/,(*^o^*),(*´∇`*),(= ̄▽ ̄=)V,(〃^∇^〃),(=´▽`)ゞ,(^∇^),(〃^∇^)o,ヾ(@⌒ー⌒@)ノ, (#^。^#),o(^-^)o,ヾ(=^▽^=)ノ, \(*^▽^*)/ ,( ̄ー ̄)v", ",") Select Case t2 Case Is < 11: hmsg = "おはようございます。" Case Is < 17: hmsg = "こんにちは。" Case Else: hmsg = "こんばんは。" End Select Select Case m Case Is < 15: mes = t2 & "時を回りましたね。 " Case Is < 30: mes = "もうすぐ " & t2 & "時半になりますね。 " Case Is < 45: mes = t2 & "時半を過ぎてますね。" Case Else: mes = "もうすぐ " & t3 & "時になるんですね。 " End Select Select Case t2 Case 0: s = "とうとう日付が変わりました。 " Case 1, 2, 3, 4: s = "からだに気をつけてね。 " Case 5, 6: s = "朝になっちゃいました。 " Case 7, 8, 9: s = "また一日が始まりましたね。 " Case 10: s = "お昼にはまだもうちょっと・・・。 " Case 11: s = "おなかが空いちゃいました。 " Case 12: s = "お昼ですよ~。 " Case 13: s = "食後は眠くなっちゃいます。 " Case 14: s = "そろそろおやつが欲しいかも。 " Case 15, 16: s = "午後は長いですね。 " Case 17: s = "お疲れさまです。 " Case 18: s = "残業、お疲れさまです。 " Case 19, 20: s = "そろそろ切り上げませんか。 " Case 21, 22: s = "こんな遅くまで大変ですね。 " Case 23: s = "日付が変わっちゃいますよ。 " Case Else: s = "がんばってね。 " End Select Randomize i = Int(Rnd() * 14) messe = hmsg & mes & s & kao(i) End Function

  • Functionの使い方が分かりません。

    ACCESS 2013環境でVBAを使用しています。 プログラムが長い上、使用する箇所が多くて困っています。 Functionで、使いたい時だけ呼び出したいのですが うまく行きません。 二つのテキストボックスに入力された、文字を組み合わせて 文字列を生成するプロシージャを作成しています。  txt1の値が、岡山  txt2の値が、オカヤマ の時 先頭の文字列が ア行、続きは _岡山 となるよう AscW関数で文字コードで一度抽出し, select文で判別しています。 コードは --------------------------------------------- Private Sub コマンド1_Click() Dim kanji As String Dim katakana As Integer Dim sento As String Dim hensuu As String kanji = Me.txt1 katakana = AscW(Left(Me.txt2,1)) Select Case katakana Case 12450 To 12458 sento = "ア行" Case 12459 To 12468 sento = "カ行" ~(中略)~    Case Else End Select hensuu = sento & "_" & kanji MsgBox hensuu End Sub --------------------------------------------- となっています。 Select Case文が長いのと、複数のフォーム上で実行させるボタンごとに 同じコードを記述していて、最近Accessの起動が遅くなってきました。 Select文をFunctionから呼び出し、最終的にはモジュールから呼び出しに 書き換えたいのですが、書き方が良く分かりません。 試したコード --------------------------------------------- Function moji(ByRef katakana As Integer,sento As String) Select Case katakana Case 12450 To 12458 sento = "ア行" Case 12459 To 12468 sento = "カ行" ~(中略)~    Case Else End Select End Function Private Sub コマンド1_Click() Dim kanji As String Dim katakana As Integer Dim sento As String Dim hensuu As String kanji = Me.txt1 katakana = AscW(Left(Me.txt2,1)) sento = moji(katakana) hensuu = sento & "_" & kanji MsgBox hensuu End Sub --------------------------------------------- 多分、大きく間違っているのではないかと思うのですが どのように修正したらよいでしょうか

  • 初歩的な事だと思います。 Sub または Function が定義されていません。

    VBAの本を買ってきて、勉強をしているのですが、テキストに書いてある通り入力しても「Sub または Function が定義されていません。」となってしまいます。 Sub IfSample() Dim intData As Integer intData = clntInputbox("数値を入力して下さい", ("データ入力")) Select Case ingData Case 1 To 10 MsgBox "入力された値は1以上、10以下です" Case 10 To 100 MsgBox "入力された値は10より大きくて、100以下です" Case Else MsgBox "入力された値は100より大きいです。" End Select End Sub 実行すると、エラーがでて、Sub IfSample()が黄色く、 clntInputboxが反転された状態になります。 テキスト通りに入力できているか、なんども確認したのですが、特に間違っていないと思います。どこが悪いのでしょうか?

  • Select Caseステートメント 「Is」

    VBAについて質問です。 http://excelvba.pc-users.net/fol6/6_2.html の Sub test() Dim intPoint As Integer intPoint = InputBox("点数を入力してください") Select Case intPoint Case Is >= 80 MsgBox "優です。" Case Is >= 70 MsgBox "良です。" Case Is >= 60 MsgBox "可です。" Case Else MsgBox "再テストです。" End Select End Sub は、 なぜ Sub test2() Dim intPoint As Integer intPoint = 75 Select Case intPoint Case intPoint >= 80 MsgBox "優です。" Case intPoint >= 70 MsgBox "良です。" Case intPoint >= 60 MsgBox "可です。" Case Else MsgBox "再テストです。" End Select End Sub では、だめなのでしょうか? test2を実行すると、 Case Elseの MsgBox "再テストです。" になってしまいます。 本当は、"良です。"が正しいのに。 testをF8でステップインしながら実行した時に、 「Case Is >= 80」 の来た時に、isにカーソルをあてても、InputBoxで入力した数値が表示されません。 なぜ、この場合、Case intPoint >= 80 ではダメなのか理由をご教授ください。ご回答よろしくお願いします。

  • VBAの解読依頼です。

    Windows2000、Access2000です。あるホームページよりVBAをコピーしました。内容としては起動時のShift+Enterを許すか否かというものです。 Function ChangeProperty(strPropName As String, varPropType , varPropValue) As Integer On Error GoTo エラー Dim dbs As Database, prp As Property Const conPropNotFoundError = 3270 Set dbs = CurrentDb dbs.Properties(strPropName) = varPropValue ChangeProperty = True Exit Function エラー: If Err = conPropNotFoundError Then Set prp = dbs.CreateProperty(strPropName,varPropType, varPropValue) dbs.Properties.Append prp Resume Next Else ChangeProperty = False Exit Function End If End Function Function NoShiftKey() Dim msg1 As String Dim msg2 As String msg1 = "有効" msg2 = "無効" Select Case InputBox("パスワード") Case 1234'パスワード ChangeProperty "AllowBypassKey", dbBoolean, True MsgBox msg1 Case 0 ChangeProperty "AllowBypassKey", dbBoolean, False MsgBox msg2 Case Else ChangeProperty "AllowBypassKey", dbBoolean, False MsgBox msg2 End Select End Function これをコマンドボタンクリック時のイベントにします。(参照設定にてDAO3.6にチェックをいれました。) しかし、「dbs.Properties(strPropName) = varPropValue」の一文で「プロパティが見つかりません。」と出ます。そこで、このVBAを解読して頂ける方、どこをどう直すべきなのか、是非ご教授ください。 よろしくお願いします。

  • エクセルVBA Select Case いついて

    現在時間を判断してあいさつを出すVBAを書こうとしましたがうまくいきません。 どこが悪いのかご教示くださいませ。 Sub メッセージ() Dim MG As String Select Case Time Case Time < "16:00:00" MG = "こんにちは。" Case Time < "12:00:00" MG = "おはようございます。" Case Time >= "16:00:00" MG = "こんばんは。" End Select MsgBox MG End Sub

  • VBA初心者なのですが(Userformについて)

    まずは質問ご覧いただきありがとうございますm(_ _)m さっそくなのですが、次のプログラムを打つとSelect Caseのところで”指定されたオブジェクトは見つかりません”と出てしまうのですがなぜでしょうか。回答お待ちしております。 Private Sub CommandButton2_Click() Dim msg As String, i As Integer Dim ii As Integer, msg2 As String For i = 1 To 3 If Controls("CheckBox" & i).Value = True Then msg = msg & Controls("CheckBox" & i).Caption & vbCrLf End If Next i For ii = i To 2 If Controls("OptionBotton" & i).Value = True Then msg2 = msg2 & Controls("OptionBottob" & i).Caption & vbCrLf End If Next ii Select Case Controls("CheckBox" & i).Value & Controls("OptionBotton" & i).Value Case Controls("CheckBox" & i).Value = True & Controls("OptionBotton" & i).Value = False MsgBox msg & "がチェックされてます" Case Controls("CheckBox" & i).Value = False & Controls("OptionBotton" & i).Value = True MsgBox msg2 & "オン" Case Controls("CheckBox" & i).Value = True & Controls("OptionBotton" & i).Value = True MsgBox msg & "がチェックされています" & vbCrLf & msg2 & "オン" Case Else MsgBox "チェック又は、オンにしてください" End Select End Sub

  • VBA のメッセージボックスに・・・

    Private Sub CommandButton1_Click() Dim intMsg As Integer Dim x As Double x = Val(Cells(3, 2).Value) / Val(Cells(2, 2).Value) ^ 2 Cells(2, 5) = x intMsg = MsgBox("指数は&x&" & vbCrLf & "&z&です。") Select Case x Case 0 To 18 MsgBox "やせぎみ" Case 19 To 25 MsgBox "普通" Case 26 To 30 MsgBox "太り気味" Case Else MsgBox "危険" End Select End Sub ってプログラムを組んだのですが メッセージボックスに結果が表示されません。 計算して出た値を、メッセージボックス内のxとzで表示させたいのですが・・・ &ではさむ?だけではだめなんですか?

  • Excel VBAを簡素化したいのですが動きません

    お世話になります。VBA初心者です。 下記TESTは動くのですが、『If myINT= Then』が永遠に続くので簡素化したく 『Rows("myINT : myINT").Select』これを入れてみたのですが全く動きません。 簡素化した記述を教えて下さい。宜しくお願い致します。 Sub TEST() Dim myINT As Integer myINT = ActiveSheet.Cells.SpecialCells(xlLastCell).Row   If myINT = 1 Then    Rows("1:1").Select    ElseIf myINT = 2 Then    Rows("2:2").Select   ElseIf myINT = 3 Then    Rows("3:3").Select   Else MsgBox "TEST" End If End Sub

専門家に質問してみよう