この記事では、マクロからINIファイルの設定値を取得する方法についてご説明します。
【動画】マクロからINIファイルの設定値を取得する実際の動き
本題に入る前に、まずは次の動画をご覧ください。
INIファイルを参照・値の取得はGetPrivateProfileString関数を使います。
GetPrivateProfileString関数はINIファイルから文字列を読み取ることができるAPI関数です。
取得したい値に該当するセクション名とキー名を引数に指定することで、対応する値を取得しています。
シート上にセクション名とキー名を入力するセルが用意されており、その値をマクロが取得してGetPrivateProfileString関数に渡して実行し、セクション名とキー名に該当する値をセルに出力しています。
マクロ作成の流れ
INIファイルとExcelファイルの例
INIァイル
今回は下のINIファイルを用意しました。
Excelファイル
今回は下のExcelファイルを用意しました。
セクション名とキー名、INIファイルのフルパスをそれぞれ入力して実行すると、セクション名とキー名に該当する値が黄色のセル(B11のセル)に出力されます。
セクション名に「connVal」、キー名に「comVal」を指定しているので、「vb1」の値が黄色のセルに出力されています。
コードの例
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ファイルから取得した値のサイズ 'セクション名を取得する secNM = Worksheets("top").Range("secName").Value 'キー名を取得する keyNM = Worksheets("top").Range("keyName").Value 'INIファイルのフルパスを取得する iniFilePath = Worksheets("top").Range("iniFilePath").Value 'GetPrivateProfileString関数を実行する前は戻り値のサイズが不明なため、 '一旦戻り値を格納するためのバッファを設定しておく(ここでは255文字までとしています) result = Space$(255) '指定されたセクション名とキー名に対応する値をINIファイルから読み取る '読み取った情報はresultに格納されている length = GetPrivateProfileString(secNM, _ keyNM, _ "", _ result, _ Len(result), _ iniFilePath) 'INIファイルから取得した値をセルvalに出力する Worksheets("top").Range("val").Value = Left$(result, length) End Sub
注目すべきコード①
最初に見て頂きたいのは4行目から10行目です。
' 初期化ファイル(今回は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関数が返すデータのサイズが実行時に異なる可能性があり、バッファオーバーフローの可能性もあるので、その対策としてバッファは事前に十分な大きさに設定しておく必要があるため、以下のとおり32行目で255文字のバッファをlpReturnedStringの引数に設定しています。
'GetPrivateProfileString関数を実行する前は戻り値のサイズが不明なため、 '一旦戻り値を格納するためのバッファを設定しておく(ここでは255文字までとしています) result = Space$(255)
nSize
nSizeは、lpReturnedStringバッファのサイズ(文字数)を指定します。
以下のとおり32行目で255文字のバッファをlpReturnedStringの引数に設定しているので、その文字数をLen関数で取得してnSizeの引数に指定します。
'GetPrivateProfileString関数を実行する前は戻り値のサイズが不明なため、 '一旦戻り値を格納するためのバッファを設定しておく(ここでは255文字までとしています) result = Space$(255)
lpFileName
lpFileNameには、INIファイルのフルパスを指定します。
注目すべきコード②
次に見て頂きたいのは22行目から28行目です。
'セクション名を取得する secNM = Worksheets("top").Range("secName").Value 'キー名を取得する keyNM = Worksheets("top").Range("keyName").Value 'INIファイルのフルパスを取得する iniFilePath = Worksheets("top").Range("iniFilePath").Value
コードの説明
以上のコードは、シート上に入力されたセクション名とキー名、INIファイルのフルパスを取得するコードです。
注目すべきコード③
次に見て頂きたいのは32行目です。
'GetPrivateProfileString関数を実行する前は戻り値のサイズが不明なため、 '一旦戻り値を格納するためのバッファを設定しておく(ここでは255文字までとしています) result = Space$(255)
コードの説明
以上のコードは、セクション名とキー名に該当する値を格納する変数resultに255文字のバッファを格納するコードです。
GetPrivateProfileString関数はセクション名とキー名に該当する値をlpReturnedStringの引数に返しますが、その返すデータのサイズが実行時に異なる可能性があり、バッファオーバーフローの可能性もあるので、その対策としてバッファは事前に十分な大きさに設定しておく必要があります。
そのため、255文字のバッファをlpReturnedStringの引数に設定するため、変数resultに255文字のバッファを格納しています。
注目すべきコード④
次に見て頂きたいのは36行目から41行目です。
'指定されたセクション名とキー名に対応する値を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関数の引数については、「注目すべきコード①」で詳しく説明しているのでそちらもご覧ください。
注目すべきコード⑤
次に見て頂きたいのは44行目です。
'INIファイルから取得した値をセルvalに出力する Worksheets("top").Range("val").Value = Left$(result, length)
コードの説明
以上のコードは、INIファイルから取得した、セクション名とキー名に該当する値をシートのセルvalに出力している処理のコードです。
変数resultには、セクション名とキー名に該当する値に、バッファの残り部分が含まれている状態が格納されているので、バッファの残り部分を削除する必要があります。
そこで、Left$関数を使いresult変数の先頭からlengthの値分の文字列を取得してExcelのvalのセルに出力しています。
動作確認
「INIファイルとExcelファイルの例」をご覧ください。
最後に
この記事では、マクロからINIファイルの設定値を取得する方法についてご説明しました。
マクロからINIファイルの設定値を取得するには、GetPrivateProfileStringというAPI関数を使います。
GetPrivateProfileStringというAPI関数を使うことでマクロからINIファイルの設定値が取得することができるので、本記事を参考にして頂けたら幸いです。
プログラミングのスキルを習得するなら
プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。
プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。