MsgBox関数★InputBox関数

わずかな知識で VBA!

MsgBox関数
InputBox関数


 

MsgBox関数とInputBox関数



  Excelを使用していると、様々なダイアログボックスを目にします。

  ここでは、その中でも一番簡単にダイアログボックスを表示できる
  エクセル VBAのMsgBox関数InputBox関数を説明します。

  エクセル VBAのMsgBox関数は、
  ユーザーに何かを伝えたり、
  メッセージと共に表示する7種類のボタンの組み合わせにより、
  ユーザーに処理を選択させることもできます。

  一方、エクセル VBAのInputBox関数は、メッセージを表示すると共に、
  ユーザーが入力できるテキストボックスを備えています。
      

わずかな知識で
VBA!



 
 MsgBox関数

  エクセル VBAのMsgBox関数は、ユーザーに操作手順等何かしらのメッセージを伝えたり、
  メッセージと共に表示する7種類のボタンの組み合わせにより、ユーザーに処理を選択させることもできます。

  それぞれのボタンには、クリックされた時の戻り値が決められていて、
  その戻り値により、行うべき処理を選択できるからです。

  メッセージだけを表示する場合と、戻り値を取得する場合でちょとだけその構文が違います。

    1.メッセージだけを表示する場合の構文

       MsgBox "処理を中断します。"

       

      これに、次のアイコンを表示する場合は、下記の様になります。

         警告メッセージ       「vbCritical」     組込定数  16
   
         問い合わせメッセージ  「vbQestion」    組込定数  32
   
         注意メッセージ      「vbExclamation」  組込定数  48
 
         情報メッセージ      「vbInformation」  組込定数  64


     MsgBox "処理を中断します!", 48

       

     これに、タイトルを変更したい場合は、次の様にタイトルを記入します。

      MsgBox "処理を中断します!", 48, "入力エラー"

       

      “ ” ダブルコーテーションで囲った部分がメッセージとして表示されますが、
     この部分を変数にすることもできます。
 
       keikokubun = “処理を中断します!”
       MsgBox keikokubun, 48, "入力エラー!"


     表の組込定数には、英語と数字が書いてありますが、どちらを使用しても同じです。

       MsgBox "処理を中断します!", vbExclamation, "入力エラー"
       MsgBox "処理を中断します!", 48, "入力エラー"



   2. 戻り値を使用して作業を選択する場合の構文

     まず、実際に、MsgBox関数でダイアログボックスにボタンを配置して、
     選択されたボタンにより処理を実行する例を紹介します。

        Sub tesuto()
           Dim modori As Integer

           modori = MsgBox("MsgBox関数について知りたいですか?", 36, "学習意欲の確認")
           Select Case modori
           Case 6
              MsgBox "「はい」が押されました。" & Chr(13) & Chr(10) _
                  & "続けてお読みください!", , "がんばりましょう!"
           Case 7
              MsgBox "「いいえ」が押されました。" & vbCrLf _
                  & "後悔しますよ!", , "残念!"
           End Select

        End Sub



     modori = MsgBox("MsgBox関数について知りたいですか?", 36, "学習意欲の確認")

           


     「はい(Y)」をクリックすると

           


     「いいえ(N)」をクリックすると

           

     となります。


  戻り値は下記の表のようになっており、数字であらわされています。

  変数の宣言として、「Integer」型を指定しています。
  文字列型の「String」でも動きますが、使用メモリーを節約したい場合は、
  この例のように「Integer」型が適当でしょう。

  変数の詳しい説明は、次章で行います。

      

 


  配置するボタンの種類、及び、表示するアイコンの引数
ボタン 組込定数


R = MsgBox("明日は休みますか?", 0)
vbOKOnly 0


R = MsgBox("明日は休みますか?", 1)
vbOKCancel 1


R = MsgBox("明日は休みますか?", 2)
vbAbortRentryIgnore 2


R = MsgBox("明日は休みますか?", 3)
vbYesNoCancel 3


R = MsgBox("明日は休みますか?", 4)
vbYesNo 4


R = MsgBox("明日は休みますか?", 5)
vbRetryCancel 5


   MsgBox関数の戻り値とユーザーが押したボタンの対応表

   
ボタン 戻り値 定義済み組込定数
1 vbOK
2 vbCancel
3 vbAbort
4 vbRetry
5 vbIgnore
6 vbYes
7 vbNo



      modori = MsgBox("MsgBox関数について知りたいですか?", 36, "学習意欲の確認?")

    ここでは、「36」を使用して、「はい」と「いいえ」ボタン、そして、 問い合わせアイコンを表示しています。
 
    36は上の表の「4」とアイコンの組込定数「32」の和です。
 
    これを別の表記で書くと

      modori = MsgBox("MsgBox関数について知りたいですか?", vbYesNo + vbQuestion, _
             "学習意欲の確認?")

    となり、また

      modori = MsgBox("MsgBox関数について知りたいですか?", 4 + 32, "学習意欲の確認?")

    とも書けます。

    表にある「引数に組合せる値」は、組込定数の代わりに使用します。
    好みの方法を一つ覚えておけば充分です。

    MsgBox関数によってダイアログボックスに配置できるボタンの種類と組合せは、上の表のとおりです。


  MagBoxに表示するのメッセージの改行

    長いメッセージなどの場合には、メッセージを改行して表示する必要にせまられます。
    その場合は、Chr関数を使用して改行することができます。

      MsgBox "「はい」が押されました。" & Chr(13) & Chr(10) _
          & "続けてお読みください!", , "がんばりましょう!"


          

     Chr(13) は「改行」(キャリッジリターン)
     Chr(10)は、「ラインフィード」       です。

     VBAには、キャリッジリターンを意味する 「vbCr」,ラインフィードを意味する「vbLf」
     そして、その両方を意味する「vbCrLf」という組込定数が用意されています。
  
     これを使っても同じことができます。

        MsgBox "「はい」が押されました。" & vbCrLf _
            & "続けてお読みください!", , "がんばりましょう!"


  Select caseステートメント

    メッセージだけを表示するときと違って、戻り値を取得する場合のMsgBox関数の構文は、
    必ず、引数をカッコで囲む必要があります。

 
    一般的に、戻り値の判定にSelect Caseステートメントを使用しています。
    Select Caeステートメントは、Ifステートメントと並ぶ条件分岐の方法です。
    くわしくは、後章「条件分岐のステートメント」をお読みください。

        Sub tesuto()
           Dim modori As Integer

           modori = MsgBox("MsgBox関数について知りたいですか?", 36, "学習意欲の確認")
           Select Case modori
           Case 6
              MsgBox "「はい」が押されました。" & Chr(13) & Chr(10) _
                  & "続けてお読みください!", , "がんばりましょう!"
           Case 7
              MsgBox "「いいえ」が押されました。" & vbCrLf _
                  & "後悔しますよ!", , "残念!"
           End Select

        End Sub


    の中で使用している

      Select Case modori
         Case 6
            MsgBox "「はい」が押されました。" & Chr(13) & Chr(10) _
              & "続けてお読みください!", , "がんばりましょう!"
         Case 7
            MsgBox "「いいえ」が押されました。" & vbCrLf _
                  & "後悔しますよ!", , "残念!"
      End Select


    という形で記述し、
    <modori>で示す戻り値をCaseに続く<値>と比べ、双方が同じならすぐ下の処理を実行します。

    これにどの条件にも該当しない処理を加える場合は、「Case Else」を追加して記述します。

      Select Case<変数>
         Case <値>
           <処理1>
         Case <値>
           <処理2>
         Case Else
           <処理3>
      End Select



   これをIfステートメントで書くこともできます。
   
     If modori = 6 Then
        MsgBox "「はい」が押されました。" & Chr(13) & Chr(10) _
            & "続けてお読みください!", , "がんばりましょう!"
     Elseif modori = 7 Then
        MsgBox "「いいえ」が押されました。" & vbCrLf _
             & "後悔しますよ!", , "残念!"
     End If


   Ifステートメントだと、条件式を何度も書かなければなりませんが、
   Select Caseステートメントは、比較する値だけを記述すればいいので、ソースがすっきりとします。

   この2通りの方法を、条件によって使い分けて使用します。



  InputBox関数

   エクセル VBAのInputBox関数とMsgBox関数の違いは、
   MsgBox関数が、アプリケーションから一方的に何らかのメッセージを示すだけなのに対して、

   InputBox関数で表示されるダイアログボックスは、ユーザーが入力できるテキストボックスを備えている点です。
   したがって、InputBox関数は、マクロの実行中に、ユーザーから必要なデータを取得する場合に使用します。

   InputBox関数に非常によく似たものにInputBoxメソッドがあります。

   この2つの一番の違いは、ダイアログを表示している間に、
   セルを選択できるかどうかということです。

   ダイアログボックスを表示している時にアプリケーションが操作できなくなる現象を、
   「アプリケーションモーダル」といいます。

   InputBox関数は、アプリケーションモーダルになり、
   InputBoxメソッドは、アプリケーションモーダルになりません。

  エクセル VBA InputBox関数の使用例

     Sub tesuto()
        Dim tosi As String
     100
        tosi = InputBox("あなたの年齢を入力してください!", Title:="年齢入力")
        If tosi = "" Then
           MsgBox "もう一度、あなたの年齢を入力してください!",16,”再入力!”
           GoTo 100
        Elseif IsNumeric(tosi) = false then
           MsgBox “入力された年齢がまちがっています。” & chr(13) & chr(10) _
                & "もう一度、あなたの年齢を入力してください!" ,16,”再入力!”
           GoTo 100
        End If
           Range("C5").Value = tosi

     End Sub



   もう、このプロシージャの意味はだいたい分かるようになりましたか?

   InputBox関数は、「キャンセル」が押された時には空の文字列を戻り値として返します。
   そこで、戻り値を収容する変数は、「文字列型」に設定しています。

   この例は、ウソでもいいから年齢を強制的に入力させるプロシージャです。

   InputBox関数で取得した年齢をセル“C5”に入力します。

   何も入力されずに「キャンセル」がクリックされた場合は、100に戻り、
   再び、InputBox関数で、年齢の入力を促します。

   また、入力された値が、文字列で、数字になっていない場合も考えられるので、
   IsNumeric関数でデータを数値として評価できるかも調べ、同じ作業を行っています。

   テキストボックスにあらかじめ入力方式の見本となるデフォルト値を表示させる場合は次の様にします。

    tosi = InputBox("あなたの年齢を入力してください!", Title:="年齢入力", Default:=25)

         



  InputBoxメソッド

    InputBoxメソッドも、InputBox関数と同じで、テキストボックスが配置されたダイアログボックスを表示して、
    ユーザーが入力したデータを取得します。

    InputBoxメソッドとInputBox関数の違いは、先に、アプリケーションモーダルについて説明しました。
    つまり、InputBoxメソッドでは、ダイアログボックスの表示中にマウスでセル範囲等を選択させ、
    その範囲を取得することもできます。

    範囲を取得する例

       Sub tesuto2()
          Dim sethani As Range

          On Error Resume Next
          Set sethani = Application.InputBox("印刷範囲をマウスでドラッグして指定してください!",  _
                    "印刷範囲", Type:=8)
          If sethani Is Nothing Then Exit Sub
          With ActiveSheet
             .PageSetup.PrintArea = sethani.Address
             .PrintOut
          End With

       End Sub


       参照セル変数「sethani」をRangeオブジェクトに宣言します。
       参照セルは、Setステートメントで、単独セルだけでなく、このように範囲を取得することもできます。

       では、InputBoxメソッドの構文の説明です。

       Set sethani = Application.InputBox("印刷範囲をマウスでドラッグして指定してください!",  _
                 "印刷範囲", Type:=8)


       InputBoxメソッドは、必ずApplicationオブジェクトに対して使用します。
      「Application」を省略すると、ExcelはInputBox関数と判断してしまいます。

   引数

     InputBoxメソッドには全部で8種類の引数があり、
     MsgBox関数やInputBox関数と大体同じものですが、特徴的なのは、「.Type」です。

       .Prompt :メッセージを入力 (省略不可)
       .Title   :タイトルを入力   (省略可)
       .Default :ダイアログボックスを表示した時に、
               入力用テキストボックスに初期値を表示する場合は入力  (省略可)
       .Type   :テキストボックスに入力するデータの型を数値で指定します。
      
      ここで指定したデータ型と異なる型のデータを入力すると「OK」ボタンをクリックしたときにエラーとなります。
      このときのエラー表示はExcelが行うので、エラーメッセージを用意しないで済むという利点もあります。

      たとえば、上のtesuto2の プロシージャを実行して、
      テキストボックスに「1」を入力して「OK」ボタンをクリックすると
     次の様なメッセージが表示されて、ダイアログボックスが開いたままとなります。

         

   

  InputBoxメソッドを使用する場合の注意点

    InputBoxメソッドは、「キャンセル」がクリックされると「False」が返されます。
    
    戻り値の変数を文字列型に宣言した場合は、
    戻り値をダブルコーテーションで囲って”False”と比較すれば対応できますが、
    その他の場合は「Variant型」以外の変数に宣言すると、
    「キャンセル」がクリックされた場合にエラーとなり対応できません。

    「キャンセル」がクリックされても関係無いようなプロシージャにするか
    戻り値の変数を「Variant型」に宣言しましょう。

    Tesuto2の場合も、「キャンセル」がクリックされると「False」を返します。
    そこで、「On error Resume Next」を記述してエラーに備えています。

    On error Resume Nextは、「エラーが発生したら無視して次へ」というような意味です。
    そして、選択範囲が空なら印刷処理に進まずにプロシージャを終了します。

        If sethani Is Nothing Then Exit Sub    がそれです。

    Ifステートメントは他にも
    
       If sethani Is Nothing Then Goto 100

    などのように、「Then」に続けて処理を指定する方法もあります。
    詳しくは、「条件分岐のステートメント   If Then Else,Select Case」で説明します。

        


  わずかな知識でVBA!       TOP

  マクロで何ができる?   ユーザーインターフェース    マクロの記録   マクロの登録
 
  イベントについて      マクロの編集とデバッグ    ゲームで覚えるVBAプログラミング
 
  オブジェクトの操作     セルの操作            MsgBox関数・InputBox関数
 
  変数の型           ヘルプの活用          イミディエイトウィンドウ  
 
  Withステートメント      Setステートメント
 
  条件分岐のステートメント   If Then Else,Select Case
 
  繰り返しのステートメント   Do Loop
 
  繰り返しのステートメント   For Next
  
  ダイアログボックスを作ってみよう1                 ダイアログボックスを作ってみよう2 【実践編】
  
  ActiveXコントロール     各コントロールのプロパティ       文字列の操作        Endプロパティ

  リンク・検索   相互リンク    マイプロフィール       YouTubeの部屋 

Copyright (C) わずかな知識でVBA! All Rights Reserved