[ ユーザーフォーム_目次 ]
標準モジュールの解説
作成過程で、共通化できそうだと思った部分を標準モジュールに切り出しました。
[ 目次 ]
- 処理モードの定義
- 検索条件編集処理
- 検索処理
- コンボボックス設定処理
処理モードの定義
処理の種類(登録・更新・削除・照会)を表すワーク項目と、それ用の固定値の定義です。
ここで定義することにより、ユーザーフォームを跨いで使用できます。
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 −
-
当初、検索用フォームを更新・削除・照会で兼用する手段を知りませんでしたが、 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 −
-
名前は部分一致検索なので、入力値を "*" で挟んでいます。
-
生年月日(開始)には ">=" を付加して、「入力値以上」という意味にしています。
-
生年月日(終了)には "<=" を付加して、「入力値以下」という意味にしています。
検索処理
検索条件エリアの値に従って検索し、結果を"会員抽出ワークシート"に表示します。
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 −
-
検索の仕組みは、エクセルを普通に使っているときに使用するフィルター機能の応用です。
-
「エクセル フィルター 別シート」などでネット検索すると、別シートに検索結果を表示する仕組みが紹介されていますが、
それをマクロで記録して、少々の変更を加えています。
-
感動的なのは 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 −
-
引数としてユーザーフォーム自身を受け取ります。
-
ユーザーフォームに配置されたコンボボックスについて、処理を行います。
コンボボックスか否かの判定は、 TypeName 関数を使って行います。
-
コンボボックスを配置した際に、プロパティウィンドウの Tag 項目に、"性別"とか"生年月日_年"などと入力しておきます。それが、この処理対象になる準備になります。
-
選択肢以外の値の入力を防ぐため、 .Style = fmStyleDropDownList と指定しています。
-
設定用ワークシートに入力してある値をコンボボックスに取り込んでいます。
エクセルの中身は、以下のようなカンジです。