設定を外部ファイルで管理

iniファイル

必要なAPI

'INIファイル読み込み
Private Declare PtrSafe Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

'INIファイル書き込み
Private Declare PtrSafe Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

コードサンプル

Sub iniファイル書き込み(セクション As String, キー As String, 値 As String)
   
   Dim iniファイル As String: iniファイル = ThisWorkbook.Path & "\config.ini"
   Dim lret As Long: lret = WritePrivateProfileString(セクション, キー, 値, iniファイル)
   
End Sub


Function iniファイル読み込み(セクション As String, キー As String, Optional ByVal 初期値 As String = vbNullString)
   Dim buf As String * 256     '固定長の文字列型
   Dim iniファイル As String: iniファイル = ThisWorkbook.Path & "\config.ini"
       
   Dim rc As Long: rc = GetPrivateProfileString(セクション, キー, 初期値, buf, Len(buf), iniファイル)
   
   '文末のNULL文字を削除
   iniファイル読み込み = Left$(buf, InStr(buf, vbNullChar) - 1)
   
End Function

使用サンプル

Private Sub 書き込みテスト()
   Call iniファイル書き込み("セクション1", "キーA", "あいうえお")
   Call iniファイル書き込み("セクション1", "キーB", "かきくけこ")
   Call iniファイル書き込み("セクション1", "キーC", "さしすせそ")
   Call iniファイル書き込み("セクション2", "キーA", "たちつてと")
   Call iniファイル書き込み("セクション2", "キーB", "なにぬねの")
End Sub

Private Sub 読み込みテスト()
   Msgbox iniファイル読み込み("セクション1", "キーA")
End Sub

仕様

  • iniファイル:文字コード「Shift-JIS」、改行コード「CR+LF」
  • iniファイルにコメントを記述する場合は行頭に「セミコロン」を記述する(1行コメント)
  • iniファイルが存在しなければ自動で生成される

メモ

  • キーまたは値に「=」が含まれていてもエラーは起こらずそのまま出力されます
  • コードサンプルだとブックと同一フォルダに「config.ini」が必要(存在しなければ自動作成)
  • インターネットショートカット は同一形式のため、内部に設定を隠すことが可能

iniファイル2

必要なAPI

'INIファイルセクション一括読み込み
Private Declare Function GetPrivateProfileSection Lib "kernel32" Alias "GetPrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

コードサンプル

Function iniファイルセクション一括読み込み(セクション As String) As Variant
   
   Dim buf As String * 256     '固定長の文字列型
   Dim iniファイル As String: iniファイル = ThisWorkbook.Path & "\Data\config.ini"
   
   Dim ret As Long: ret = GetPrivateProfileSection(セクション, buf, Len(buf), iniファイル)
   
   '文末のNULL文字を削除
   Dim 一括データ As String: 一括データ = Left$(buf, InStr(1, buf, vbNullChar & vbNullChar) - 1)
   
   ' 配列形式で返す:Array(0) = 「キー = 値」
   iniファイルセクション一括読み込み = Split(一括データ, vbNullChar)
   
End Function

使用サンプル

サンプル1:文字列で一括取得

Private Sub サンプル1()
   
   Dim 配列 As Variant: 配列 = iniファイルセクション一括読み込み("セクション1")
   
   For i = 0 To UBound(配列)
       Debug.Print 配列(i)
   Next
   
End Sub

サンプル2:キーと値を別々に取得

Private Sub サンプル2()
   
   Dim 配列 As Variant: 配列 = iniファイルセクション一括読み込み("セクション1")
   
   For i = 0 To UBound(配列)
       キー = Split(配列(i), "=")(0)
       値   = Split(配列(i), "=")(1)
       Debug.Print キー & "..." & 値
   Next
   
End Sub

サンプル2-2:キーにRangeの番地、値に入力文字を指定して一括で入力(初期化等)する

Private Sub サンプル2-2()
   
   Dim 配列 As Variant: 配列 = iniファイルセクション一括読み込み("シートの初期化")
   
   For i = 0 To UBound(配列)
       キー = Split(配列(i), "=")(0)
       値 = Split(配列(i), "=")(1)
       Range(キー) = 値
   Next
   
End Sub

サンプル2-3:2-2圧縮版

Private Sub サンプル2-3()
   
   Dim 配列 As Variant: 配列 = iniファイルセクション一括読み込み("シートの初期化")
   
   For i = 0 To UBound(配列)
       Range(Split(配列(i), "=")(0)) = Split(配列(i), "=")(1)
   Next
   
End Sub

サンプル3:サンプル2-2改良版(値に「=」を使用可能)

Private Sub サンプル()
   Dim 配列 As Variant: 配列 = iniファイルセクション一括読み込み("シートの初期化")
   For i = 0 To UBound(配列)
       Dim 区切り位置 As String: 区切り位置 = InStr(1, 配列(i), "=")
       キー = Left(配列(i), 区切り位置 - 1)
       値 = Mid(配列(i), 区切り位置 + 1)
       Debug.Print キー & "..." & 値
       'Range(キー) = 値
   Next
End Sub

サンプル3-2:サンプル3圧縮版

Private Sub サンプル()
   Dim 配列 As Variant: 配列 = iniファイルセクション一括読み込み("シートの初期化")
   For i = 0 To UBound(配列)
       Range(Left(配列(i), InStr(1, 配列(i), "=") - 1)) = Mid(配列(i), InStr(1, 配列(i), "=") + 1)
   Next
End Sub

仕様

  • セクション一括読み込み「GetPrivateProfileSection」は「キー=値」のセットの末尾にNull文字(vbNullChar)を入れることで区切りを示し、セクション内のセットの羅列を1つの文字列で取得します
  • 取得する文字列の末尾はセットの末尾と全体の末尾という意味でNull文字(vbNullChar)が2文字続きます

参考