ユーザーインターフェース |
||||
| わずかな知識で VBA! |
ユーザーインターフェース |
|||
ユーザーインターフェースを使ったマクロここでは、VBAプログラミングの魅力を感じてもらうために、 ユーザーインターフェース と呼ばれるものを作成した簡単な例を紹介します。 VBAには、いろいろなダイアログボックスが用意されていますが、 それら既成のダイアログボックスでは満足できない場合には、 オリジナルのダイアログボックスを作成することができます。 |
わずかな知識で VBA! ![]() |
|||
ユーザーインターフェースとは、一般的には、画面上の操作手段のことをいいますが、 マクロで作成したダイアログボックス(ユーザーフォーム)もユーザーインターフェースです。 このユーザーインターフェースとなる、オリジナルのダイアログボックスは、 Excelの「マクロの記録」で作成することはできません。 VBAの知識を必要とする由縁ですが、 オリジナルのダイアログボックスを作成することは、 あなたが考えていたものより、はるかに簡単だと思います。 ユーザーインターフェースを使用した入力作業は、 セルを選択して、直接データを入力する代わりに、ユーザーインターフェースに直接データを入力します。 そのデータを、マクロにより、決められたセルに転記する仕組みを作成しておけば、 Excelの操作に不慣れな人でもデータ入力が簡単に行えます。 さらに、ユーザーインターフェースを使用すると、フールプルーフ(ブービートラップ)を設けることができ、 入力ミスや、操作ミスを防ぐこともできるというメリットもあります。 まるっきりの初心者の方は、ここから、次の「マクロの記録」に進んだほうがいいかも知れませんが、 ざっと読み飛ばしてください。 |
||||
ここでは、理解しようとしないでください。 詳細な説明は、「ダイアログボックスを作ってみよう2【実践編】」で行っています。 作業の流れと、プロシージャの行数ぐらいを感じ取っていただいて、 できたら、「簡単にできるジャン!」と思っていただければOKです。 図1のような納品書モドキの入力表に、 図2の表に記載してある商品の名称と個数、及び、個数により異なる単価を入力するためのマクロです。 つまり、Excelの簡単な表をデータベースとし、その検索と入力作業を行います。 VBAでデータ検索等を行う際の基礎知識が満載されています。 ダウンロードして使いながら確認してください。 マクロを有効にして、ダウンロードしたファイルを開いてください。 |
||||
図1 |
動作説明のための、 簡単な入力表です。 |
|||
| 図2 |
コード、商品名、個数により 異なった単価が、 入力されている価格表です。 |
|||
既に、仕事でExcelを利用されている方は、 このマクロと同じような事を「VLOOKUP 」や「HLOOKUP」等の関数を使用して作成、利用されていると思います。 ですが、その入力作業には、最低でも、コード番号と商品名が記入されたコード表が、必要になります。 また、入力位置も自分で探さなければなりません。 前もって、上記の関数等を入力表の全てのセルに入力しておく必要があり、 ファイルも重くなって、98以前のパソコンでは、ちょくちょくフリーズしました。 このマクロでは、入力用のコード表も必要としません。 画面上に表示されるユーザーインターフェースで、それらを確認しながら入力できるからです。 作成するユーザーフォームはたったの2つ。 「マクロ表示」を実行すると、下のユーザーフォームが表示されます。 |
||||
|
作業選択フォームの |
||||
|
作業選択フォームの |
||||
| この簡単なダイアログボックスが 今回の処理を行うための ユーザーインターフェースとなります。 フォームを表示する前の下準備として、 「コード」のコンボボックスに、 コード番号と品名をセットしておきます。 そうすることによって、 図のようにコンボボックスの右側にある 「▼」ボタンで参照できるようになります。 |
||||
| ここで、商品を選ぶと、「コードボックス」にはコードが、「名称ボックス」にはその名称が入力されます。 次に数量を入力すると、商品の個数によって異なる単価が正しく選択されて、「単価ボックス」に表示されます。 この例では、名称ボックスに入力しておく商品数が少ないので、これで済みますが、 実際には、商品数もこの例以上に多く、下記のように、項目別に表示するというような工夫が必要になります。 |
||||
|
作業選択フォームの |
||||
この例の場合、商品の個数を修正するときには、手作業で修正しても良いのですが、 個数により単価が変わるため、入力ミスの原因にもなります。 また、入力された製品を別のものに修正する場合には、 入力時と同じように、コードを選択して修正した方が、楽に行えます。 ただし、修正したい部分は、ユーザーにしかわかりません。 そのため、修正時にはユーザーに修正行のコードの入力位置を選択してから、 マクロを実行してもらうようにしています。 作業選択フォームの「修 正」ボタンをクリックすると、次のメッセージが表示され、 ユーザーに確認してもらい、「はい」なら処理を続行し、「いいえ」なら使用方法を説明するメーセージを表示し、 使い方を説明しています。 「作業選択」のフォームに直接記入しておくのも手ですが、 ろくに読まずにボタンを押す、8本足の方もたくさんいるので、このようにワンステップおくことも必要です。 ![]() |
||||
|
|
||||
| 「いいえ(N)」の場合 次のメッセージが表示され、 「OK」で処理を終了します。 |
||||
「入力」フォームと「修正」フォームは、色とタイトルを変えていますが、 つまり、作成したユーザーフォームは、3つにみえますが、 マクロを有効にして、ダウンロードしたファイルを開いてください。 マクロを動作させるためにはこの設定を「中」以下に変更する必要があります。 「マクロのセキュリティ変更方法 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