目次
インポートした 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_name 、check_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 というユーザー定義関数について紹介しました。
この情報が読者のお役に立てば幸いです。