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

はじめに

削除機能はとくに部品数は多くない。リストボックスとコマンドボタンのみのシンプルな構成となっている。

削除のユーザーフォームと部品

リストボックスに名前の一覧が出て、それを選択し削除ボタンを押すと削除できるようになっている。

ユーザーフォーム

ユーザーフォーム_イニシャライズのコードは次のようになっている。

Option Explicit
Option Base 1

Private Sub UserForm_Initialize()

    Call lastRowNum
    ListBox1.List = Range(Cells(2, 1), Cells(lrn + 1, 1)).Value
End Sub

1行目は標準モジュールで作ったサブルーチンを呼び出している。

2行目はリストボックスにデータを入力している。

リストボックスに入力する方法は3通りあり、1つは画面左下半分にあるプロパティ画面でRowSourceに登録する方法、2つ目はAddItemを使って回す方法、3つ目はもっとも高速にデータを入力できるRangeを用いる方法、である。

ここではRangeを用いて高速にデータを入力できる方法を用いた。

標準モジュールでのサブルーチン

Option Explicit
Option Base 1
Public lcr As Integer, lrn As Integer


Public Sub lastRowNum()
    lrn = Cells(Rows.Count, 1).End(xlUp).Row
End Sub

これは新規の入力が選択(Select)だったのに対して、.Row(.を忘れないように)を用いて実際の行数を、変数lrnに代入している。

2行目の注意点

ListBox1.List = Range(Cells(2, 1), Cells(lrn + 1, 1)).Value

Rangeの最下行のセルをCells(lrn + 1, 1)で、実際の行数より1行多くとっている点である。これをしておくと最終行を削除しても、エラーは起きない。

リストボックス

リストボックス自体にコードはない。

コマンドボタン

削除のコマンドボタンは以下のコードが書いてある。

Private Sub CommandButton1_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 delRowLine
End Sub

重要なポイントは4つある。

1つ目は検索方法で

For i = lrn To 2 Step -1

のように、削除する場合は最下行から行頭に向かって検索していくのである。理由は削除したとき、1行繰り上がるからである。

2つ目は

 .List(.ListIndex)

である。これでリストのデータ(この場合は名前)をとることができる、非常に重要な表現である。

3つ目は

.EntireRow.Delete

である。選択したデータ(この場合は名前)をこの表現で一行削除し、一行繰り上げることができる。

4つ目は

 .RemoveItem .ListIndex

である。これによりリストボックスにあるデータを消去することができる。

残りの部分は新規と同様で、上書き保存してユーザーフォームを消去し、改めてユーザーフォームを表示させている。    

    ActiveWorkbook.Save
    Unload Me
    Call delRowLine

構文としてはWith~End Withのなかに、For~Nextでセル全体を回し、If~End Ifで一致するものを検索している。

終了のコマンドボタンは、上書き保存とユーザーフォームの消去だけである。

part1~part3のまとめのコード

ここで、いままでサブルーチンごとに紹介してきたコードの全容を提示しておく。

標準モジュール

Option Explicit
Option Base 1
Public lcr As Integer, lrn As Integer

ーーーーーーーーーーーーーーーーーーーーーーー

Sub actionButton()
 UserForm1.Show
End Sub

ーーーーーーーーーーーーーーーーーーーーーーー

Sub inpActionButton()
 UserForm2.Show
End Sub

ーーーーーーーーーーーーーーーーーーーーーーー

Sub delRowLine()
 UserForm3.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

ーーーーーーーーーーーーーーーーーーーーーーー

Private Sub CommandButton1_Click()
 Unload Me
 
If OptionButton1.Value = True Then
    Call inpActionButton
ElseIf OptionButton2.Value = True Then
    Call delRowLine
ElseIf OptionButton3.Value = True Then
    MsgBox "このデータベースでは必要ありません" & vbCrLf & _
        "悪しからずご了承ください"
 End If

Call actionButton

End Sub

ーーーーーーーーーーーーーーーーーーーーーーー

Private Sub CommandButton2_Click()

    Unload Me

End Sub

ここで、新しい文として

& vbCrLf & _

がでてきたが、これはメッセージボックスで2行に渡って書きたいときにvbCrLfで改行を入れ、_で文の続きを書く印である。

ユーザーフォーム2

Option Explicit
Option Base 1

ーーーーーーーーーーーーーーーーーーーーーーー

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

ーーーーーーーーーーーーーーーーーーーーーーー

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

ーーーーーーーーーーーーーーーーーーーーーーー

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

ーーーーーーーーーーーーーーーーーーーーーーー

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

ーーーーーーーーーーーーーーーーーーーーーーー

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

ーーーーーーーーーーーーーーーーーーーーーーー

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

ーーーーーーーーーーーーーーーーーーーーーーー

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

ユーザーフォーム3

Option Explicit
Option Base 1

ーーーーーーーーーーーーーーーーーーーーーーー

Private Sub UserForm_Initialize()
   
    Call lastRowNum
    ListBox1.List = Range(Cells(2, 1), Cells(lrn + 1, 1)).Value
End Sub

ーーーーーーーーーーーーーーーーーーーーーーー

Private Sub CommandButton1_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 delRowLine
End Sub

ーーーーーーーーーーーーーーーーーーーーーーー

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

サイトご利用方法

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

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