Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(False, False) = "A2" Then
Call SearchData '名前を検索
ElseIf Target.Address(False, False) = "C2" Then
Call GetData 'データを取得
End If
End Sub
Sub SearchData()
Dim A, B
Set A = Worksheets("DB")
Set B = Worksheets("入出力")
'検索結果をクリア
B.Range("E2:F20").ClearContents
'名前を検索
A.Range("G1").AutoFilter 2, "*" & B.Range("A2") & "*"
'検索結果をコピー
With A.Range("G1").CurrentRegion
.Rows("2:" & .Rows.Count).Copy B.Range("E2")
End With
'オートフィルタを解除
If A.AutoFilterMode Then A.Range("G1").AutoFilter
End Sub
入力された値を使って、オートフィルタとワイルドカードで、「名前」を検索します。
値を抽出するVBAコード
データベースから値を抽出するVBAコードです。
Sub GetData()
Dim A, B
Set A = Worksheets("DB")
Set B = Worksheets("入出力")
'抽出結果をクリア
B.Range("A5:C30").ClearContents
'科目IDと科目を転記
With A.Range("J1").CurrentRegion
.Rows("2:" & .Rows.Count).Copy B.Range("A5")
End With
For i = 5 To B.Cells(Rows.Count, "A").End(xlUp).Row
A.Range("A1").AutoFilter 1, B.Range("B2") '名前IDでフィルタ
A.Range("A1").AutoFilter 3, B.Cells(i, "A") '科目IDでフィルタ'フィルタ結果がある場合
If WorksheetFunction.Subtotal(103, A.Range("A:A")) > 1 Then
'点数を取得
B.Cells(i, "C") = A.Cells(Rows.Count, "A").End(xlUp).Offset(0, 4)
End If
Next
'オートフィルタを解除
If A.AutoFilterMode Then A.Range("A1").AutoFilter
End Sub
リストから選択した「名前」の「名前ID」を使って、データベースから値を抽出します。
値を書き込むVBAコード
データベースに値を書き込むVBAコードです。
'「書込み」のボタンに登録
Sub WriteData()
Dim A, B
Set A = Worksheets("DB")
Set B = Worksheets("入出力")
For i = 5 To B.Cells(Rows.Count, "A").End(xlUp).Row
A.Range("A1").AutoFilter 1, B.Range("B2") '名前IDでフィルタ
A.Range("A1").AutoFilter 3, B.Cells(i, "A") '科目IDでフィルタ'フィルタ結果がある場合
If WorksheetFunction.Subtotal(103, A.Range("A:A")) > 1 Then
'点数を書込み
A.Cells(Rows.Count, "A").End(xlUp).Offset(0, 4) = B.Cells(i, "C")
'新規登録する場合
Else
A.Range("A1").AutoFilter
With A.Cells(Rows.Count, "A").End(xlUp)
.Offset(1, 0) = B.Range("B2") '名前ID
.Offset(1, 1) = .Offset(0, 1).FormulaR1C1 '名前
.Offset(1, 2) = B.Cells(i, "A") '科目ID
.Offset(1, 3) = .Offset(0, 3).FormulaR1C1 '科目
.Offset(1, 4) = B.Cells(i, "C") '点数
End With
End If
Next
'オートフィルタを解除
If A.AutoFilterMode Then A.Range("A1").AutoFilter
End Sub
「名前ID」と「科目ID」を使って、オートフィルタでフィルタして、値を書き込みます。
では、それぞれのVBAコードの実行する手順をみていきます。
データベースから値を検索する
データベースから値を検索するVBAコードをみていきます。
VBAコード
データベースから値を検索するVBAコードは、次の部分になります。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(False, False) = "A2" Then
Call SearchData '名前を検索
ElseIf Target.Address(False, False) = "C2" Then
Call GetData 'データを取得
End If
End Sub
Sub SearchData()
Dim A, B
Set A = Worksheets("DB")
Set B = Worksheets("入出力")
'検索結果をクリア
B.Range("E2:F20").ClearContents
'名前を検索
A.Range("G1").AutoFilter 2, "*" & B.Range("A2") & "*"
'検索結果をコピー
With A.Range("G1").CurrentRegion
.Rows("2:" & .Rows.Count).Copy B.Range("E2")
End With
'オートフィルタを解除
If A.AutoFilterMode Then A.Range("G1").AutoFilter
End Sub
では、ポイント毎に実行して、VBAコードの動きをみていきます。
値を検索する手順
まずは、手動で、検索する名前を入力します。
「名前」を検索する値を入力
Enterで確定すると、値が変更されているので、VBAコードが実行されます。
「名前」を検索する機能
まず、「佐藤」を含む値がフィルタされます。
フィルタ結果を、入出力用のシートに転記をします。
こんな感じで、データベースから値を検索できます。
名前を入力するセルに、あらかじめ入力規則のリストを設定しておけば、リストから名前を選択できます。
リストから「名前」を入力できる
リストから値を入力できるので、効率的です。
データベースから値を抽出する
データベースから値を抽出する機能をみていきます。
VBAコード
データベースから値を抽出するVBAコードは、次のようになります。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(False, False) = "A2" Then
Call SearchData '名前を検索
ElseIf Target.Address(False, False) = "C2" Then
Call GetData 'データを取得
End If
End Sub
Sub GetData()
Dim A, B
Set A = Worksheets("DB")
Set B = Worksheets("入出力")
'抽出結果をクリア
B.Range("A5:C30").ClearContents
'科目IDと科目を転記
With A.Range("J1").CurrentRegion
.Rows("2:" & .Rows.Count).Copy B.Range("A5")
End With
For i = 5 To B.Cells(Rows.Count, "A").End(xlUp).Row
A.Range("A1").AutoFilter 1, B.Range("B2") '名前IDでフィルタ
A.Range("A1").AutoFilter 3, B.Cells(i, "A") '科目IDでフィルタ'フィルタ結果がある場合
If WorksheetFunction.Subtotal(103, A.Range("A:A")) > 1 Then
'点数を取得
B.Cells(i, "C") = A.Cells(Rows.Count, "A").End(xlUp).Offset(0, 4)
End If
Next
'オートフィルタを解除
If A.AutoFilterMode Then A.Range("A1").AutoFilter
End Sub
では、ポイント毎に実行して、VBAコードの動作をみていきます。
値を抽出する手順
まずは、手動で、リストから名前を選択します。
リストから名前を選択
「名前ID」は、数式で取得します。
数式で「名前ID」を取得
名前が変更されたので、ここから、VBAコードが実行されます。
「科目ID」と「科目」がデータベースから転記される
実行すると、「科目ID」と「科目」がデータベースから転記されます。
次に、点数をデータベースから抽出していきます。
「点数」を抽出していく
「名前ID」でデータベースがフィルタされます。
「科目ID」でデータベースがフィルタされます。
フィルタした結果の「点数」を、入出力用のシートに転記をします。
これで、1つ目の点数を取得できます。
そして、次の「科目ID」で、データベースをフィルタします。
フィルタ結果の点数を、入出力用のシートに転記をします。
2つ目の点数を取得できました。
同じように、次の「科目ID」で、データベースをフィルタします。
フィルタ結果の「点数」を、入出力用のシートに転記をします。
3つ目の点数を取得できました。
最後にデータベースのオートフィルタを解除します。
これで、データベースから値を抽出できます。
データベースから値を抽出できた
こんな感じで、オートフィルタを使って、値を抽出することができます。
データベースに値を書き込む
データベースに値を書き込む機能について、みていきます。
登録されている値を書き込むのと、新規に値を書き込むやり方が違うので、それぞれみていきます。
値を書き込む手順
すでに登録されている値に、書き込む手順をポイントごとに実行して、みていきます。
次のVBAコードを、「書込み」ボタンに登録しておきます。
'「書込み」のボタンに登録
Sub WriteData()
Dim A, B
Set A = Worksheets("DB")
Set B = Worksheets("入出力")
For i = 5 To B.Cells(Rows.Count, "A").End(xlUp).Row
A.Range("A1").AutoFilter 1, B.Range("B2") '名前IDでフィルタ
A.Range("A1").AutoFilter 3, B.Cells(i, "A") '科目IDでフィルタ'フィルタ結果がある場合
If WorksheetFunction.Subtotal(103, A.Range("A:A")) > 1 Then
'点数を書込み
A.Cells(Rows.Count, "A").End(xlUp).Offset(0, 4) = B.Cells(i, "C")
'新規登録する場合
Else
A.Range("A1").AutoFilter
With A.Cells(Rows.Count, "A").End(xlUp)
.Offset(1, 0) = B.Range("B2") '名前ID
.Offset(1, 1) = .Offset(0, 1).FormulaR1C1 '名前
.Offset(1, 2) = B.Cells(i, "A") '科目ID
.Offset(1, 3) = .Offset(0, 3).FormulaR1C1 '科目
.Offset(1, 4) = B.Cells(i, "C") '点数
End With
End If
Next
'オートフィルタを解除
If A.AutoFilterMode Then A.Range("A1").AutoFilter
End Sub
では、みていきましょう。
点数を変更して「書込み」ボタンをクリック
まずは、入出力用シートで、点数を変更しておきます。
そして、書き込みボタンをクリックします。
ボタンをクリックで、VBAコードが実行されます。
「点数」をデータベースに書き込みしていく
まず、「名前ID」でデータベースがフィルタされます。
1つ目の「科目ID」で、データベースがフィルタされます。
点数を、フィルタしたデータベースに書き込みます。
1つ目の点数を、フィルタしたデータベースに書き込みできました。
同じように、次は、2番目の「科目ID」で、データベースがフィルタされます。
点数を、フィルタしたデータベースに書き込みます。
2つ目の点数を、フィルタしたデータベースに書き込みができました。
次は、3番目の「科目ID」で、データベースがフィルタされます。
点数を、フィルタしたデータベースに書き込みます。
3つ目の点数を、フィルタしたデータベースに書き込みができました。
データベースに「点数」を書き込みできた
こんな感じで、オートフィルタを使って、データベースに値の書き込みができます。
「科目」を追加して新規に書き込む手順
次は、「科目」を追加して新規に書き込む手順について、みていきます。
VBAコードは、次のところになります。
'「書込み」のボタンに登録
Sub WriteData()
Dim A, B
Set A = Worksheets("DB")
Set B = Worksheets("入出力")
For i = 5 To B.Cells(Rows.Count, "A").End(xlUp).Row
A.Range("A1").AutoFilter 1, B.Range("B2") '名前IDでフィルタ
A.Range("A1").AutoFilter 3, B.Cells(i, "A") '科目IDでフィルタ'フィルタ結果がある場合
If WorksheetFunction.Subtotal(103, A.Range("A:A")) > 1 Then
'点数を書込み
A.Cells(Rows.Count, "A").End(xlUp).Offset(0, 4) = B.Cells(i, "C")
'新規登録する場合
Else
A.Range("A1").AutoFilter
With A.Cells(Rows.Count, "A").End(xlUp)
.Offset(1, 0) = B.Range("B2") '名前ID
.Offset(1, 1) = .Offset(0, 1).FormulaR1C1 '名前
.Offset(1, 2) = B.Cells(i, "A") '科目ID
.Offset(1, 3) = .Offset(0, 3).FormulaR1C1 '科目
.Offset(1, 4) = B.Cells(i, "C") '点数
End With
End If
Next
'オートフィルタを解除
If A.AutoFilterMode Then A.Range("A1").AutoFilter
End Sub
では、みていきましょう。
「科目」を追加して値を抽出
まずは、手動で、データベースに、科目を追加しておきます。
適当に、名前を検索します。
適当に、リストから名前を選択します。
追加した科目が表示されます。
追加した科目が表示されました。
新規の「科目」に値を入力してボタンをクリック
新規で表示された「点数」のところに、値を入力してみます。
書き込みボタンをクリックします。
書き込みボタンをクリックで、VBAコードが実行されます。
データベースに値を書き込んでいく
まずは、名前IDと1番目の科目IDで、データベースをフィルタして、点数を書き込みます。
1つ目の点数を書き込みできました。
次は、名前IDと2番目の科目IDで、データベースをフィルタして、点数を書き込みます。
2つ目の点数を書き込みできました。
同じように、名前IDと3番目の科目IDで、データベースをフィルタして、点数を書き込みます。
3つ目の点数を書き込みできました。
次からが新規で登録した科目の登録になります。
新規に登録した科目IDで、データベースをフィルタします。
新規に登録した科目IDで、データベースをフィルタしました。
フィルタ結果がないので、オートフィルタを解除します。
データベースの最終行の下に、「名前ID」を新規で書き込みしていきます。
データベースの名前の列は、数式を上の行からコピーをします。
データベースに、「科目ID」を新規で書き込みします。
データベースの「科目」の列は、数式を上の行からコピーをします。
データベースに「点数」を新規で書き込みをします。
これで、新規に登録した「科目」を、書き込みができます。
新規に登録した「科目」を書き込みできた
新規に登録した「科目」を、書き込みができました。
こんな感じで、「科目」を新規で登録して、データベースに書き込みをすることができます。
「名前」を追加して新規に書き込む手順
「名前」を新規で追加して、データベースに書き込むこともできます。
関係するVBAコードは、先ほどと同じで、次のところになります。
'「書込み」のボタンに登録
Sub WriteData()
Dim A, B
Set A = Worksheets("DB")
Set B = Worksheets("入出力")
For i = 5 To B.Cells(Rows.Count, "A").End(xlUp).Row
A.Range("A1").AutoFilter 1, B.Range("B2") '名前IDでフィルタ
A.Range("A1").AutoFilter 3, B.Cells(i, "A") '科目IDでフィルタ'フィルタ結果がある場合
If WorksheetFunction.Subtotal(103, A.Range("A:A")) > 1 Then
'点数を書込み
A.Cells(Rows.Count, "A").End(xlUp).Offset(0, 4) = B.Cells(i, "C")
'新規登録する場合
Else
A.Range("A1").AutoFilter
With A.Cells(Rows.Count, "A").End(xlUp)
.Offset(1, 0) = B.Range("B2") '名前ID
.Offset(1, 1) = .Offset(0, 1).FormulaR1C1 '名前
.Offset(1, 2) = B.Cells(i, "A") '科目ID
.Offset(1, 3) = .Offset(0, 3).FormulaR1C1 '科目
.Offset(1, 4) = B.Cells(i, "C") '点数
End With
End If
Next
'オートフィルタを解除
If A.AutoFilterMode Then A.Range("A1").AutoFilter
End Sub