- はじめに
- 目標のユーザーフォーム
- マルチページ上での部品の配置
- ユーザーフォーム_イニシャライズ
- 入力ーテキストボックス
- 入力ートグルボタン
- 入力ースピンボタン
- 入力ーコンボボックス
- 入力ーコマンドボタン
- 削除
- おまけ
- コードの全容
- サイトご利用方法
はじめに
part1~part3までで、新規入力、削除を行い、その都度新しいユーザーフォームを用いて行ってきたのだが、今回はマルチページを用いて、ひとつのユーザーフォームに入力、削除、おまけ、といったものを配置していく。
入力の部品は、part2とほぼ同じだが、オプションボタンの代わりにトグルボタン、スクロールバーの代わりにスピンボタンにしたことが変化といえる。
削除に関してはpart3と同じリストボックスとコマンドボタンである。
おまけというのは、チェックボックスで、ここで行っているデータベースでは必要のないものであるが、使う頻度はあるので、コントロール配列という構文を紹介して、どのボタンにチェックが入っているかをメッセージボックスに出力している。
目標のユーザーフォーム
ワークシートにボタンを埋め込む方法はpart1を参照すること。
入力は上からラベルで氏名、性別、年齢、出身地となり、氏名はテキストボックス、性別はトグルボタン、年齢はスピンボタン、出身地はコンボボックス、とコマンドボタンになっている。
削除はリストボックスとコマンドボタン。
おまけは、チェックボックスとコマンドボタン。
マルチページ上での部品の配置
ユーザーフォーム上にまずマルチページをのせる。最初はpage1、page2と画面は2枚しかでてこない。
これにページを追加するには、page2の横で右クリックをすると、新しいページ、というのが先頭に出てくるので、それをクリックすればいい。
ページの名前を変更する場合は、画面左下半分のプロパティ画面のCaptionで行う。
部品の配置は各ページ上に、ドラック&ドロップで配置する。これはユーザーフォームに部品を配置したときと同様な作業である。
ユーザーフォーム_イニシャライズ
ユーザーフォーム_イニシャライズの作り方はpart2を参照して欲しい。ここで記述したコードは以下のようになる。
Option Explicit
Option Base 1
Dim spn As Integer
Private Sub UserForm_Initialize()
Call lastCellRow
Call lastRowNum
TextBox2.Value = 1
ListBox1.List = Range(Cells(2, 1), Cells(lrn + 1, 1)).Value
UserForm1.MultiPage1.Value = 0
End Sub
広域変数にspnをとって、スピンボタン内で変数宣言をしないようにしてある。
Call文で呼び込んでいるサブルーチンは標準モジュールで作成したものであり、part2、part3で使用したものだが、ここで標準モジュールを再度掲載しておく。
標準モジュール
Option Explicit
Option Base 1
Public lcr As Integer, lrn As Integer
ーーーーーーーーーーーーーーーーーーーーーーー
Sub actionButton()
UserForm1.Show
End Sub
ーーーーーーーーーーーーーーーーーーーーーーー
Public Sub lastCellRow()
lcr = Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Select
End Sub
ーーーーーーーーーーーーーーーーーーーーーーー
Public Sub lastRowNum()
lrn = Cells(Rows.Count, 1).End(xlUp).Row
End Sub
再びユーザーフォーム_イニシャライズ
TextBox2.Value = 1
これをすることで、スピンボタンの初期値を1に設定している。
ListBox1.List = Range(Cells(2, 1), Cells(lrn + 1, 1)).Value
これは、削除のリストボックスで、part3で行ったものと同様である。
UserForm1.MultiPage1.Value = 0
これはユーザーフォームを立ち上げたとき、つねに入力画面が出てくるように設定してある。
0を1に変更すると削除画面がつねに最初に出てくる。2にするとおまけが最初に出てくる。
入力ーテキストボックス
これはpart2と同じである。コードは以下のようになる。
Private Sub TextBox1_Change()
ActiveCell.Cells(lcr + 2, 1) = TextBox1.Value
End Sub
ここでは、IMEModeを1に設定し、自動的に漢字の入力モードにしている。
入力ートグルボタン
ボタンを押した状態がtrueとなる。コードは以下の通り。
Private Sub ToggleButton1_Click()
If ToggleButton1.Value = True Then
ActiveCell.Cells(lcr + 2, 2) = "男"
Else
ActiveCell.Cells(lcr + 2, 2) = "女"
End If
End Sub
入力ースピンボタン
スピンボタンはupとdownで2通り作る必要がある。これが広域変数で宣言した理由である。コードは以下の通り。
Private Sub SpinButton1_SpinUp()
spn = spn + 1
If spn > 99 Then
spn = 100
End If
TextBox2.Value = spn
ActiveCell.Cells(lcr + 2, 3) = spn
End Sub
ーーーーーーーーーーーーーーーーーーーーーーー
Private Sub SpinButton1_SpinDown()
spn = spn - 1
If spn < 1 Then
spn = 0
End If
TextBox2.Value = spn
ActiveCell.Cells(lcr + 2, 3) = spn
End Sub
特別、難しいコードではないと思う。ただ、SpinUp、SpinDownは編集画面の右上の矢印をおして選択して作ること。
入力ーコンボボックス
Private Sub ComboBox1_Change()
With ComboBox1
ActiveCell.Cells(lcr + 2, 4) = .Text
End With
End Sub
これもpage2でやったように、画面左下半分のプロパティ画面のRowSourceで、都道府県!A1:A47とやれば、リストに入力できる。
入力ーコマンドボタン
Private Sub CommandButton1_Click()
ActiveWorkbook.Save
Unload Me
Call actionButton
End Sub
これは、単純で明快、お手軽な方法である。上書き保存して一度ユーザーフォームを閉じてから、再度読み込みをしているだけである。
削除
削除のリストボックスはユーザーフォーム_イニシャライズでとっているので、とくに記述する必要はない。
コマンドボタンですべての操作をする。コードは以下の通り。
Private Sub CommandButton3_Click()
Dim i As Integer
With ListBox1
For i = lrn To 2 Step -1
If Cells(i, 1) = .List(.ListIndex) Then
Cells(i, 1).EntireRow.Delete
.RemoveItem .ListIndex
End If
Next i
End With
ActiveWorkbook.Save
Unload Me
Call actionButton
End Sub
これもpart3で行ったものを流用しているだけである。
おまけ
Private Sub CommandButton5_Click()
Dim msg As String
Dim sw As Integer, i As Integer
sw = 0
For i = 1 To 6
If Me.Controls("CheckBox" & i).Value = True Then
msg = msg & Me.Controls("CheckBox" & i).Caption & vbCrLf
sw = 1
End If
Next i
If sw = 1 Then
msg = msg & "にチェックが入っています"
Else
msg = "いずれにもチェックが入っていません"
End If
MsgBox msg
For i = 1 To 6
Me.Controls("CheckBox" & i).Value = False
Next i
End Sub
ーーーーーーーーーーーーーーーーーーーーーーーコードはここまで
Me.Controls("CheckBox" & i).Value
この構文が冒頭に書いたコントロール配列である。
Me(自分自身、この場合はUserForm1)が保持しているコントロールのチェックボックスに&iで添え字を回している。
Me.Controls("CheckBox" & i).Caption
この部分も同様にコントロール配列を使ってメッセージボックスに代入している。
コードの全容
標準モジュール
Option Explicit
Option Base 1
Public lcr As Integer, lrn As Integer
ーーーーーーーーーーーーーーーーーーーーーーー
Sub actionButton()
UserForm1.Show
End Sub
ーーーーーーーーーーーーーーーーーーーーーーー
Public Sub lastCellRow()
lcr = Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Select
End Sub
ーーーーーーーーーーーーーーーーーーーーーーー
Public Sub lastRowNum()
lrn = Cells(Rows.Count, 1).End(xlUp).Row
End Sub
ユーザーフォーム1
Option Explicit
Option Base 1
Dim spn As Integer
ーーーーーーーーーーーーーーーーーーーーーーー
Private Sub UserForm_Initialize()
Call lastCellRow
Call lastRowNum
TextBox2.Value = 1
ListBox1.List = Range(Cells(2, 1), Cells(lrn + 1, 1)).Value
UserForm1.MultiPage1.Value = 0
End Sub
ーーーーーーーーーーーーーーーーーーーーーーー
Private Sub TextBox1_Change()
ActiveCell.Cells(lcr + 2, 1) = TextBox1.Value
End Sub
ーーーーーーーーーーーーーーーーーーーーーーー
Private Sub ToggleButton1_Click()
If ToggleButton1.Value = True Then
ActiveCell.Cells(lcr + 2, 2) = "男"
Else
ActiveCell.Cells(lcr + 2, 2) = "女"
End If
End Sub
ーーーーーーーーーーーーーーーーーーーーーーー
Private Sub SpinButton1_SpinUp()
spn = spn + 1
If spn > 99 Then
spn = 100
End If
TextBox2.Value = spn
ActiveCell.Cells(lcr + 2, 3) = spn
End Sub
ーーーーーーーーーーーーーーーーーーーーーーー
Private Sub SpinButton1_SpinDown()
spn = spn - 1
If spn < 1 Then
spn = 0
End If
TextBox2.Value = spn
ActiveCell.Cells(lcr + 2, 3) = spn
End Sub
ーーーーーーーーーーーーーーーーーーーーーーー
Private Sub ComboBox1_Change()
With ComboBox1
ActiveCell.Cells(lcr + 2, 4) = .Text
End With
End Sub
ーーーーーーーーーーーーーーーーーーーーーーー
Private Sub CommandButton1_Click()
ActiveWorkbook.Save
Unload Me
Call actionButton
End Sub
ーーーーーーーーーーーーーーーーーーーーーーー
Private Sub CommandButton3_Click()
Dim i As Integer
With ListBox1
For i = lrn To 2 Step -1
If Cells(i, 1) = .List(.ListIndex) Then
Cells(i, 1).EntireRow.Delete
.RemoveItem .ListIndex
End If
Next i
End With
ActiveWorkbook.Save
Unload Me
Call actionButton
End Sub
ーーーーーーーーーーーーーーーーーーーーーーー
Private Sub CommandButton5_Click()
Dim msg As String
Dim sw As Integer, i As Integer
sw = 0
For i = 1 To 6
If Me.Controls("CheckBox" & i).Value = True Then
msg = msg & Me.Controls("CheckBox" & i).Caption & vbCrLf
sw = 1
End If
Next i
If sw = 1 Then
msg = msg & "にチェックが入っています"
Else
msg = "いずれにもチェックが入っていません"
End If
MsgBox msg
For i = 1 To 6
Me.Controls("CheckBox" & i).Value = False
Next i
End Sub
サイトご利用方法
次のページ・前のページを利用するよりも、グローバルメニュー(ヘッダー部分にある項目)・サブメニュー記事の項目をクリックしていただければ、その項目の全体像が一目でみることができ、クリックすればそのサイトへ飛びます。
google、yahoo、Bingなどで検索する場合、検索ワードは先頭に、孤立じじい、と入力しその後に、グローバルメニュー・サブメニュー記事のどれかひとつの項目を入力すると、その検索サイトが上位表示されます。