Чтение и запись 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

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

нашла ответ для 64 разрядных необходимо
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

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

У меня 2019 excel вставляю в редактор код из первого блока "Declare Function GetPri...." у меня строчки подсвечены красным как ошибка.
Это значит, что для моей версии код уже устарел?

Огромное спасибо, очень полезно. Всё работает.

В моем случае, имеется необходимость выгрузить в массив все разделы из 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

Сам нашел.
Используем эту же процедуру записи WIF, но:
для удаления параметра, в качестве ЗНАЧЕНИЯ необходимо указать vbNullString.
для удаления всего раздела, в качестве ПАРАМЕТРА необходимо указать vbNullString.

Здравствуйте. Подскажите, существуют ли функции для удаления целого раздела и удаления отдельного параметра?

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
  _      ____    _____                   _   
| | __ |___ \ | ____| __ _ __ _ | |_
| |/ / __) | | _| / _` | / _` | | __|
| < / __/ | |___ | (_| | | (_| | | |_
|_|\_\ |_____| |_____| \__, | \__, | \__|
|___/ |_|
Введите код, изображенный в стиле ASCII-арт.

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.