この記事では、AccessのマクロからINIファイルの設定値を取得する方法についてご説明します。
【動画】AccessのマクロからINIファイルの設定値を取得する実際の動き
本題に入る前に、まずは次の動画をご覧ください。
INIファイルを参照・値の取得はGetPrivateProfileString関数を使います。
GetPrivateProfileString関数はINIファイルから文字列を読み取ることができるAPI関数です。
取得したい値に該当するセクション名とキー名を引数に指定することで、対応する値を取得しています。
シート上にセクション名とキー名を入力するセルが用意されており、その値をマクロが取得してGetPrivateProfileString関数に渡して実行し、セクション名とキー名に該当する値をセルに出力しています。
マクロ作成の流れ
INIファイルとAccessファイルのフォームの例
INIァイル
今回は下のINIファイルを用意しました。
Accessファイルのフォーム
今回は下のAccessファイルのフォームを用意しました。
セクション名とキー名、INIファイルのフルパスをそれぞれ入力して実行ボタンをクリックすると、セクション名とキー名に該当する値が一番下のテキストボックスに出力されます。
セクション名に「connVal」、キー名に「comVal」を指定しているので、一番下のテキストボックスに「vb1」の値が出力されています。
コードの例
Option Compare Database Option Explicit '初期化ファイル(今回はiniファイル)にあるセクションから文字列を取得するGetPrivateProfileString関数の宣言 Private Declare PtrSafe Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _ (ByVal lpApplicationName As String, _ ByVal lpKeyName As String, _ ByVal lpDefault As String, _ ByVal lpReturnedString As String, _ ByVal nSize As Long, _ ByVal lpFileName As String) As Long Private Sub btn_exec_Click() Dim secNM As String 'セクション名を格納する変数 Dim keyNM As String 'キー名を格納する変数 Dim iniFilePath As String 'INIファイルのフルパスを格納する変数 Dim retVal As String 'INIファイルから取得した値を格納する変数 Dim result As String 'INIファイルから取得した値を格納する変数 Dim length As Long 'INIファイルから取得した値のサイズ If Not IsNull(Me.txb_secNM.Value) Then 'セクション名を入力するテキストボックスが未入力ではない場合 'セクション名を取得する secNM = Me.txb_secNM.Value Else 'セクション名を入力するテキストボックスが未入力の場合 MsgBox "セクション名が入力されていないので処理を終了します" '処理を終了する Exit Sub End If 'キー名を取得する If Not IsNull(txb_keyNM.Value) Then 'キー名を入力するテキストボックスが未入力ではない場合 'キー名を取得する keyNM = txb_keyNM.Value Else 'キー名を入力するテキストボックスが未入力の場合 MsgBox "キー名が入力されていないので処理を終了します" '処理を終了する Exit Sub End If 'INIファイルのフルパスを取得する If Not IsNull(txb_iniFilePath.Value) Then 'INIファイルのフルパスを入力するテキストボックスが未入力ではない場合 'INIファイルのフルパスを取得する iniFilePath = txb_iniFilePath.Value Else 'INIファイルのフルパスを入力するテキストボックスが未入力の場合 MsgBox "INIファイルのフルパスが入力されていないので処理を終了します" '処理を終了する Exit Sub End If 'GetPrivateProfileString関数を実行する前は戻り値のサイズが不明なため、 '一旦戻り値を格納するためのバッファを設定しておく(ここでは255文字までとしています) result = Space$(255) '指定されたセクション名とキー名に対応する値をINIファイルから読み取る '読み取った情報はresultに格納されている length = GetPrivateProfileString(secNM, _ keyNM, _ "", _ result, _ Len(result), _ iniFilePath) 'INIファイルから取得した値をセルvalに出力する txb_val.Value = Left$(result, length) End Sub
注目すべきコード①
最初に見て頂きたいのは5行目から11行目です。
'初期化ファイル(今回はiniファイル)にあるセクションから文字列を取得するGetPrivateProfileString関数の宣言 Private Declare PtrSafe Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _ (ByVal lpApplicationName As String, _ ByVal lpKeyName As String, _ ByVal lpDefault As String, _ ByVal lpReturnedString As String, _ ByVal nSize As Long, _ ByVal lpFileName As String) As Long
コードの説明
以上のコードは、INIファイルから文字列を読み取るGetPrivateProfileString関数の宣言部です。
GetPrivateProfileString関数はAPI関数であり、マクロ内でGetPrivateProfileString関数を実行する場合は以上のように宣言する必要があります。
なおGetPrivateProfileString関数の各引数については次の通りです。
lpApplicationName
lpApplicationNameには、INIファイル内のセクション名を指定します。
lpKeyName
lpKeyNameには、キーの名前を指定します。
lpDefault
lpDefaultには、指定されたセクション名とキー名の組み合わせがINIファイル内に存在しない場合に返されるデフォルト値を指定します。
lpApplicationNameに存在しないセクション名、またはlpKeyNameに存在しないキー名を指定された場合、lpDefaultに指定した値が引数lpReturnedStringに返されます。
例えばlpApplicationNameに存在しないセクション名、またはlpKeyNameに存在しないキー名を指定された場合、lpDefaultに「abc」と指定していたら、引数lpReturnedStringに「abc」の文字列が返されます。
lpReturnedString
lpReturnedStringは、読み取った値を格納するためのバッファ(文字列変数)を指定します。
このlpReturnedStringにセクション名とキー名に該当する値が返されます。
ただし、GetPrivateProfileString関数が返すデータのサイズが実行時に異なる可能性があり、バッファオーバーフローの可能性もあるので、その対策としてバッファは事前に十分な大きさに設定しておく必要があるため、以下のとおり80行目で255文字のバッファをlpReturnedStringの引数に設定しています。
'GetPrivateProfileString関数を実行する前は戻り値のサイズが不明なため、 '一旦戻り値を格納するためのバッファを設定しておく(ここでは255文字までとしています) result = Space$(255)
nSize
nSizeは、lpReturnedStringバッファのサイズ(文字数)を指定します。
以下のとおり80行目で255文字のバッファをlpReturnedStringの引数に設定しているので、その文字数をLen関数で取得してnSizeの引数に指定します。
'GetPrivateProfileString関数を実行する前は戻り値のサイズが不明なため、 '一旦戻り値を格納するためのバッファを設定しておく(ここでは255文字までとしています) result = Space$(255)
lpFileName
lpFileNameには、INIファイルのフルパスを指定します。
注目すべきコード②
次に見て頂きたいのは22行目から76行目です。
If Not IsNull(Me.txb_secNM.Value) Then 'セクション名を入力するテキストボックスが未入力ではない場合 'セクション名を取得する secNM = Me.txb_secNM.Value Else 'セクション名を入力するテキストボックスが未入力の場合 MsgBox "セクション名が入力されていないので処理を終了します" '処理を終了する Exit Sub End If 'キー名を取得する If Not IsNull(txb_keyNM.Value) Then 'キー名を入力するテキストボックスが未入力ではない場合 'キー名を取得する keyNM = txb_keyNM.Value Else 'キー名を入力するテキストボックスが未入力の場合 MsgBox "キー名が入力されていないので処理を終了します" '処理を終了する Exit Sub End If 'INIファイルのフルパスを取得する If Not IsNull(txb_iniFilePath.Value) Then 'INIファイルのフルパスを入力するテキストボックスが未入力ではない場合 'INIファイルのフルパスを取得する iniFilePath = txb_iniFilePath.Value Else 'INIファイルのフルパスを入力するテキストボックスが未入力の場合 MsgBox "INIファイルのフルパスが入力されていないので処理を終了します" '処理を終了する Exit Sub End If
コードの説明
以上のコードは、フォーム上に設置されたセクション名とキー名、INIファイルのフルパス入力用のテキストボックスの値を取得するコードです。
なお、テキストボックスが未入力のままGetPrivateProfileString関数が実行されると想定外の値が返されてしまうので、未入力の状態でGetPrivateProfileString関数が実行されないよう、未入力の入力チェックを行っています。
セクション名が未入力の場合は36行目で処理を終了させています。
キー名が未入力の場合は55行目で処理を終了させています。
INIファイルのフルパスが未入力の場合は74行目で処理を終了させています。
なお、今回はテキストボックスの未入力チェックは、テキストボックスに対してNot IsNullを使用しています。
もしテキストボックスが未入力の場合、Not IsNullはFALSEを、入力されている場合はTRUEを返します。
セクション名が入力されている場合、22行目の未入力の判定でTrueを返すので27行目でセクション名を変数secNMに格納します。
キー名が入力されている場合、41行目の未入力の判定でTrueを返すので46行目でキー名を変数keyNMに格納します。
INIファイルのフルパスが入力されている場合、60行目の未入力の判定でTrueを返すので65行目でキー名を変数keyNMに格納します。
注目すべきコード③
次に見て頂きたいのは80行目です。
'GetPrivateProfileString関数を実行する前は戻り値のサイズが不明なため、 '一旦戻り値を格納するためのバッファを設定しておく(ここでは255文字までとしています) result = Space$(255)
コードの説明
以上のコードは、セクション名とキー名に該当する値を格納する変数resultに255文字のバッファを格納するコードです。
GetPrivateProfileString関数はセクション名とキー名に該当する値をlpReturnedStringの引数に返しますが、その返すデータのサイズが実行時に異なる可能性があり、バッファオーバーフローの可能性もあるので、その対策としてバッファは事前に十分な大きさに設定しておく必要があります。
そのため、255文字のバッファをlpReturnedStringの引数に設定するため、変数resultに255文字のバッファを格納しています。
注目すべきコード④
次に見て頂きたいのは84行目から89行目です。
'指定されたセクション名とキー名に対応する値をINIファイルから読み取る '読み取った情報はresultに格納されている length = GetPrivateProfileString(secNM, _ keyNM, _ "", _ result, _ Len(result), _ iniFilePath)
コードの説明
以上のコードは、GetPrivateProfileString関数を実行するコードです。
以上のコードで引数に指定している値は下のとおりです。
第1引数
第1引数はGetPrivateProfileString関数の「lpApplicationName」に渡る値を指定しています。
「lpApplicationName」にはINIファイル内のセクション名を指定するので、セクション名が格納されている変数secNMを指定しています。
第2引数
第2引数はGetPrivateProfileString関数の「lpKeyName」に渡る値を指定しています。
「lpKeyName」にはINIファイル内のキー名を指定するので、キー名が格納されている変数keyNMを指定しています。
第3引数
第3引数はGetPrivateProfileString関数の「lpDefault」に渡る値を指定しています。
「lpDefault」には指定されたセクション名とキー名の組み合わせがINIファイル内に存在しない場合に返されるデフォルト値を指定するので、今回はブランクを返して欲しいため「””」を指定しています。
第4引数
第4引数はGetPrivateProfileString関数の「lpReturnedString」に渡る値を指定しています。
「lpReturnedString」には読み取った値を格納するためのバッファ(文字列変数)を指定するので、バッファが格納された変数resultを指定しています。
第5引数
第5引数はGetPrivateProfileString関数の「nSize」に渡る値を指定しています。
「nSize」にはlpReturnedStringバッファのサイズ(文字数)を指定するので、len関数が変数resultから取得した文字数を指定しています。
第6引数
第6引数はGetPrivateProfileString関数の「lpFileName」に渡る値を指定しています。
「lpFileName」にはINIファイルのフルパスを指定するので、INIファイルのフルパスが格納されている変数iniFilePathを指定しています。
なお、GetPrivateProfileString関数の引数については、「注目すべきコード①」で詳しく説明しているのでそちらもご覧ください。
注目すべきコード⑤
次に見て頂きたいのは92行目です。
'INIファイルから取得した値をセルvalに出力する Worksheets("top").Range("val").Value = Left$(result, length)
コードの説明
以上のコードは、INIファイルから取得した、セクション名とキー名に該当する値をシートのセルvalに出力している処理のコードです。
変数resultには、セクション名とキー名に該当する値に、バッファの残り部分が含まれている状態が格納されているので、バッファの残り部分を削除する必要があります。
そこで、Left$関数を使いresult変数の先頭からlengthの値分の文字列を取得してExcelのvalのセルに出力しています。
動作確認
「INIファイルとAccessファイルのフォームの例」をご覧ください。
最後に
この記事では、AccessのマクロからINIファイルの設定値を取得する方法についてご説明しました。
AccessのマクロからINIファイルの設定値を取得するには、GetPrivateProfileStringというAPI関数を使います。
GetPrivateProfileStringというAPI関数を使うことでAccessのマクロからINIファイルの設定値が取得することができるので、本記事を参考にして頂けたら幸いです。
プログラミングのスキルを習得するなら
プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。
プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。