[ ユーザーフォーム_目次 ]

標準モジュールの解説

作成過程で、共通化できそうだと思った部分を標準モジュールに切り出しました。

[ 目次 ]
  1. 処理モードの定義
  2. 検索条件編集処理
  3. 検索処理
  4. コンボボックス設定処理



処理モードの定義

処理の種類(登録・更新・削除・照会)を表すワーク項目と、それ用の固定値の定義です。
ここで定義することにより、ユーザーフォームを跨いで使用できます。

Public Mode As String
Public Const Mode_Add = "Add"
Public Const Mode_Mod = "Mod"
Public Const Mode_Del = "Del"
Public Const Mode_Ref = "Ref"
− Memo −
  1. 当初、検索用フォームを更新・削除・照会で兼用する手段を知りませんでしたが、 Java の経験とネット検索で、この方法に至りました。
    偶然とはいえ、この方法を見つけて、やる気が少し回復しました。



検索条件編集処理

検索用フォームに入力された値が検索条件エリアに転記されているので、その値を編集します。 項目が複数入力されている場合、一番優先する条件のみ残し、その他の条件は検索条件エリアから消去します。

Public Sub EditCriteria()

    Worksheets("会員抽出").Select
    Dim FilterPattern As String
    FilterPattern = ""
    
    'ID のみの検索処理
    If Range("A2").Value <> "" Then
        Range("B2").Value = ""
        Range("C2").Value = ""
        Range("D2").Value = ""
        Range("E2").Value = ""
        FilterPattern = "filterID"
    End If
    
    '名前のみの検索処理
    If FilterPattern = "" And Range("B2").Value <> "" Then
        Range("A2").Value = ""
        Range("B2").Value = "*" & Range("B2").Value & "*"
        Range("C2").Value = ""
        Range("D2").Value = ""
        Range("E2").Value = ""
        FilterPattern = "filterName"
    End If

    '性別のみの検索処理
    If FilterPattern = "" And Range("C2").Value <> "" Then
        Range("A2").Value = ""
        Range("B2").Value = ""
        Range("D2").Value = ""
        Range("E2").Value = ""
        FilterPattern = "filterSex"
    End If

    '生年月日(開始)のみの検索処理
    If FilterPattern = "" And Range("D2").Value <> "" And Range("E2").Value = "" Then
        Range("A2").Value = ""
        Range("B2").Value = ""
        Range("C2").Value = ""
        Range("D2").Value = ">=" & Range("D2").Value
        Range("E2").Value = ""
        FilterPattern = "filterStartDate"
    End If
    
    '生年月日(終了)のみの検索処理
    If FilterPattern = "" And Range("D2").Value = "" And Range("E2").Value <> "" Then
        Range("A2").Value = ""
        Range("B2").Value = ""
        Range("C2").Value = ""
        Range("D2").Value = ""
        Range("E2").Value = "<=" & Range("E2").Value
        FilterPattern = "filterEndDate"
    End If

    '生年月日の検索処理
    If FilterPattern = "" And Range("D2").Value <> "" And Range("E2").Value <> "" Then
        Range("A2").Value = ""
        Range("B2").Value = ""
        Range("C2").Value = ""
        Range("D2").Value = ">=" & Range("D2").Value
        Range("E2").Value = "<=" & Range("E2").Value
        FilterPattern = "filterDateOfBirth"
    End If

End Sub
− Memo −
  1. 名前は部分一致検索なので、入力値を "*" で挟んでいます。
  2. 生年月日(開始)には ">=" を付加して、「入力値以上」という意味にしています。
  3. 生年月日(終了)には "<=" を付加して、「入力値以下」という意味にしています。



検索処理

検索条件エリアの値に従って検索し、結果を"会員抽出ワークシート"に表示します。

Public Sub FilterMembers()
    
    Worksheets("会員抽出").Select
    Sheets("Sheet1").Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Range("A1:F2"), CopyToRange:=Range("会員抽出!Extract"), _
        Unique:=False

End Sub
− Memo −
  1. 検索の仕組みは、エクセルを普通に使っているときに使用するフィルター機能の応用です。
  2. 「エクセル フィルター 別シート」などでネット検索すると、別シートに検索結果を表示する仕組みが紹介されていますが、 それをマクロで記録して、少々の変更を加えています。
  3. 感動的なのは CurrentRegion というキーワードを使用することで、検索するリスト範囲を指定できることです。 この技を知らなかったので、いちいち行数を取得してからリスト範囲を指定するのかと思っていました。 過去に手掛けた数少ない VBA の成果に、このキーワードをぜひ使いたかった、そんな気分です。



コンボボックス設定処理

登録や更新で使用する性別・生年月日のコンボボックスに、選択肢となる値を設定します。

Public Sub SetComboBox(ctrls As Controls)

    Worksheets("設定").Select
    Dim ctrl As Control
    Dim lastRow As Integer
    Dim i As Integer
    
    For Each ctrl In ctrls
        
        If TypeName(ctrl) = "ComboBox" Then
            
            If InStr(ctrl.Tag, "性別") <> 0 Then
                lastRow = Range("A1").End(xlDown).Row
                For i = 2 To lastRow
                    ctrl.AddItem Cells(i, 1).Value
                Next
                ctrl.Style = fmStyleDropDownList
            End If
        
            If InStr(ctrl.Tag, "生年月日_年") <> 0 Then
                lastRow = Range("B1").End(xlDown).Row
                For i = 2 To lastRow
                    ctrl.AddItem Cells(i, 2).Value
                Next
                ctrl.Style = fmStyleDropDownList
            End If
        
            If InStr(ctrl.Tag, "生年月日_月") <> 0 Then
                lastRow = Range("C1").End(xlDown).Row
                For i = 2 To lastRow
                    ctrl.AddItem Cells(i, 3).Value
                Next
                ctrl.Style = fmStyleDropDownList
            End If
        
            If InStr(ctrl.Tag, "生年月日_日") <> 0 Then
                lastRow = Range("D1").End(xlDown).Row
                For i = 2 To lastRow
                    ctrl.AddItem Cells(i, 4).Value
                Next
                ctrl.Style = fmStyleDropDownList
            End If
        
        End If
            
    Next
    
End Sub
− Memo −
  1. 引数としてユーザーフォーム自身を受け取ります。
  2. ユーザーフォームに配置されたコンボボックスについて、処理を行います。
    コンボボックスか否かの判定は、 TypeName 関数を使って行います。
  3. コンボボックスを配置した際に、プロパティウィンドウの Tag 項目に、"性別"とか"生年月日_年"などと入力しておきます。それが、この処理対象になる準備になります。
  4. 選択肢以外の値の入力を防ぐため、 .Style = fmStyleDropDownList と指定しています。
  5. 設定用ワークシートに入力してある値をコンボボックスに取り込んでいます。 エクセルの中身は、以下のようなカンジです。
    コンボデータ