ユーザーインターフェース

わずかな知識で VBA!

ユーザーインターフェース


    

ユーザーインターフェースを使ったマクロ



  ここでは、VBAプログラミングの魅力を感じてもらうために、

   ユーザーインターフェース

 と呼ばれるものを作成した簡単な例を紹介します。

   VBAには、いろいろなダイアログボックスが用意されていますが、

  それら既成のダイアログボックスでは満足できない場合には、

  オリジナルのダイアログボックスを作成することができます。

  

わずかな知識で
VBA!




   ユーザーインターフェースとは、一般的には、画面上の操作手段のことをいいますが、
  マクロで作成したダイアログボックス(ユーザーフォーム)もユーザーインターフェースです。

  このユーザーインターフェースとなる、オリジナルのダイアログボックスは、
  Excelの「マクロの記録」で作成することはできません。

  VBAの知識を必要とする由縁ですが、

  オリジナルのダイアログボックスを作成することは、
  あなたが考えていたものより、はるかに簡単だと思います。



  ユーザーインターフェースを使用した入力作業は、

  セルを選択して、直接データを入力する代わりに、ユーザーインターフェースに直接データを入力します。
  そのデータを、マクロにより、決められたセルに転記する仕組みを作成しておけば、
  Excelの操作に不慣れな人でもデータ入力が簡単に行えます。

 
  さらに、ユーザーインターフェースを使用すると、フールプルーフ(ブービートラップ)を設けることができ、
  入力ミスや、操作ミスを防ぐこともできるというメリットもあります。

 
 まるっきりの初心者の方は、ここから、次の「マクロの記録」に進んだほうがいいかも知れませんが、
 ざっと読み飛ばしてください。



  プログラムの動作説明

   ここでは、理解しようとしないでください。
   詳細な説明は、
ダイアログボックスを作ってみよう2【実践編】で行っています。

   作業の流れと、プロシージャの行数ぐらいを感じ取っていただいて、
   できたら、「簡単にできるジャン!」と思っていただければOKです。



   図1のような納品書モドキの入力表に、
   図2の表に記載してある商品の名称と個数、及び、個数により異なる単価を入力するためのマクロです。

   つまり、Excelの簡単な表をデータベースとし、その検索と入力作業を行います。

   VBAでデータ検索等を行う際の基礎知識が満載されています。

      ダウンロードして使いながら確認してください。


マクロを有効にして、ダウンロードしたファイルを開いてください。

Download DBox.lzh (Excel文書(圧縮)) (89Kバイト)


図1

  動作説明のための、

  簡単な入力表です。
図2

  コード、商品名、個数により

  異なった単価が、

  入力されている価格表です。


  既に、仕事でExcelを利用されている方は、
  このマクロと同じような事を「VLOOKUP 」や「HLOOKUP」等の関数を使用して作成、利用されていると思います。

  ですが、その入力作業には、最低でも、コード番号と商品名が記入されたコード表が、必要になります。

  また、入力位置も自分で探さなければなりません。

  前もって、上記の関数等を入力表の全てのセルに入力しておく必要があり、
  ファイルも重くなって、98以前のパソコンでは、ちょくちょくフリーズしました。


  このマクロでは、入力用のコード表も必要としません。
  画面上に表示されるユーザーインターフェースで、それらを確認しながら入力できるからです。


  作成するユーザーフォームはたったの2つ。

  「マクロ表示」を実行すると、下のユーザーフォームが表示されます。

作業選択フォームの
  「キャンセルボタン」:

「作業選択」のフォームを消し

作業をキャンセルします。

作業選択フォームの
  「入力ボタン」:

入力フォームを表示します。


   この簡単なダイアログボックスが
  今回の処理を行うための
  ユーザーインターフェースとなります。


  フォームを表示する前の下準備として、

  「コード」のコンボボックスに、
  コード番号と品名をセットしておきます。

  そうすることによって、
  図のようにコンボボックスの右側にある
 「▼」ボタンで参照できるようになります。

  
  ここで、商品を選ぶと、「コードボックス」にはコードが、「名称ボックス」にはその名称が入力されます。

  次に数量を入力すると、商品の個数によって異なる単価が正しく選択されて、「単価ボックス」に表示されます。


  この例では、名称ボックスに入力しておく商品数が少ないので、これで済みますが、
  実際には、商品数もこの例以上に多く、下記のように、項目別に表示するというような工夫が必要になります。





作業選択フォームの
  「修正ボタン」:

 修正フォームを表示します。


  この例の場合、商品の個数を修正するときには、手作業で修正しても良いのですが、

  個数により単価が変わるため、入力ミスの原因にもなります。

  また、入力された製品を別のものに修正する場合には、
  入力時と同じように、コードを選択して修正した方が、楽に行えます。


  ただし、修正したい部分は、ユーザーにしかわかりません。

  そのため、修正時にはユーザーに修正行のコードの入力位置を選択してから、
  マクロを実行してもらうようにしています。


  作業選択フォームの「修 正」ボタンをクリックすると、次のメッセージが表示され、
  ユーザーに確認してもらい、「はい」なら処理を続行し、「いいえ」なら使用方法を説明するメーセージを表示し、
  使い方を説明しています。

  「作業選択」のフォームに直接記入しておくのも手ですが、
  ろくに読まずにボタンを押す、8本足の方もたくさんいるので、このようにワンステップおくことも必要です。

                    

 
 右側の確認メッセージで「はい
(Y)」の場合:

  選択している行に記入されている内容を読み込み、
  ユーザーフォームに記入してから、
  ユーザーフォームを表示します。



  

 

 「いいえ(N)」の場合

   次のメッセージが表示され、

   「OK
」で処理を終了します


  「入力」フォームと「修正」フォームは、色とタイトルを変えていますが、
  ユーザーフォーム自体は、同じものを使用しています。

  つまり、作成したユーザーフォームは、3つにみえますが、
  「作業選択」と「入力、修正の兼用」フォームの
2つだけです。

  

  
  ユーザーインタフェースによる入力作業。

  コンボボックスの右側にある「▼」ボタンをクリックし、表示された商品名をマウスで選択すると、
  その製品名と製品単価がそれぞれのボックスへ自動的に入力されます。


  ユーザーは、商品を選択し、個数を入力後「入 力」ボタンをクリックするだけです。

  マクロで空白行を捜してワークシートに入力するので、入力位置を捜す必要はありません。

  また、製品名、製品単価は、単価表から読み込まれるので、
  入力する製品名や個数により異なる単価を間違えるというミスも防げます。

  あたりまえですが、単価も入力時に完璧にチェックしておけば、確実に毎回同じ単価が入力されます。

  
  「修 正」ユーザーフォームは、選択した行に入力されること以外は、
  「入力」ユーザーフォームと同じ作業を行います。



  作 業 手 順

  1.「入力」フォームの作成

  2.「作業選択」フォームの作成

  3.「作業選択」フォームを表示するマクロの作成

  4. 「入力・修正」フォームの作成

  5.ツールバーを作成し、3.の【「作業選択」フォームを表示するマクロ】をボタンに登録する。

  以上です。

  内容的には、あとで説明する「サイコロゲーム」よりは簡単ですが、
  各ActiveXコントロールの作成、設定が必要になります。

  詳しい説明は、「ダイアログボックスを作成してみよう!」ですることにして、

  ここでは、

  このプログラムを動作させるのに必要なプロシージャを紹介し簡単な説明だけします。

  今の段階では理解する必要はありません。
  ダウンロードして試してみてください。

マクロを有効にして、ダウンロードしたファイルを開いてください。

Download ダイアログボックス.xls (89Kバイト)

     *Excelの初期設定では、「マクロのセキュリティ」が「高」に設定されています。
     マクロを動作させるためにはこの設定を「中」以下に変更する必要があります。


     「マクロのセキュリティ変更方法

           Excelのツールバーの「ツール(T)」 → 「マクロ」 → 「セキュリティ」
          
           により、セキュリティレベル「中」を選択してOK

           Excel2007では、

           左上にある「Excelボタン」→「Excelのオプション(I)」→「セキュリティセンター」→「セキュリティセンターの設定」

           で、マクロを有効にしておきます。



それぞれのプロシージャ

   (イベントに対して入力するSub から End Subまでに入力された処理をプロシージャと呼びます。)

 まず、「作業選択」フォームを表示するためのマクロです。

   Sub makuro()

    マクロ.Show

   End Sub


 「作業選択」フォームには、
 「マクロ」という名前を付けてあり、それを呼び出しています。

  つぎに、「マクロ」フォームの各ボタンに設定したマクロです。


  「入力ボタン」に設定したプロシージャ

  Private Sub CommandButton1_Click()
    '
    kombosettei             
1
    '
フォームを入力用に設定
    With 入力              
2
      .Caption = "入 力"
      .BackColor = &HC0FFFF
    End With
    Unload マクロ            
3
    入力.Show              
4
  End Sub



 1.「入力・修正」フォームのコード(コンボボックス)の初期設定をするプロシージャ(kombosettei)
   を実行し、コンボボックスにコード番号、商品名等をセットします。

   

 2.「入力・修正」フォームに表示するフォーム名を「入力」にし、
   バックカラーを「薄い黄色」に設定してから、

 3.「作業選択」フォーム(マクロ)を画面から消し、

 4.「入力・修正」フォームを表示します。

  使用した色には意味はありません。ユーザーが「入力」と「修正」を区別しやすく配慮しただけです。  


    「修正」ボタンに設定したプロシージャ

      Private Sub CommandButton2_Click()
        Dim r As Integer
'
        r = MsgBox("修正行のコード位置を選択していますか?", 36, "確認!")                
1
        Select Case r
        Case 7
           MsgBox "修正行のコード位置を選択してから実行してください!", 64, "作業手順!"
           Unload マクロ
           Exit Sub
        End Select

        kombosettei                                       
 2
        '
フォームを修正用に設定、修正行の値代入
        With 入力                                         
3
.           Caption = "修  正"
           .BackColor = &HC0FFC0
           .kohdo.Text = ActiveCell.Offset(0, 0).Value
           .kazu.Text = ActiveCell.Offset(0, 2).Value
        End With
        Unload マクロ
        入力.Show
      End Sub


    1. 入力位置を選択しているかどうかを確認します。

    2.「入力・修正」フォームのコード(コンボボックス)の初期設定をするプロシージャ(kombosettei)を実行し、
     コンボボックスにコード番号、商品名等をセットします。

    3.「入力・修正」フォームに表示するフォーム名を「修正」にし、バックカラーを「薄い黄緑色」に設定してから、
     入力行に入力されているそれぞれの値を、「入力・修正」フォームにセットします。

     そして、「作業選択」フォーム(マクロ)を画面から消し、「入力・修正」フォームを表示します。


   「キャンセル」ボタンに設定したプロシージャ

     Private Sub キャンセル_Click()
        Unload マクロ
     End Sub


   「作業選択」フォーム(マクロ)を画面から消します。


   「入力」、「修正」ボタンに設定したマクロで使用しているプロシージャです。

   昔はサブルーチンといっていたのですが、最近は何と呼ばれているかしりません(笑)

     Function kombosettei()
        Dim cntA As Integer
        Dim setcell As Range
        '
コマンドボックスの設定
        cntA = 0
        With 入力.kohdo
           .ColumnCount = 2
           Set setcell = Worksheets("製品単価").Range("C7")      
1
           '
RowSourceの入力
           Do Until setcell.Value = ""
             .AddItem
             .List(cntA, 0) = setcell.Offset(0, 0).Value
             .List(cntA, 1) = setcell.Offset(0, 1).Value
             Set setcell = setcell.Offset(1, 0)
             cntA = cntA + 1
           Loop
       End With
       Set setcell = Nothing
    End Function



    1.参照セル(setcell)をWorksheets("製品単価").Range("C7")にセットして、
     コード欄が空白になるまで参照セルを一行づつ順に下の行に送り、
     コードナンバーと、商品名を「入力・修正」フォームのコード(コマンドボックス)にセットしていきます。
  
    コンボボックスを設定する方法は、直接、コンボボックスのRowSourceプロパティにその範囲を
    設定する方法もありますが、
    アクティブになっていないブックを参照する場合や、範囲が変化する場合は、
    この例のように設定します。



  次に、入力フォームに設定したプロシージャを紹介します。

  入力フォームに設定したプロシージャは、次の4つです。

    1.コードが変わった時に動作するプロシージャ

    2.数量が変わった時に動作するプロシージャ

    3.「入力」ボタンが押された時に動作するプロシージャ

    4.「キャンセル」ボタンが押された時に動作するプロシージャ


  では、「コード」(コンボボックス)に設定したプロシージャです。

    コンボボックスの内容が変わると動作します。

    コンボボックスの内容は、ユーザーが選択すると自動的に変わるように作成されています。


     Private Sub kohdo_Change()
        Dim strkohdo As String
        Dim strsyohin As String
        '
        strkohdo = kohdo.Value                                 
1
        If strkohdo = "" Then Exit Sub
        Set setcell = Worksheets("製品単価").Range("C7")
        cntA = 0
        Do Until setcell.Value = strkohdo Or setcell.Value = ""              
 2
          Set setcell = setcell.Offset(1, 0)
          cntA = cntA + 1
        Loop
        If setcell.Value = "" Then
          MsgBox "コードが見つかりません。" & Chr(13) & Chr(10) _
            & "コードは一覧から選択してください!", vbCritical, "作業手順!"
          Exit Sub
        End If
        strsyohin = setcell.Offset(0, 1).Value
        namae.Value = strsyohin
        tanka.Value = ""
         
     End Sub


    1. 選択されたコードを取得し、
      データーベ―スである表を検索、その商品名を取得して「名称(テキストボックス)」に表示します。

      コンボボックスは、表示列をいくつにも増やせますが、取得できるのは、指定した1列の値だけなので、
      この作業が必要になります。


    2. 条件が成立するまで作業を繰り返す「Do Loop Until」ステートメント(後述)という物を使用しています。
        検索条件としては、参照セルの値がコードナンバーと同じか、または、空白のセルまでとしています。



  入力フォームの「数量」(テキストボックス)というものに設定したプロシジャです。

   テキストボックスの内容が更新されると動作します。

    Private Sub kazu_AfterUpdate()
      Dim setcellB As Range
      Dim cntB As Long
      cntB = cntA + 1
      lokazu = kazu.Value
      Set setcellB = setcell.Offset(0, 2)
      Do Until setcellB.Offset(-cntB, 0).Value >= lokazu
        Set setcellB = setcellB.Offset(0, 1)
      Loop
      strtanka = setcellB.Value
      tanka.Value = strtanka
   End Sub


  
  入力された数量(lokazu)を取得し、個数により異なる単価を取得します。

    Setcell と cntA という変数はプロシージャの枠外で宣言して、
    このフォーム内のどのプロシージャでも設定値等で利用できるようにしています。

    cntAは、コードナンバー検索時に、何行下に移動したかを示すもので、それに1をプラスしたcntBの値は、
    単価表に記入してある、個数の条件行を指定するためのものです。

     setcellB.Offset(-cntB, 0).Value >= lokazu   という条件で、

    入力された個数以上の条件数量が記入されている列まで、
    ここでも「Do Loop Until」ステートメントを使用しています。


  いよいよ
「入力」ボタンに設定したプロシージャの説明です。

    ここでは、「入力」と「修正」の場合の処理を、「If」ステートメントで区分して実行しています。


     Private Sub CommandButton1_Click()
       Dim strnamae As String

       Dim strkohdo As String
       Dim setnyu As Range

       '値の取得、値のチェック                                               1
       strnamae = namae.Value
       If strnamae = "" Then
          MsgBox "コードを選択するか、名称を入力してください!", vbInformation, "作業方法!"
          Exit Sub
       End If
       If kazu.Value <> "" And IsNumeric(kazu.Value) = True Then
          lokazu = kazu.Value
       Else
          MsgBox "数量を入力してください!", vbCritical, "入力ミス!"
          Exit Sub
       End If
       strkohdo = kohdo.Value
       If strkohdo = "" Then
          MsgBox "コードを選択するか、入力してください!", vbInformation, "作業方法!"
          Exit Sub
       End If
       strtanka = tanka.Value
       If strtanka = "" Then
          MsgBox "コードを選択するか、単価を入力してください!", vbInformation, "作業方法!"
          Exit Sub
       End If
       '
入力位置の検索                                                    2
       If 入力.Caption = "入 力" Then
          Set setnyu = Worksheets("入力").Range("B7")
          Do Until setnyu.Value = ""
             Set setnyu = setnyu.Offset(1, 0)
             If setnyu.Offset(1, 0).Interior.ColorIndex = 50 Then
                setnyu.Offset(0, 0).Rows("1:1").EntireRow.Insert Shift:=xlDown
                Set setnyu = setnyu.Offset(-1, 0)
             End If
          Loop
       Else
          Set setnyu = ActiveCell.Offset(0, 0)
       End If
       '
値及び計算式の入力
       With setnyu
         .Offset(0, 0).Value = strkohdo
         .Offset(0, 1).Value = strnamae
         .Offset(0, 2).Value = lokazu
         .Offset(0, 3).Value = strtanka
         .Offset(0, 4).Value = "=RC[-2]*RC[-1]"
         .Offset(0, 4).Style = "Comma [0]"
       End With
       If 入力.Caption = "入 力" Then
         '
連続入力にそなえ製品名以外を消去
         kazu.Value = ""
         tanka.Value = ""
         kohdo.SetFocus
       Else
         Unload 入力
         Exit Sub
       End If
     End Sub



     1. まず、一通りの入力項目を、再び取得し直してユーザーによる誤操作に備えています。
   
       実際には、ここで、単価表にない新規の単価を登録するプロシージャもあったほうがいいのでしょうが、
       この例では作成していません。
 
       また、誤操作を徹底的に防ぎたいならば、もう一度コードナンバーにより、製品名や単価を取得し直し、
       フォーム上に表示されている値と比較して、それなりの処理を加えると完璧になります。


     2. 「入力」と「修正」により異なる作業を行うため、「IF」ステートメントで、条件分岐しています。

       「入力」の場合は、参照セルを「入力表」のコード欄にセットし、空白セルを捜してから入力します。

       入力行に必要な値、計算式を入力し、作業が「入力」の場合は、次の入力に備え後処理を行っています。



  「キャンセル」ボタンが押された時に動作するプロシージャ

     Private Sub CommandButton2_Click()
        Unload 入力
     End Sub


     「入力・修正」フォームを画面から消します。




  これで、このマクロのプロシージャは全てです。

  実際には、これらのプロシージャの他に、ユーザーインターフェースとなるユーザーフォームの作成、
  アクティブエックスコントローラーと呼ばれている、コマンドボタン、テキストボックス等の配置、

  加えて、それらを使用方法にあわせて設定しなければなりませんが、
  これらの作業は一回覚えてしまえば、機械的に行える作業となります。


  このマクロで使用したステートメントも
 
    Setステートメント

    Do Until Loopステートメント

    Ifステートメント

    MsgBox関数

    Offsetプロパティ

    Withステートメント


  の6つだけ。後は、セルの値を取得することと、セルに値や式を代入しているだけです。

  たったこれだけの知識を得れば、このぐらいのマクロは作成できるのです。

  ここで、「なんだ簡単ジャン!!」と考えて、次に進みましょう!

  次の章から、基礎知識編です。

        


  わずかな知識で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