【Access VBA】インポートした CSV ファイルの種別を識別する

インポートした CSV ファイルの種別を識別する

この記事では「インポートした CSV ファイルの種別を識別する」ために利用可能な CheckIfIssue というユーザー定義関数について紹介します。

この情報が読者のお役に立てば幸いです。

解決できること

Microsoft Access の中でここで紹介する

CheckIfIssue

をマクロの中で呼び出すと 指定されたテーブルに 含まれるフィールドのレコード値を関数の戻り値として取得することができます。

読んでほしい方

こうした Microsoft Access VBA を使ったアプリケーションをこれから作ろうと思っている方、今まで VBA によるアプリケーションを作ってきたが、そのツールを第三者に提供する際に、フォルダの保存パス名等の利用者個人に紐づいた環境差分をVBAのプログラムの中にじかに書くのに抵抗がある方。

 

CheckIfIssue 関数 の紹介

説明

この関数は例えば Redmine からダウンロードしたチケット情報を、Access の中にインポート後のテーブル内の「プロジェクト」のような特定フィールドの内容により、貼り付け先の Excel ブック、シートを別にしたいというようなケースで、対象テーブルに保管されているフィールドのレコード値を関数の戻り値として取得したい場合に利用します。

参照オブジェクト

この関数を利用するためにはこの関数の実行前に

データベースツール > Visual Basic > ツール > 参照設定

の中で

  • Microsoft Office 16.0 Access Database engine
  • Microsoft ActiveX Data Objects 6.1 Library

にチェックを入れる必要があります。

利用例

例えば、 Redmine からダウンロードして、Access の中にインポートしたテーブルが以下のようなものだったとすると、

 

このテーブルは「ITスキルを習得する」というプロジェクトからダウンロードしたので、全てのレコードに含まれる「プロジェクト」フィールドには”ITスキルを習得する“という文字列が格納されていますが、別のプロジェクトからダウンロードした場合にはテーブル名は「issues」ですが「プロジェクト」フィールドには違う文字列が格納されます。

いま、Access の中で実行するマクロの処理内容をプロジェクト毎に分けたいときマクロ中で直接テーブルの内容を参照することができないので、CheckIfIssue 関数を使ってテーブルの内容を識別するというような使い方になります。

具体的にはまず以下のように Issue テーブル内の プロジェクト フィールドをデザインビュー内の「Σ 集計」機能を利用してグループ化(注1)した結果をもとに、

 

新しいテーブル T0010_プロジェクト というテーブルを作成する Q0020_作成_T0010_プロジェクト というクエリを作成して、これをクローズしたあと

(注1) Access のクエリには、グループ化という機能があり、同じ種類のものを一括りにして出力することができます。グループ化を行うためには、デザインビューでリボンエリアにある「Σ 集計」ボタンを押し、続いて出力項目欄で「グループ化」を選びます。この例では「プロジェクトフィールドには”ITスキルを習得する” という文字列しかありませんので、出力結果が”T0010_プロジェクト“のようなテーブル内容になります。

この Q0020_作成_T0010_プロジェクト クエリをダブルクリックすると、以下のような

のように、もともとのテーブル issues のプロジェクトフィールドの値を代表する文字列を抽出することができるので、この状態で

のようなマクロ M0100_Call_CheckIfIssue  を定義し、このマクロ  M0100_Call_CheckIfIssue  を実行することで、

のような結果を得ることができます。

マクロ M0100_Call_CheckIfIssue  の定義内容を詳しく見ると


If CheckIfIssue("T0010_プロジェクト","ITスキルを習得する")=0 Then
  メッセージボックス ("ITスキルを習得する" です。,はい,なし)
Else 
  メッセージボックス ("ITスキルを習得する" ではありません。,はい,なし)
If 文の最後

のように CheckIfIssue を “T0010_プロジェクト“、”ITスキルを習得する” といったパラメータを付けて呼び出しています。ここに “T0010_プロジェクト” は issues から抽出した プロジェクト の標本データが入っているテーブル、”ITスキルを習得する” は判定値です。

マクロの簡単な説明

行番号 説明
1 マクロの中で条件判定を行う If 文と一緒に CheckIfIssue 関数を パラメータ “T0010_プロジェクト” と “ITスキルを習得する” をつけで呼び出しています。
2 行番号1の結果が真(=0)のとき実行されるステートメントです。 ここではメッセージボックスを使って「”ITスキルを習得する”です」を表示していまますが、実際の使用例ではここに条件が一致した場合の処理を記述します。
3 行番号1の結果が真(=0)のとき実行されるステートメントの終わりを示します。マクロの実行はこの後行番号5までジャンプします。
4 行番号1の結果が偽(>0)のとき実行されるステートメントです。
ここではメッセージボックスを使って「”ITスキルを習得する”ではありません」を表示していますが、実際の使用例ではここに条件が一致しなかった場合の処理を記述します。
5 この If 文の終了を示しています。

引数

属性 意味
参照テーブル名 文字型 値を参照するフィールド、レコード値の入ったテーブル名を指定します。
判定値 文字型

参照テーブルの内容と一致するか比較するための判定値を記入します。Access 内で呼び出される関数の戻り値には整数しか指定できないため、入力パラメータとしてこの判定値を関数に渡し、判定を関数内で行うような実装方法としています。

戻り値

意味
0 一致
1 不一致

VBAコード


Function CheckIfIssue(table_name As String, check_string As String) As Integer

  Const C_SUCCESS As Integer = 0
  Const C_FAILURE As Integer = 1
  
  Dim databaseCurrent As Database
  Dim referenceTableName As New ADODB.Recordset

  referenceTableName.Open table_name, CurrentProject.Connection

  Dim project As String

  Do Until referenceTableName.EOF
    project = referenceTableName![プロジェクト]
    referenceTableName.MoveNext
  Loop

  referenceTableName.Close

  If project = check_string Then
    CheckIfIssue = C_SUCCESS
  Else
    CheckIfIssue = C_FAILURE
  End If

End Function

VBAコードの簡単な説明

行番号 説明
1 関数名と関数の戻り値の型(Integer:整数型)、入力パラメータ table_namecheck_string の名前、型(String:文字列型)を定義しています。
3-4 このプログラムの中で利用する定数C_SUCCESS(0:一致)、C_FAILURE(1:不一致)を定義しています。ここでは21行目、23行目ででこの関数の戻り値が C_SUCCESS(0:一致)、C_FAILURE(1:不一致)であることが明確にわかるようなコーディングの仕方になります。
6-7 ADO(注2) を用いてオブジェクト  referenceTableName  の定義をします。
9 referenceTableName  を 入力パラメータで指定された 参照テーブル名 table_name でオープンします。
11 参照テーブルから読みだしたプロジェクトの内容を設定する文字列変数を project  として定義します。
13-16 プロジェクト フィールドの値を project に設定しています。
18 参照テーブルをクローズします。
20 参照テーブルから読みだした project と入力パラメータ check_string を比較します
21 この関数の戻り値に C_SUCCESS(0:一致) を設定して関数を終わります。
23 この関数の戻り値に C_FAILURE (1:不一致) を設定して関数を終わります。

(注2) ADO (ActiveX Data Objects) : DAOの後継としてMicrosoftが仕様策定した統一的方法でデータベースを操作、参照するためのソフトウェア部品のパッケージおよびその呼び出し規約(API)。ActiveXコントロールとして様々なソフトウェアやプログラミング言語から共通の方法で簡単にデータベースにアクセスでき、また表計算ソフトのワークシートやCSVファイルなどを含む様々な形式のデータに同じ手順でアクセスすることができます。

まとめ

この記事では「インポートした CSV ファイルの種別を識別する」ために利用可能な CheckIfIssue というユーザー定義関数について紹介しました。

この情報が読者のお役に立てば幸いです。