|
うくれれ さん
こんばんは
少し長いですが、がんばって下さい。
>「データベースの配列」
>No. 氏名 登録番号1 登録番号2 登録日 発効日 登録型
>1 XXXX 9999 9999 171001 171002 A-1
>2 ・ ・ ・ ・ ・ ・
>3 ・ ・ ・ ・ ・ ・
>
>そこで、抽出用にユーザフォームを作り上記データベースの各列に対応するテキストボックス又はリストボックスを配置し、条件(複数指定可)を入力してコマンドボタンクリックでフィルタをかける、なんていうことは可能でしょうか。
>例えば、登録日が170901で登録型がB-2の行をすべて抽出して表示したり、氏名>XXXXの入力された行を抽出して表示する、というように・・・。
下記の準備をして下さい。
UserForm
1)TEXTBOX 1〜7
2) LISTBOX1
3)COMMANDBUTTON 1,2
TEXTBOX1--No
TEXTBOX2--氏名
TEXTBOX3--登録番号1
TEXTBOX4--登録番号2
TEXTBOX5--登録日
TEXTBOX6--発効日
TEXTBOX7--登録番号登録型
COMMANDBUTTON1--検索ボタン
COMMANDBUTTON2--リスト全表示ボタン
に対応しています。
シート構成
作業 というシートを追加して下さい。
Sheet1の3行目A列〜G列まで下記の見出しがあるものとします。
No・氏名・登録番号1・登録番号2・登録日・発効日・登録型
Noは必ず入力されているものとします。
作業というシートは何もしなくていいです。
もし検索できなかったら作業というシートのセルの書式を全部文字列にして下さい。
下記のコードを入力またはコピーして下さい。
各TEXTBOXに検索する文字を入力して検索ボタンクリックして下さい。
検索結果がLISTBOXに表示されます。
リスト全表示ボタンをクリックすると全リストが表示されます。
確認してみて下さい。
確認後、UserForm・シートは、うくれれさんの環境に合わせて下さいね。
'---------------------------------------
Option Explicit
'---------------------------------------
Private Sub CommandButton1_Click()
'-----検索-----
Dim mySHI As Worksheet '作業シート
Dim myRhani As Range '抽出元範囲
Dim myRjouken As Range '抽出条件範囲
Dim myK1 As String 'TEXTBOX1
Dim myK2 As String 'TEXTBOX2
Dim myK3 As String 'TEXTBOX3
Dim myK4 As String 'TEXTBOX4
Dim myK5 As String 'TEXTBOX5
Dim myK6 As String 'TEXTBOX6
Dim myK7 As String 'TEXTBOX7
Dim LASROW As Long '最後のセル
Dim myDRange As String 'リスト表示範囲
ListBox1.ListIndex = -1
myK1 = TextBox1.Value 'No
myK2 = TextBox2.Value '氏名
myK3 = TextBox3.Value '登録番号1
myK4 = TextBox4.Value ' '登録番号2
myK5 = TextBox5.Value '登録日
myK6 = TextBox6.Value '発効日
myK7 = TextBox7.Value '登録型
Set mySHI = Worksheets("作業")
mySHI.Cells.Clear
With Worksheets("Sheet1")
Set myRhani = .Range(.Range("A3"), .Range("A65536").End(xlUp).Offset(0, 6)) '抽出元範囲
Set myRjouken = mySHI.Range("A1:G2") '抽出条件範囲
'抽出条件をセル範囲上に入力する
mySHI.Range("A1").Value = .Range("A3").Value 'No フィールドを指定"
mySHI.Range("B1").Value = .Range("B3").Value '氏名 フィールドを指定"
mySHI.Range("C1").Value = .Range("C3").Value '登録番号1 フィールドを指定"
mySHI.Range("D1").Value = .Range("D3").Value '登録番号2 フィールドを指定"
mySHI.Range("E1").Value = .Range("E3").Value '登録日 フィールドを指定"
mySHI.Range("F1").Value = .Range("F3").Value '発効日 フィールドを指定"
mySHI.Range("G1").Value = .Range("G3").Value '登録型 フィールドを指定"
End With
With mySHI
If TextBox1.Value = "" Then
.Range("A2").Value = myK1 '抽出条件を指定
Else
.Range("A2").Value = "'=" & myK1 '抽出条件を指定
End If
If TextBox2.Value = "" Then
.Range("B2").Value = myK2 '抽出条件を指定
Else
.Range("B2").Value = "'=" & myK2 '抽出条件を指定
End If
If TextBox3.Value = "" Then
.Range("C2").Value = myK3 '抽出条件を指定
Else
.Range("C2").Value = "'=" & myK3 '抽出条件を指定
End If
If TextBox4.Value = "" Then
.Range("D2").Value = myK4 '抽出条件を指定
Else
.Range("D2").Value = "'=" & myK4 '抽出条件を指定
End If
If TextBox5.Value = "" Then
.Range("E2").Value = myK5 '抽出条件を指定
Else
.Range("E2").Value = "'=" & myK5 '抽出条件を指定
End If
If TextBox6.Value = "" Then
.Range("F2").Value = myK6 '抽出条件を指定
Else
.Range("F2").Value = "'=" & myK6 '抽出条件を指定
End If
If TextBox7.Value = "" Then
.Range("G2").Value = myK7 '抽出条件を指定
Else
.Range("G2").Value = "'=" & myK7 '抽出条件を指定
End If
End With
'検索-検索結果を作業シートにコピー
myRhani.AdvancedFilter _
Action:=xlFilterCopy, CriteriaRange:=myRjouken, _
copytorange:=Worksheets("作業").Range("A5")
'検索結果をリスト表示
LASROW = Worksheets("作業").Range("A65536").End(xlUp).Row
myDRange = "作業!A6:G" & LASROW
ListBox1.RowSource = myDRange
If Worksheets("作業").Range("A6").Value = "" Then
ListBox1.RowSource = ""
End If
End Sub
'---------------------------------------
Private Sub CommandButton2_Click()
'-----リスト全表示-----
Dim f As Long
ListBox1.ListIndex = -1
Worksheets("作業").Cells.Clear
For f = 1 To 7
Controls("TEXTBOX" & f).Value = ""
Next
Call S_LIST '初期リスト表示
End Sub
'---------------------------------------
Private Sub UserForm_Initialize()
'-----USERFORM初期設定-----
Dim LASROW As Long
Dim mySHI As Worksheet
Dim f As Long
With ListBox1
.ColumnCount = 7
.ColumnWidths = "50;50;50;50;50;50;50"
End With
Call S_LIST '初期リスト表示
End Sub
'---------------------------------------
Private Sub S_LIST()
'-----初期リスト表示------
Dim LASROW As Long
Dim myDRange As String
LASROW = Worksheets("Sheet1").Range("A65536").End(xlUp).Row
myDRange = "Sheet1!A4:G" & LASROW
ListBox1.RowSource = myDRange
If Worksheets("Sheet1").Range("B4").Value = "" Then
ListBox1.RowSource = ""
End If
End Sub
'---------------------------------------
|
|