MyTetra Share
Делитесь знаниями!
Чтение и запись INI файлов[VBA]
Время создания: 31.07.2019 22:37
Текстовые метки: INI, vba
Раздел: Разные закладки - VBA
Запись: xintrea/mytetra_db_adgaver_new/master/base/1514664031tu3amudegv/text.html на raw.githubusercontent.com

Функции 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.64
Яндекс индекс цитирования