Функции WIF и RIF являются обёртками для WinAPI функций WritePrivateProfileString и GetPrivateProfileString, и предназначены для записи и чтения параметров из файлов конфигурации INI.
INI-файлы - это обычные текстовые файлы, предназначенные для хранения настроек программ.
Примерный вид структуры INI -файла:
; комментарий
[Section1]
var1 = значение_1
var2 = значение_2
[access]
changed=02.06.2009 08:15
[client]
name=ООО «Рога и копыта»
[files]
good=Название товара
Declare 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
Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As String, ByVal lpKeyName As Any, _
ByVal lpString As Any, ByVal lpFileName As String) As Long
Public Sub WIF(ByVal sName$, ByVal val$, ByVal sPart$, ByVal FilePath$)
' функция ищет в ini файле FilePath$ раздел sPart$ (если раздела нет - он создаётся),
' и добавляет в него параметра с именем sName$ и значением val
Dim intRet As Integer: intRet = WritePrivateProfileString(sPart, sName, val, FilePath)
'If intRet <> 1 Then 'Неудачное завершение'(Проверка результата записи)
End Sub
Public Function RIF(ByVal sName$, ByVal DefVal$, ByVal sPart$, ByVal FilePath$) As String
' функция ищет в ini файле FilePath$ раздел sPart$,
' и читает из него значение параметра с именем sName$
' Если такой параметр не найден, возвращается значение по умолчанию DefVal$
Const strNoValue As String = ""
Dim intRet As Integer 'Длина возвращаемой строки (функцией GetPrivateProfileString)
Dim strRet As String 'Возвращаемая строка
'Получаем значение из файла - если его нет будет возвращен 3й аргумент = strNoValue
strRet = String(255, Chr(0)): intRet = GetPrivateProfileString(sPart, sName, strNoValue, strRet, 255, FilePath)
strRet = Left$(strRet, intRet)
'Определяем было найдено значение или нет (если возвращено знач. константы strNoValue то = НЕТ)
If strRet = strNoValue Then strRet = DefVal 'Значение не было найдено - возвращаем значение по умолчанию
RIF = strRet
End Function
В моем случае, имеется необходимость выгрузить в массив все разделы из ini-файла (FName) в отсортированном виде.
Использую следующую функцию. Может кому пригодится.
Function IniReadSections(FName As String) As Variant
Dim iText As String
Open FName For Input As #1
iText = Input(LOF(1), #1)
Close #1
Sep = Chr(10)
If Right(iText, 1) <> Sep Then
iText = iText & Sep
End If
On Error Resume Next
Pos = 1
NextPos = InStr(Pos, iText, Sep)
With New Collection
While NextPos >= 1
TempVal = Mid(iText, Pos, NextPos - Pos)
TempVal = Application.WorksheetFunction.Clean(TempVal)
If Trim(TempVal) <> "" And Left(TempVal, 1) = "[" Then
TempVal = Mid(TempVal, 2, Len(TempVal) - 2)
S = Trim(TempVal)
If Len(S) > 0 Then
If IsEmpty(.Item(S)) Then
For i = 1 To .Count
If S < .Item(i) Then Exit For
Next
If i > .Count Then .Add S, S Else .Add S, S, Before:=i
End If
End If
End If
Pos = NextPos + 1
NextPos = InStr(Pos, iText, Sep)
Wend
ReDim Arr(1 To .Count)
For i = 1 To .Count
Arr(i) = .Item(i)
Next
End With
IniReadSections = Arr
End Function