글 수 14
VBA를 공부하는 사람들을 위한.. | ||||||||||||||||||||||
VBA로 *.ini파일 다루기 | ||||||||||||||||||||||
Created by abyul.com 2013.09.12 00:35:11 | ||||||||||||||||||||||
Original Lecture : http://www.abyul.com/zbxe/123812 | ||||||||||||||||||||||
ini 파일이 머냐? | ||||||||||||||||||||||
ini파일은 프로그램의 설정 파일입니다. | ||||||||||||||||||||||
보통은 파일 확장자가 ".ini"지만 ".cfg"나 ".conf"를 사용하기도합니다. | ||||||||||||||||||||||
형식만 맞으면 확장자는 상관이 없는거죠. 가끔보면 언어 설정을(.lng) ini형식으로 하기도합니다. | ||||||||||||||||||||||
ini 파일의 형식 | ||||||||||||||||||||||
아래와 같은 형식을 갖습니다. | ||||||||||||||||||||||
[섹션] | ||||||||||||||||||||||
키이름1=키값1 | ||||||||||||||||||||||
;주석 달음 | ||||||||||||||||||||||
키이름2=키값2 | ||||||||||||||||||||||
자세한 정의와 형식에 대한 것은 아래 링크(위키피디아)를 참고하세요.. | ||||||||||||||||||||||
http://ko.wikipedia.org/wiki/INI_%ED%8C%8C%EC%9D%BC | ||||||||||||||||||||||
VBA에서 어떻게 사용하냐? | ||||||||||||||||||||||
윈도우 API를 사용해 핸들링합니다. | ||||||||||||||||||||||
kernel32.dll을 참조하면 설정값을 불러오는 GetPrivateProfileString함수와 | ||||||||||||||||||||||
설정 값을 기록하는 WrtitePrivateProfileString함수를 사용할 수 있게 됩니다. | ||||||||||||||||||||||
코드를 보면 아래와 같이 표시됩니다. | ||||||||||||||||||||||
Visual Basic Editor의 모듈 창에 아래의 코드를 입력하면, | ||||||||||||||||||||||
특정값을 불러오거나 저장할 수 있는 함수를 사용할 수 있게 됩니다. | ||||||||||||||||||||||
각각의 함수에 대한 세부 정보는 msdn을 참고하세요.. | ||||||||||||||||||||||
Get | http://msdn.microsoft.com/en-us/library/windows/desktop/ms724353(v=vs.85).aspx | |||||||||||||||||||||
Write | http://msdn.microsoft.com/en-us/library/windows/desktop/ms725501(v=vs.85).aspx | |||||||||||||||||||||
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _ | ||||||||||||||||||||||
(ByVal lpApplicationName As String, _ | ||||||||||||||||||||||
ByVal lpKeyName As String, _ | ||||||||||||||||||||||
ByVal lpDefault As String, _ | ||||||||||||||||||||||
ByVal lpReturnedString As String, _ | ||||||||||||||||||||||
ByVal nSize As Integer, _ | ||||||||||||||||||||||
ByVal lpFileName As String) As Long | ||||||||||||||||||||||
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" _ | ||||||||||||||||||||||
(ByVal lpApplicationName As String, _ | ||||||||||||||||||||||
ByVal lpKeyName As String, _ | ||||||||||||||||||||||
ByVal lpString As String, _ | ||||||||||||||||||||||
ByVal lpFileName As String) As Long | ||||||||||||||||||||||
실제 사용하는 코드 | ||||||||||||||||||||||
위에서 함수들을 사용할 수있게 했으니.. 실제 프로시저에서 사용해보겠습니다. | ||||||||||||||||||||||
사용방법은 아래 코드를 참고해보세요.. | ||||||||||||||||||||||
### ini파일에서 값을 불러옵니다. | ||||||||||||||||||||||
Sub abyulReadIni() | ||||||||||||||||||||||
Dim sApp As String, sKey As String, sBuffer As String, sPath As String | ||||||||||||||||||||||
sApp = "Korean": sKey = "s0003": sPath = "C:\ProgramData\abyul\Excel\info.ini" | ||||||||||||||||||||||
sBuffer = Space(255) | ||||||||||||||||||||||
Dim iResult As Integer | ||||||||||||||||||||||
iResult = GetPrivateProfileString(sApp, sKey, "", sBuffer, 255, sPath) | ||||||||||||||||||||||
If iResult = 0 Then | ||||||||||||||||||||||
MsgBox "내용이 없거나 불러오기 실패!" | ||||||||||||||||||||||
Else | ||||||||||||||||||||||
MsgBox sBuffer, vbInformation, "값을 제대로 불러왔습니다!!!!" | ||||||||||||||||||||||
End If | ||||||||||||||||||||||
End Sub | ||||||||||||||||||||||
'### ini파일에 값을 입력합니다. | ||||||||||||||||||||||
Sub abyulWriteIni() | ||||||||||||||||||||||
Dim sApp As String, sKey As String, sBuffer As String, sPath As String | ||||||||||||||||||||||
sApp = "Korean": sKey = "name": sPath = "C:\ProgramData\abyul\Excel\info.ini" | ||||||||||||||||||||||
sBuffer = "God" | ||||||||||||||||||||||
Dim iResult As Integer | ||||||||||||||||||||||
iResult = WritePrivateProfileString(sApp, sKey, sBuffer, sPath) | ||||||||||||||||||||||
If iResult = 0 Then | ||||||||||||||||||||||
MsgBox "지정 경로가 존재하지 않는 듯? 파일은 없으면 만듬" | ||||||||||||||||||||||
Else | ||||||||||||||||||||||
MsgBox "기록 성공!" | ||||||||||||||||||||||
End If | ||||||||||||||||||||||
End Sub | ||||||||||||||||||||||
전체 코드.. | ||||||||||||||||||||||
위에서 WinAPI함수를 사용할 수 있게 선언할때, 32비트용으로 선언했는데요.. | ||||||||||||||||||||||
64비트용 엑셀에서도 돌아가도록 보완한 전체 코드입니다. | ||||||||||||||||||||||
Option Explicit | ||||||||||||||||||||||
#If Win64 Then | ||||||||||||||||||||||
Private Declare PtrSafe Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _ | ||||||||||||||||||||||
(ByVal lpApplicationName As String, _ | ||||||||||||||||||||||
ByVal lpKeyName As String, _ | ||||||||||||||||||||||
ByVal lpDefault As String, _ | ||||||||||||||||||||||
ByVal lpReturnedString As String, _ | ||||||||||||||||||||||
ByVal nSize As Integer, _ | ||||||||||||||||||||||
ByVal lpFileName As String) As Long | ||||||||||||||||||||||
#Else | ||||||||||||||||||||||
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _ | ||||||||||||||||||||||
(ByVal lpApplicationName As String, _ | ||||||||||||||||||||||
ByVal lpKeyName As String, _ | ||||||||||||||||||||||
ByVal lpDefault As String, _ | ||||||||||||||||||||||
ByVal lpReturnedString As String, _ | ||||||||||||||||||||||
ByVal nSize As Integer, _ | ||||||||||||||||||||||
ByVal lpFileName As String) As Long | ||||||||||||||||||||||
#End If | ||||||||||||||||||||||
#If Win64 Then | ||||||||||||||||||||||
Private Declare PtrSafe Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" _ | ||||||||||||||||||||||
(ByVal lpApplicationName As String, _ | ||||||||||||||||||||||
ByVal lpKeyName As String, _ | ||||||||||||||||||||||
ByVal lpString As String, _ | ||||||||||||||||||||||
ByVal lpFileName As String) As Long | ||||||||||||||||||||||
#Else | ||||||||||||||||||||||
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" _ | ||||||||||||||||||||||
(ByVal lpApplicationName As String, _ | ||||||||||||||||||||||
ByVal lpKeyName As String, _ | ||||||||||||||||||||||
ByVal lpString As String, _ | ||||||||||||||||||||||
ByVal lpFileName As String) As Long | ||||||||||||||||||||||
#End If | ||||||||||||||||||||||
'### ini파일에서 값을 불러옵니다. | ||||||||||||||||||||||
Sub abyulReadIni() | ||||||||||||||||||||||
Dim sApp As String, sKey As String, sBuffer As String, sPath As String | ||||||||||||||||||||||
sApp = "Korean": sKey = "s0003": sPath = "C:\ProgramData\abyul\Excel\info.ini" | ||||||||||||||||||||||
sBuffer = Space(255) | ||||||||||||||||||||||
Dim iResult As Integer | ||||||||||||||||||||||
iResult = GetPrivateProfileString(sApp, sKey, "", sBuffer, 255, sPath) | ||||||||||||||||||||||
If iResult = 0 Then | ||||||||||||||||||||||
MsgBox "내용이 없거나 불러오기 실패!" | ||||||||||||||||||||||
Else | ||||||||||||||||||||||
MsgBox sBuffer, vbInformation, "값을 제대로 불러왔습니다!!!!" | ||||||||||||||||||||||
End If | ||||||||||||||||||||||
End Sub | ||||||||||||||||||||||
'### ini파일에 값을 입력합니다. | ||||||||||||||||||||||
Sub abyulWriteIni() | ||||||||||||||||||||||
Dim sApp As String, sKey As String, sBuffer As String, sPath As String | ||||||||||||||||||||||
sApp = "Korean": sKey = "name": sPath = "C:\ProgramData\abyul\Excel\info.ini" | ||||||||||||||||||||||
sBuffer = "God" | ||||||||||||||||||||||
Dim iResult As Integer | ||||||||||||||||||||||
iResult = WritePrivateProfileString(sApp, sKey, sBuffer, sPath) | ||||||||||||||||||||||
If iResult = 0 Then | ||||||||||||||||||||||
MsgBox "지정 경로가 존재하지 않는 듯? 파일은 없으면 만듬" | ||||||||||||||||||||||
Else | ||||||||||||||||||||||
MsgBox "기록 성공!" | ||||||||||||||||||||||
End If | ||||||||||||||||||||||
End Sub | ||||||||||||||||||||||
위 코드에서 사용한 info.ini 파일 내용 | ||||||||||||||||||||||
메모장을 여시고 아래 내용을 입력한 다음, info.ini로 저장하시면 됩니다. | ||||||||||||||||||||||
[abyulTools] | ||||||||||||||||||||||
Name=abyul Excel Tools | ||||||||||||||||||||||
Path=C:\ProgramData\abyul\Excel | ||||||||||||||||||||||
Version=2.6 | ||||||||||||||||||||||
[Korean] | ||||||||||||||||||||||
s0001=안녕하세요? | ||||||||||||||||||||||
s0002=누구세요? | ||||||||||||||||||||||
s0003=꺼지세요.. | ||||||||||||||||||||||
name=God | ||||||||||||||||||||||
[English] | ||||||||||||||||||||||
s0001=Hi~ | ||||||||||||||||||||||
s0002=Who r u? | ||||||||||||||||||||||
s0003=Get out! | ||||||||||||||||||||||
응용해서 잘 사용해보세염.. | ||||||||||||||||||||||
응용은 여러분의 몫입니다. +_+;; | ||||||||||||||||||||||
샘플 파일 다운받기 : | VSTO_ini파일다루기_GetPrivateProfileString_20130911_3.xlsm | |||||||||||||||||||||
주의 사항.. | ||||||||||||||||||||||
WritePrivateProfileString을 쓸때.. Unicode로 생성된 파일에는 Unicode로 입력하지만, | ||||||||||||||||||||||
그렇지 않은 경우에는 ANSI로 입력합니다. | ||||||||||||||||||||||
관련링크 | http://blog.naver.com/kid_hacker/150099274691 | |||||||||||||||||||||
본 강좌는 아별닷컴의 주인장 오주원에 의해 작성되었습니다. | ||||||||||||||||||||||
본 강좌에 설명된 내용은 저작권법에 의해 보호 받고 싶고, 무단 복제, 전제, 재배포를 금합니다. | ||||||||||||||||||||||
http://www.abyul.com/ | 작성일 : 2013.09.13 11:44:30 | |||||||||||||||||||||
Fin. |