VBA로 윈도우즈 레지스트리를 다루는 방법은
의외로 쉽습니다.
레지스트리에 값을 설정하는 방법
SaveSetting appname:="abTool", section:="nm_PrintMargin", Key:="abC_LeftMargin", setting:=0.708661417322835
레지스트리의 값을 불러오는 방법
GetSetting(appname:="abTool", section:="nm_PrintMargin", Key:="abC_LeftMargin", Default:="25")
레지스트리의 값을 삭제하는 방법
DeleteSetting "abTool", "nm_PrintMargin", "abC_LeftMargin"
참 쉽죠? ^^
간단하게 아래와 같이 해도 된다.
CreateObject("WScript.Shell").RegRead("HKEY_CURRENT_USER\Software\VB and VBA Program Settings\abyulTools\GeneralSetting\PrintMarginLeft")
? CreateObject("WScript.Shell").RegRead("HKEY_CURRENT_USER\Software\Kakao\KakaoTalk\DeviceInfo\20190520-152820-986\os_ver")
Windows 10 Pro (build 17763), 64-bit
SaveSetting으로 저장된 Registry값은 아래의 경로에 저장이 됩니다.
HKEY_CURRENT_USER\Software\VB and VBA Program Settings
아래의 코드들을 참고하세요.. ㅎㅎ
아래 코드들은 첨부파일에서도 확인할 수 있습니다.
abyul_Tutor_VBA_Registry_20110319-1.xls
'### Tip From http://www.abyul.com/zbxe/92663 | ||
'### 아별툴 개발시 사용예 ============================================== | ||
'### 레지스트리 저장 위치 : HKEY_CURRENT_USER\Software\VB and VBA Program Settings | ||
'### 세팅값 저장하는 방법1 | ||
Sub registry_SaveSetting_Type1() | ||
SaveSetting appname:="abTool", section:="nm_PrintMargin", Key:="abC_LeftMargin", setting:=0.708661417322835 | ||
SaveSetting appname:="abTool", section:="nm_PrintMargin", Key:="abC_RightMargin", setting:=0.708661417322835 | ||
SaveSetting appname:="abTool", section:="nm_PrintMargin", Key:="abC_TopMargin", setting:=0.748031496062992 | ||
SaveSetting appname:="abTool", section:="nm_PrintMargin", Key:="abC_BottomMargin", setting:=0.748031496062992 | ||
SaveSetting appname:="abTool", section:="nm_PrintMargin", Key:="abC_HeaderMargin", setting:=0.31496062992126 | ||
SaveSetting appname:="abTool", section:="nm_PrintMargin", Key:="abC_FooterMargin", setting:=0.31496062992126 | ||
SaveSetting appname:="abTool", section:="nm_PrintMargin", Key:="abC_HAlignCenter", setting:=True | ||
SaveSetting appname:="abTool", section:="nm_PrintMargin", Key:="abC_VAlignCenter", setting:=False | ||
End Sub | ||
'### 세팅값 저장하는 방법2 | ||
Sub registry_SaveSetting_Type2() | ||
SaveSetting "abTool", "nm_PrintMargin", "abC_LeftMargin", 0.708661417322835 | ||
SaveSetting "abTool", "nm_PrintMargin", "abC_RightMargin", 0.708661417322835 | ||
SaveSetting "abTool", "nm_PrintMargin", "abC_TopMargin", 0.748031496062992 | ||
SaveSetting "abTool", "nm_PrintMargin", "abC_BottomMargin", 0.748031496062992 | ||
SaveSetting "abTool", "nm_PrintMargin", "abC_HeaderMargin", 0.31496062992126 | ||
SaveSetting "abTool", "nm_PrintMargin", "abC_FooterMargin", 0.31496062992126 | ||
SaveSetting "abTool", "nm_PrintMargin", "abC_HAlignCenter", True | ||
SaveSetting "abTool", "nm_PrintMargin", "abC_VAlignCenter", False | ||
End Sub | ||
'### 세팅값 갖고 오는 방법1 | ||
Sub registry_GetSetting_Type1() | ||
Debug.Print GetSetting(appname:="abTool", section:="nm_PrintMargin", Key:="abC_LeftMargin", Default:="25") | ||
End Sub | ||
'### 세팅값 갖고 오는 방법2 | ||
Sub registry_GetSetting_Type2() | ||
Dim abC_LeftMargin As Double | ||
abC_LeftMargin = GetSetting("abTool", "nm_PrintMargin", "abC_LeftMargin", "25") | ||
If abC_LeftMargin = 25 Then | ||
MsgBox "No Setting Value", vbInformation, "Warning : Missing Setting _ abyul.com" | ||
Else | ||
Debug.Print abC_LeftMargin | ||
End If | ||
End Sub | ||
'### 세팅값 갖고 오는 방법3 | ||
Sub Registry_GetAllSetting() | ||
Dim MySettings As Variant | ||
Dim i As Integer | ||
'# 결과값은 (Key이름, 세팅값)으로 2차원 배열이다. | ||
MySettings = GetAllSettings(appname:="abTool", section:="nm_PrintMargin") | ||
For i = LBound(MySettings, 1) To UBound(MySettings, 1) | ||
Debug.Print MySettings(i, 0), MySettings(i, 1) | ||
Next i | ||
End Sub | ||
'### 세팅값 모두 삭제하기 | ||
Sub Registry_DeleteSetting() | ||
'# 특정 키 값만 삭제 | ||
DeleteSetting "abTool", "nm_PrintMargin", "abC_LeftMargin" | ||
'# 특정 섹션 값 모두 삭제 | ||
DeleteSetting "abTool", "nm_PrintMargin" | ||
'# 특정 어플리케이션 관련 값 모두 삭제 | ||
DeleteSetting "abTool" | ||
End Sub | ||
'### 세팅값 모두 삭제하기 | ||
Sub Registry_DeleteSetting_2() | ||
On Error Resume Next | ||
DeleteSetting "abTool", "nm_PrintMargin" | ||
If Err.Number <> 0 Then Debug.Print vbCr & Err.Source & vbCr & Err.Number & vbCr & Err.Description | ||
End Sub | ||
'### 레지스트리 편집과 관련된 엑셀 도움말 ============================================== | ||
Sub registryOperationSample() | ||
' 레지스터리에 몇 개의 설정을 배치합니다. | ||
SaveSetting appname:="MyApp", section:="Startup", Key:="Top", setting:=75 | ||
SaveSetting "MyApp", "Startup", "Left", 50 | ||
' 구역과 레지스트리의 모든 구역 설정을 삭제합니다. | ||
DeleteSetting "MyApp", "Startup" | ||
'------------------------------------------------------------------- | ||
' GetSetting에 의해 반환된 2차원 배열을 가지는 Variant입니다. | ||
Dim MySettings As Variant | ||
' 레지스터리에 몇 개의 설정을 배치합니다. | ||
SaveSetting "MyApp", "Startup", "Top", 75 | ||
SaveSetting "MyApp", "Startup", "Left", 50 | ||
Debug.Print GetSetting(appname:="MyApp", section:="Startup", Key:="Left", Default:="25") | ||
DeleteSetting "MyApp", "Startup" | ||
'------------------------------------------------------------------- | ||
' GetAllSettings에 의해 반환된 2차원 배열을 가지는 Variant입니다 | ||
' 카운터를 가지는 정수입니다. | ||
Dim MySettings As Variant, intSettings As Integer | ||
' 레지스터리에 몇 개의 설정을 배치합니다. | ||
SaveSetting appname:="MyApp", section:="Startup", _ | ||
Key:="Top", setting:=75 | ||
SaveSetting "MyApp", "Startup", "Left", 50 | ||
' 설정을 검색합니다. | ||
MySettings = GetAllSettings(appname:="MyApp", section:="Startup") | ||
For intSettings = LBound(MySettings, 1) To UBound(MySettings, 1) | ||
Debug.Print MySettings(intSettings, 0), MySettings(intSettings, 1) | ||
Next intSettings | ||
DeleteSetting "MyApp", "Startup" | ||
End Sub | ||
=================================================================================== WScript.Shell을 이용하여 레지스트리 컨트롤하기
Option Explicit '### 엑셀 2007의 빠른실행 도구모음의 위치를 변경하는 레지스트리 '### strRegValue가 1이면 리본메뉴 아래, 0이면 리본메뉴 위에 표시된다. '### Created by Joowon Oh at http://www.abyul.com Sub RegisetryWriteKey() Dim wsh As Object Dim strRegPath As String, strRegValue As String strRegPath = "HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Common\Toolbars\Excel\QuickAccessToolbarStyle" strRegValue = "00000000" ' strRegValue = "00000001" Set wsh = CreateObject("WScript.Shell") On Error Resume Next wsh.regwrite strRegPath, strRegValue, "REG_DWORD" If Err.Number <> 0 Then MsgBox "There are no value at " & vbNewLine & strRegPath Else MsgBox Right(strRegPath, Len(strRegPath) - InStrRev(strRegPath, "\")) & _ " is" & vbNewLine & "updated to " & strRegValue End If End Sub '### 특정 레지스트리 값 읽어 오기 Sub RegisetryReadKey() Dim wsh As Object Dim strRegPath As String, strRegValue As String strRegPath = "HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Common\Toolbars\Excel\QuickAccessToolbarStyle" Set wsh = CreateObject("WScript.Shell") On Error Resume Next strRegValue = wsh.RegRead(strRegPath) If Err.Number <> 0 Then MsgBox "There are no value at " & vbNewLine & strRegPath Else MsgBox Right(strRegPath, Len(strRegPath) - InStrRev(strRegPath, "\")) & _ " is" & vbNewLine & strRegValue End If End Sub '### 특정 레지스트리 값 삭제하기 Sub RegisetryDeleteKey() Dim wsh As Object Dim strRegPath As String, strRegValue As String strRegPath = "HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Common\Toolbars\Excel\QuickAccessToolbarStyle" Set wsh = CreateObject("WScript.Shell") On Error Resume Next wsh.regdelete (strRegPath) If Err.Number <> 0 Then MsgBox "There are no value at " & vbNewLine & strRegPath Else MsgBox Right(strRegPath, Len(strRegPath) - InStrRev(strRegPath, "\")) & _ " is" & vbNewLine & "deleted" End If End Sub =================================================================================== 임의의 레지스트리 장소에서 값 읽어오기..1 '# Reference1. http://xls.co.kr/212 '# Reference2. http://vba-corner.livejournal.com/3054.html Sub ReadRegisetrKey() Dim wsh As Object Dim RegStr As String Dim RegVal As String
RegStr = "HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Excel\Options\OPEN" Set wsh = CreateObject("WScript.Shell")
RegVal = "not found!!!!" On Error Resume Next RegVal = wsh.RegRead(RegStr) '### wsh.RegWrite '### wsh.RegDelete On Error GoTo 0
If RegVal = "not found!!!!" Then MsgBox "key wasn't found" Else MsgBox RegVal End If
End Sub =================================================================================== 임의의 레지스트리 장소에서 값 읽어오기..2 '# Reference1. http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040103&docId=71567548&qb=dmJhIHJlZ2lzdHJ5&enc=utf8§ion=kin&rank=1&search_sort=0&spq=0&pid=gXUV0F5Y7Z8ssvC3U%2Bwssc--368630&sid=TuXs0s3D5U4AADk3XOo '다음 함수는 레지스터리에 있는 값을 읽는 함수입니다. TheKey = -99 'TheKey의 초기값을 -99로 넣음(레지스터리 핸들) '레지스터리 경로를 오픈합니다. '다음 함수는 레지스터리에 값을 저장하는 함수입니다. '레지스터리 경로를 오픈합니다. '해당 경로의 레지스터리 하위에 해당 entry에 해당 값을 저장합니다. =================================================================================== 레지스트리를 .reg파일로 저장하기.. '# Reference1. http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040103&docId=73106932&qb=dmJhIHJlZ2lzdHJ5&enc=utf8§ion=kin&rank=2&search_sort=0&spq=0 '### registry를 백업하는 방법 Private Sub testRegistryBackUp() Dim strFilePath As String: strFilePath = ThisWorkbook.Path & Application.PathSeparator & "abyulToolSetting.reg" Dim strRegPath As String: strRegPath = "HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Excel\Options" strCommand = "regedit /e """ & strFilePath & """ """ & strRegPath & """" Set wsh = CreateObject("WScript.Shell") RetVal = wsh.Run(strCommand, 0, True) If RetVal <> 0 Then MsgBox "error code : " & err.Number & vbCr & err.Description End Sub 다음 예제를 참조하세요. ----------------------------- Private Sub Command1_Click() ----------------------------- 위의 예는 VB and VBA Program Settings \ aaa 아래에 있는 모든 레지스트리의 내용을 c:\aaa.reg에 저장하는 예제입니다.
레지스터리를 내보내기를 해서 파일 구조를 열어보면.. 다음과 같은 구조를 가지는 Text 파일입니다. ----------------------------------- Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\VB and VBA Program Settings\aaa] ----------------------------------- 필요한 Reg의 내용을 직접 읽어서 Text파일을 생성을 하셔도 Reg파일이 문제없이 만들어질 듯 합니다.
도움 되시길 바라며 즐거운 하루 되세요. =================================================================================== |