大体でIT

-ちょっと使えるネタを紹介-

大体でIT

Excel VBAで、データベースの検索や、値の抽出、書き込むには、「オートフィルタ」を使うと、簡単にできます。実務では、データベースから値を抽出するだけでなく、データベースに値を書き込みたい、というような場合があります。Excelを使ったデータベースの操作方法について、マスターしていきましょう。

はじめに

この記事では、データベースの検索と、値を抽出する方法、そして、書き込む方法についてご紹介します。

データベースの検索や、値の抽出、そして、書き込むには、「オートフィルタ」を使うと便利です。

実務では、データベースから値を抽出するだけでなく、データベースに「書き込み」をしたい、というような場合があります。

今回ご紹介した方法を使えば、データベースの検索や抽出、書き込みができるようになります。

Excel VBAでオートフィルタを使って、データベースの操作について、マスターしていきいましょう。

では、データベースの検索と、値の抽出、そして書き込む方法について、解説していきます。

この記事を読むメリット

  • Excelを使ったデータベースの操作方法がマスターできます。

本記事の内容を動画でまとめています

目次から見たい項目へ移動すると便利ですよ。

目次

データベースから値の抽出と書き込みをしたい

まずは、VBAコードを実行した結果からみてみます。

データベースから値の抽出と、データベースへの書き込みができます。

機能としては、次の3つがあります。

  • データベースの検索
  • データベースから値を抽出
  • データベースへ値を書き込み

では、それぞれの機能をみてみます。

データベースから値を検索

データベースから値を検索してみます。

使用したデータベースと、入出力用のシートをみてみます。

データベース

データベースの値です。

データベースの値です

データベースの名前をは数式で取得しています。

データベースの名前をは数式で取得しています

科目も数式で取得しています。

科目も数式で取得しています

次は、入出力用のシートです。

入出力用のシート

入出力用のシートは、こんな感じです。

入出力用のシートです

まずは、名前を検索する機能からみてみます。

名前を検索する機能

名前を検索する値を入力します。

名前を検索します

データベースから検索した結果を取得できます。

データベースから検索した結果を取得できます

入力規則のリストを設定しておけば、リストから名前を入力できます。

入力規則のリストを設定しておけば、リストから名前を入力できます

こんな感じで、値を検索して、「名前」の入力リストを作成することができます。

データベースから値を抽出

次は、データベースから値を抽出する機能をみてみます。

データベースから値を抽出する機能

先ほど作成したリストから、名前を選択します。

リストから名前を選択します

データベースから値を抽出できます。

データベースから値を抽出できました

こんな感じで、データベースから値を抽出することができます。

データベースに値を書き込み

次は、先ほどとは反対に、データベースに値を書き込んでみます。

データベースに値を書き込む機能

まず、適当に値を変更しておきます。

値を変更してみます

VBAコードを登録しておいた書き込みボタンをクリックします。

書き込みボタンをクリックします

これで、データベースに書き込みができます。

データベースに書き込みできました

データベースに書き込みできました。

「科目」を追加して新規で登録する機能

データベースの「科目」を追加すれば、新規で書き込みすることもできます。

科目を追加してみます。

科目を追加してみます

再度、名前を選択します。

再度、名前を選択します

追加した科目が、表示されます。

追加した科目が、表示されます

追加した科目の点数に、値を入力します。

追加した科目の点数に、値を入力します

書き込みのボタンをクリックします。

書き込みのボタンをクリックします

これで、データベースに値を新規で書き込みできます。

データベースに値を新規で書き込みできました

データベースに値を新規で書き込みできました。

「名前」を追加して新規で登録する機能

データベースの「名前」を追加して、新規で書き込みをすることもできます。

名前を追加で登録してみます。

名前を追加で登録してみます

追加した名前を検索します。

追加した名前を検索します

リストから追加した名前を選択します。

リストから追加した名前を選択します

点数が空白の状態で、表示されます。

点数が空白の状態で、表示されます

点数に値を入力してみます。

点数に値を入力してみます

書き込みのボタンをクリックします。

書き込みのボタンをクリックします

これで、データベースに新規で書き込みができます。

データベースに新規で書き込みができました

データベースに新規で書き込みができました。

作成したVBAの機能としては、こんな感じで、データベースの検索、抽出、書き込みができます。

VBAコード全体

では、VBAコード全体をみてみます。

4つのモジュールから構成されています。

「入出力」シートのシートオブジェクト

「入出力」のシートモジュールに記載します。

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

入出力シートの「A2」と「C2」が変更されたら実行できるように、「Changeイベント」を使っています。

「名前」を検索するVBAコード

名前を検索するVBAコードです。

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」を取得

「名前ID」は、数式で取得します

名前が変更されたので、ここから、VBAコードが実行されます。

「科目ID」と「科目」がデータベースから転記される

実行すると、「科目ID」と「科目」がデータベースから転記されます。

「科目ID」と「科目」をデータベースから転記をします

次に、点数をデータベースから抽出していきます。

「点数」を抽出していく

「名前ID」でデータベースがフィルタされます。

「名前ID」でデータベースをフィルタします

「科目ID」でデータベースがフィルタされます。

「科目ID」でデータベースをフィルタします

フィルタした結果の「点数」を、入出力用のシートに転記をします。

データベースの「点数」を、入出力用のシートに転記をします

これで、1つ目の点数を取得できます。

そして、次の「科目ID」で、データベースをフィルタします。

次の「科目ID」で、データベースをフィルタします

フィルタ結果の点数を、入出力用のシートに転記をします。

フィルタ結果の点数を、入出力用のシートに転記をします

2つ目の点数を取得できました。

同じように、次の「科目ID」で、データベースをフィルタします。

次の「科目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」でデータベースがフィルタされます。

「名前ID」でデータベースをフィルタします

1つ目の「科目ID」で、データベースがフィルタされます。

最初の「科目ID」で、データベースをフィルタします

点数を、フィルタしたデータベースに書き込みます。

点数を、フィルタしたデータベースに書き込みます

1つ目の点数を、フィルタしたデータベースに書き込みできました。

同じように、次は、2番目の「科目ID」で、データベースがフィルタされます。

2番目の「科目ID」で、データベースをフィルタします

点数を、フィルタしたデータベースに書き込みます。

点数を、フィルタしたデータベースに書き込みます

2つ目の点数を、フィルタしたデータベースに書き込みができました。

次は、3番目の「科目ID」で、データベースがフィルタされます。

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で、データベースをフィルタして、点数を書き込みます。

名前IDと1番目の科目IDで、データベースをフィルタして、点数を書き込みます

1つ目の点数を書き込みできました。

次は、名前IDと2番目の科目IDで、データベースをフィルタして、点数を書き込みます。

名前IDと2番目の科目IDで、データベースをフィルタして、点数を書き込みます

2つ目の点数を書き込みできました。

同じように、名前IDと3番目の科目IDで、データベースをフィルタして、点数を書き込みます。

名前IDと3番目の科目IDで、データベースをフィルタして、点数を書き込みます

3つ目の点数を書き込みできました。

次からが新規で登録した科目の登録になります。

新規に登録した科目IDで、データベースをフィルタします。

新規に登録した科目IDで、データベースをフィルタします

新規に登録した科目IDで、データベースをフィルタしました。

フィルタ結果がないので、オートフィルタを解除します。

フィルタ結果がないので、オートフィルタを解除します

データベースの最終行の下に、「名前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

では、みていきましょう。

「名前」を追加して値を抽出してみる

まずは、手動で、名前を追加してみます。

名前を追加してみます

新規に登録した名前を、検索します。

新規に登録した名前を、検索します

リストから新規に登録した名前を選択します。

リストから新規に登録した名前を選択します

科目IDと科目が取得されて、点数はすべて空欄となります。

科目IDと科目が取得されて、点数はすべて空欄となります

まずは、新規で登録した名前を抽出できました。

点数を入力したボタンをクリック

新規で表示させた点数を入力してみます。

点数を入力してみます

書き込みボタンをクリックして、データベースに書き込みをします。

書き込みボタンをクリックしてみます

ボタンをクリックすると、書き込みのVBAコードが実行されます。

データベースに新規で「点数」を書き込んでいく

VBAコードを実行すると、「名前ID」と「科目ID」でフィルタされます。

「名前ID」と「科目ID」でフィルタされます

フィルタ結果がないので、一旦、フィルタを解除します。

フィルタ結果がないので、一旦、フィルタを解除します

値を新規で、データベースに書き込みをします。

値を新規で、データベースに書き込みをします

1つ目の科目を登録できました。

次の科目IDでフィルタします。

次の科目IDでフィルタします

同じように、フィルタ結果がないので、一旦、フィルタを解除します。

同じように、フィルタ結果がないので、一旦、フィルタを解除します

値を新規で、データベースに書き込みをします。

値を新規で、データベースに書き込みをします

2つ目の科目を新規で書き込みできました。

次の科目IDでフィルタします。

次の科目IDでフィルタします

フィルタ結果がないので、一旦、フィルタを解除します。

同じように、フィルタ結果がないので、一旦、フィルタを解除します

値を新規で、データベースに書き込みをします。

値を新規で、データベースに書き込みをします

3つ目の科目を書き込みできました。

次の科目IDでフィルタします。

次の科目IDでフィルタします

フィルタ結果がないので、一旦、フィルタを解除します。

同じように、フィルタ結果がないので、一旦、フィルタを解除します

値を新規で、データベースに書き込みをします。

値を新規で、データベースに書き込みをします

4つ目の科目を新規で書き込みができました。

これで、追加した「名前」で、新規に書き込みができます。

追加した「名前」で、新規で書き込みができた

追加した「名前」で、新規に書き込みができました

「名前」の場合でも、新規で登録して書き込みをすることができます。

おわりに

この記事では、データベースの検索と、値を抽出する方法、そして、書き込む方法についてご紹介しました。

データベースの検索や、値の抽出、そして、書き込むには、「オートフィルタ」を使うと便利です。

実務では、データベースから値を抽出するだけでなく、データベースに「書き込み」をしたい、というような場合があります。

今回ご紹介した方法を使えば、データベースの検索や抽出、書き込みができるようになります。

Excel VBAでオートフィルタを使って、データベースの操作について、マスターしていきいましょう。

参考になればと思います。最後までご覧くださいまして、ありがとうございました。

関連する記事から探す

カテゴリから探す

カテゴリから見たい項目を探すと便利ですよ。

サイト内を検索する

↓キーワードを入力する

アーカイブから探す