Excel VBA ユーザーフォーム 使い方 part2

はじめに

新規というのは、新しいデータをデータベースへ入力することを意味する。ここでは大方の人が使う可能性がある部品を取り扱う。

具体的には、ラベル、テキストボックス、オプションボタン、スクロールバー、コンボボックス、コマンドボタン、である。UserForm2の上にこれらの部品を配置して新規入力を行っていく。

お断り

part1で提示した新規のUserFormとは違っている。part1では都道府県名の入力をリストボックスにしたのだが、リストボックスは削除でも使用していることにより、コンボボックスに変更した。

目標とするUserFormは以下のようになる。

今回作成するUserForm。part1とは違っている

ユーザーフォーム

ユーザーフォームは部品をのせる土台である。これをダブルクリックをすると自動的にコードは以下のものができる。

Option Explicit

Private Sub UserForm_Click()

End Sub

このコードにOption Base 1をOption Explicitの下に書けばいいのだが、マクロを動かす場合、土台をクリックする場合はないので、これをイニシャライズに変更する。

右側のclickを、右端の矢印でinitializeに変更する

initializeの選択画面

Option Explicit

Option Base 1

Private Sub UserForm_Click()

End Sub

Private Sub UserForm_Initialize()

End Sub

この段階で UserForm_Click()は要らないので削除する。コードは以下のようになる。

Option Explicit

Option Base 1

Private Sub UserForm_Initialize()

End Sub


このPrivate Sub UserForm_Initialize()からEnd Subの間に部品やその他の初期値を設定するのである。これでフォームを立ち上げるたびに部品が初期化されるようになる。

標準フォームによるサブルーチン

広域変数宣言にPublic lcr As Integerを書く。広域変数領域とは、Option Base 1とサブルーチンの間に書く変数の宣言のことで、Publicをつけることにより、UserForm2、UserForm3などで、lcrという変数を自由に使えるようになる。

Option Explicit
Option Base 1
Public lcr As Integer
Public Sub lastCellRow()
    lcr = Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Select
End Sub

サブルーチンは

Public Sub lastCellRow()
    lcr = Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Select
End

である。

このサブルーチンは、データの最終行の下に入力できるようにするものである。

コードはセルの1列目のRows.count(エクセルの最下行104万行を意味する)をEnd(xlUp)つまりCtrl+↑を行い、データの最終行をとり、Offset(1, 0)で1行下を選択(Select)するという意味である。

Private Sub UserForm_Initialize()への埋め込み

Option Explicit
Option Base 1

Private Sub UserForm_Initialize()
    
    Call lastCellRow
    ScrollBar1.Value = 0
    TextBox2.Value = ScrollBar1.Value
End Sub

サブルーチンを呼び出すにはCallを書く。本来はCallがなくてもいいのだが、サブルーチンを呼び出していることを明確にするために、必ず書くようにしてほしい。

    ScrollBar1.Value = 0
    TextBox2.Value = ScrollBar1.Value

この2行はスクロールバーの初期値の設定になっている。始めは0から始まり、それをテキストボックスへ表示させているものである。

ラベル

氏名、性別、男、女、年齢、都道府県の名前はすべてラベル表示で行っている。

書き方は、左下半分のプロパティ画面でCaptionのところで名前を変えている。

Captionでラベルの表示を氏名に変更した

UserFormへの貼り付けは、ラベルをドラック&ドロップをするだけでOK。

以下、各部品はすべてドラック&ドロップをして配置していく。

テキストボックス

ドラック&ドロップをして部品を配置したら、ダブルクリックをしてコードを生成させ、必要なコードを書く。

Private Sub TextBox1_Change()
   ActiveCell.Cells(lcr + 2, 1) = TextBox1.Value
End Sub

ポイントは_Changeになっていることと、変数lcrに+2をしていることである。

オフセット(1,0)で一行下を選択しているが、lcrの値は-1となっているので、+2をして、1に直している。

意味は1列目にテキストボックスの値を入力している、ということである。

テキストボックスに名前を入力すると、今回はデータの部分にマクロを配置していることにより、入力の状況が画面上でみることができる。

以下、すべての新規の入力はすべて画面上に入力していく様子がわかるようにしてある。

オプションボタン

ドラック&ドロップをして2つオプションボタンを配置したらそれぞれのボタンをダブルクリックする。生成されるコードと必要なコードは以下のようになる。

Private Sub OptionButton1_Click()
    If OptionButton1.Value = True Then
        ActiveCell.Cells(lcr + 2, 2) = "男"
    End If
End Sub

Private Sub OptionButton2_Click()
    If OptionButton2.Value = True Then
        ActiveCell.Cells(lcr + 2, 2) = "女"
    End If
End Sub

_Click()になっていることに注意をし、なかにコードを書く。

意味は

もし、オプションボタンがtrueだったら、アクティブセルの2列目に値を代入する

ということである。

文字列あるいは文字の場合はダブルクォーテーションで囲むこと。

また、If~,then~,End Ifはセットで使う。

スクロールバー

テキストボックスとスクロールバーを連動させる。UserFormのinitializeで初期設定をしたときにやったことがここで生きてくる。

まず、画面左下半分のプロパティ画面で、MaxとMinを設定する。

Maxは120、Minは0と設定

スクロールバーをダブルクリックして、コードを生成させる。

Private Sub ScrollBar1_Change()
    TextBox2.Value = ScrollBar1.Value
    ActiveCell.Cells(lcr + 2, 3) = TextBox2.Value
End Sub

_Change()となっていることを確認したらコードを記述する。

1行目はスクロールバーの値をテキストボックスへ入力し、

2行目はテキストボックスの値をセルの3列目へ入力させている。

コンボボックス

コンボボックスのリスト部分に都道府県名を入力する。今回は都道府県というシートを用意して、そこから入力させている。

ワークシートはマクロにデータ、都道府県に47都道府県が書いてある

都道府県の場合、コンボボックスのリスト部分に追加したり削除したりする必要がないので、コンボボックスをシングルクリックして画面左下半分のRowSourceに都道府県!A1:A47と入力する。

スクロールをしてRowSourceを見つけて入力する

コンボボックスをダブルクリックしてコードを生成させる。

Private Sub ComboBox1_Change()
    With ComboBox1
        If .ListIndex = -1 Then
            MsgBox "選択していません"
        Else
            ActiveCell.Cells(lcr + 2, 4) = .Text
        End If
    End With
End Sub

_Change()となっていたら、内部にコードを書く。

With ComboBox1~End Withまでがコンボボックスの1つの塊を意味し、そのなかで、If~then~else~End Ifで処理を記述している。

意味は.ListIndex (.をつけ忘れないように)が-1なら選択をしていない場合のエラー処理を記述し、Else以降で.Text(.をつけ忘れないように)テキスト部分の内容をセルの4列目に書き出している。

余談だが、プロと素人のプログラミングの違いはエラー処理をどのくらいかませるのかである。マクロプログラミング程度であれば自分だけで使用する場合がほとんどだと思うのでエラー処理に気を使わなくてもいいと思う。

コマンドボタン

入力と終了の2つのコマンドボタンを設定する。ドラック&ドロップをして配置をしたら、それぞれの名前を変更する。

方法はいままで通りで、画面左下半分のCaptionで行い、ダブルクリックしてコードを生成させる。

Private Sub CommandButton1_Click()
    ActiveWorkbook.Save
    Unload Me
    Call inpActionButton
End Sub

Private Sub CommandButton2_Click()
    ActiveWorkbook.Save
    Unload Me
End Sub

1行目はワークブックを上書き保存し、2行目はフォームを消去している。ただし、入力の方は、3行目にもっとも簡単で単純な方法、つまりユーザーフォーム2を再度読み込ませている。

inpActionButtonは標準モジュールに書いたサブルーチンである。コードは以下の通り。

Sub inpActionButton()
 UserForm2.Show
End Sub

.Show(.を忘れないように)でフォームを表示させているだけである。

サイトご利用方法

次のページ・前のページを利用するよりも、グローバルメニュー(ヘッダー部分にある項目)・サブメニュー記事の項目をクリックしていただければ、その項目の全体像が一目でみることができ、クリックすればそのサイトへ飛びます。

google、yahoo、Bingなどで検索する場合、検索ワードは先頭に、孤立じじい、と入力しその後に、グローバルメニュー・サブメニュー記事のどれかひとつの項目を入力すると、その検索サイトが上位表示されます。