MyTetra Share
Делитесь знаниями!
Чтение и запись INI файлов[VBA]
16.03.2019
23:43
Текстовые метки: ини,ini,vba
Раздел: !Закладки - VBA - Разобрать

Чтение и запись INI файлов

Функции 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

  • 11895 просмотров


В моем случае, имеется необходимость выгрузить в массив все разделы из 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
Так же в этом разделе:
 
MyTetra Share v.0.52
Яндекс индекс цитирования