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

はじめに

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