1. 아별툴
  2. 아별툴 패밀리
  3. 엑셀 질문하기
  4. 엑셀 강좌
  5. 엑셀 팁
  6. 엑셀 자료실
  7. 엑셀 연구과제
  8. 엑셀 북마크
  9. 관련 프로그램 소개

VBA _ 레지스트리 다루기 ( registry control )

기타 조회 수 4872 추천 수 0 2011.03.19 19:56:48

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"

 

참 쉽죠? ^^

 

SaveSetting으로 저장된 Registry값은 아래의 경로에 저장이 됩니다.

HKEY_CURRENT_USER\Software\VB and VBA Program Settings

 

abyul_VBA_Registry_20110119-2.jpg

 

 

 

아래의 코드들을 참고하세요.. ㅎㅎ

아래 코드들은 첨부파일에서도 확인할 수 있습니다.

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을 이용하여 레지스트리 컨트롤하기


abyul.com_0000368.jpg


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&section=kin&rank=1&search_sort=0&spq=0&pid=gXUV0F5Y7Z8ssvC3U%2Bwssc--368630&sid=TuXs0s3D5U4AADk3XOo


'다음 함수는 레지스터리에 있는 값을 읽는 함수입니다.
'------------------------------------------------
'- Key : 레지스터리 루트 경로.
'- Path : 레지스터리 서브 경로
'- ValueName : 레지스터리의 키값
'------------------------------------------------

Private Function GetRegistry(Key, Path, ByVal ValueName As String)
    Dim hKey As Long
    Dim lValueType As Long
    Dim sResult As String
    Dim lResultLen As Long
    Dim ResultLen As Long
    Dim x, TheKey As Long

    TheKey = -99            'TheKey의 초기값을 -99로 넣음(레지스터리 핸들)
    '레지스트리 루트 경로의 문자열을 보고 핸들 구하기..
    '---------------------------------------------
    Select Case UCase(Key)
        Case "HKEY_CLASSES_ROOT": TheKey = &H80000000
        Case "HKEY_CURRENT_USER": TheKey = &H80000001
        Case "HKEY_LOCAL_MACHINE": TheKey = &H80000002
        Case "HKEY_USERS": TheKey = &H80000003
        Case "HKEY_CURRENT_CONFIG": TheKey = &H80000004
        Case "HKEY_DYN_DATA": TheKey = &H80000005
    End Select
    '---------------------------------------------
  
    '해당 핸들을 구하지 못했으면 "Not Found" 문자열을 리턴합니다.
    '---------------------------------------------
    If TheKey = -99 Then
        GetRegistry = "Not Found"
        Exit Function
    End If
    '---------------------------------------------

    '레지스터리 경로를 오픈합니다.
    '만약 오픈하는데 실패했으면 해당 경로를 만듭니다.
    '이때 해당 경로의 핸들값이 hKey에 저장됩니다.
    If RegOpenKeyA(TheKey, Path, hKey) <> 0 Then x = RegCreateKeyA(TheKey, Path, hKey)
  
    sResult = Space(100)
    lResultLen = 100
  
    '해당 hKey 핸들에 하위의 valueName에 해당하는 키에 들어 있는 값을 읽습니다.
    '이때 sResult에는 값이..lResultLen에는 문자열의 길이가 들어갑니다.
    x = RegQueryValueExA(hKey, ValueName, 0, lValueType, sResult, lResultLen)
      
    'x가 0이면 레지스터리 읽음 성공..
    '그렇지 않으면 읽음 실패..
    Select Case x
        Case 0: GetRegistry = Left(sResult, lResultLen - 1)
        Case Else: GetRegistry = "Not Found"
    End Select
  
    '열려진 핸들을 닫습니다.
    RegCloseKey hKey
End Function

'다음 함수는 레지스터리에 값을 저장하는 함수입니다.
'------------------------------------------------
'- Key : 레지스터리 루트 경로.
'- Path : 레지스터리 서브 경로
'- entry : 레지스터리의 키값
'- Value : 레지스터리에 저장할 문자열
'------------------------------------------------
Private Function WriteRegistry(ByVal Key As String, ByVal Path As String, ByVal entry As String, ByVal value As String)
  
    Dim hKey As Long
    Dim lValueType As Long
    Dim sResult As String
    Dim lResultLen As Long
  
    TheKey = -99            'TheKey의 초기값을 -99로 넣음(레지스터리 핸들)
    '레지스트리 루트 경로의 문자열을 보고 핸들 구하기..
    '---------------------------------------------
    Select Case UCase(Key)
        Case "HKEY_CLASSES_ROOT": TheKey = &H80000000
        Case "HKEY_CURRENT_USER": TheKey = &H80000001
        Case "HKEY_LOCAL_MACHINE": TheKey = &H80000002
        Case "HKEY_USERS": TheKey = &H80000003
        Case "HKEY_CURRENT_CONFIG": TheKey = &H80000004
        Case "HKEY_DYN_DATA": TheKey = &H80000005
    End Select
    '---------------------------------------------
  
    '해당 핸들을 구하지 못했으면 "Not Found" 문자열을 리턴합니다.
    '---------------------------------------------
    If TheKey = -99 Then
        WriteRegistry = False
        Exit Function
    End If
    '---------------------------------------------

    '레지스터리 경로를 오픈합니다.
    '만약 오픈하는데 실패했으면 해당 경로를 만듭니다.
    '이때 해당 경로의 핸들값이 hKey에 저장됩니다.
    '---------------------------------------------

    If RegOpenKeyA(TheKey, Path, hKey) <> 0 Then
        x = RegCreateKeyA(TheKey, Path, hKey)
    End If
    '---------------------------------------------

    '해당 경로의 레지스터리 하위에 해당 entry에 해당 값을 저장합니다.
    '---------------------------------------------
    x = RegSetValueExA(hKey, entry, 0, 1, value, Len(value) + 1)
    '---------------------------------------------
    'x가 0이면 저장 성공 그렇지 않으면 실패입니다.
    If x = 0 Then WriteRegistry = True Else WriteRegistry = False
End Function


===================================================================================

레지스트리를 .reg파일로 저장하기..

'# Reference1. http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040103&docId=73106932&qb=dmJhIHJlZ2lzdHJ5&enc=utf8&section=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()
    strCommand = "regedit /e c:\aaa.reg ""HKEY_CURRENT_USER\Software\VB and VBA Program Settings\aaa"""
    Set objWshShell = CreateObject("WScript.Shell")
    intRC = objWshShell.Run(strCommand, 0, True)
    If intRC <> 0 Then
       MsgBox "error"
    End If
End Sub

-----------------------------

위의 예는 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]
"test1"="sdfsd"
"test2"=dword:00000000

-----------------------------------

필요한 Reg의 내용을 직접 읽어서 Text파일을 생성을 하셔도 Reg파일이 문제없이 만들어질 듯 합니다.

 

도움 되시길 바라며 즐거운 하루 되세요.


===================================================================================








 

문서 첨부 제한 : 0Byte/ 2.00MB
파일 제한 크기 : 2.00MB (허용 확장자 : *.*)
List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 기타 엑셀 VBA 간단한 팁 모아놓기.. +_+ [레벨:30]아별 2007-01-24 25485
64 기타 오피스2010 64bit(64비트)를 위한 API Declare 방법 _ 윈도우 도움말 file [레벨:30]아별 2017-04-21 389
63 기타 [VBA] 컴퓨터 이름 알아내기 등 PC 환경 변수 읽오이기.. Environ [레벨:30]아별 2015-04-08 1311
62 기타 [VBA] 엑셀 파일을 PDF로 저장(EXPORT) 시키기 [1] [레벨:30]아별 2015-01-21 3385
61 기타 [펌] 추가 기능 개발시 리본메뉴에 넣을 MSO Image 쉽게 확인하기 imagefile [레벨:30]아별 2015-01-09 850
60 기타 엑셀 2013에서 웹 브라우저 컨트롤(ActiveX, web browser)을 시트에 삽입할 수 없는 문제.. imagefile [레벨:30]아별 2014-01-19 2016
59 기타 [ VBA Tip ] 엑셀 VBA로 사진(JPG)의 EXIF 정보(GPS 포함) 불러 들이기.. imagefile [6] [레벨:30]아별 2012-02-27 4874
58 기타 VBA로 인디언식 이름 만들어주는 사용자 정의 함수 만들기.. imagefile [1] [레벨:30]아별 2012-01-11 3056
57 기타 오피스2010 64bit(64비트)를 위한 API Declare 방법 file [2] [레벨:30]아별 2011-10-05 5467
56 기타 [펌] VBA 공부를 시작하시는분들에게 추천하는 강의자료 imagefile [4] [레벨:30]아별 2011-03-21 10915
» 기타 VBA _ 레지스트리 다루기 ( registry control ) imagefile [레벨:30]아별 2011-03-19 4872
54 기타 엑셀에서 소리 내기(재생) _ sound play file [1] [레벨:30]아별 2010-12-13 4561
53 기타 헷갈리기 쉬운 워크시트 함수와 VBA함수 비교표 imagefile [레벨:30]아별 2010-10-05 4335
52 기타 기본 제공 대화 상자 실행하면 초기 값 설정 imagefile [레벨:30]아별 2010-08-25 3745
51 기타 [펌] 엑셀 VBA 총정리 _ Excel 개체 모델 참조 등 image [2] [레벨:30]아별 2010-03-09 10686
50 기타 [링크] VBA로 파일을 다루는 방법에 대한 강좌들을 모아놓은 겁니다. [레벨:30]아별 2010-03-03 7190
49 현재 엑셀 파일의 색상표(Color Chart) 확인용 코드 [레벨:30]아별 2009-12-24 5254
48 [펌] Visual Basic (비쥬얼 베이직) 함수 정리 imagefile [레벨:30]아별 2009-11-27 15266
47 엑셀 사용자 정의 수식(UDF)에 도움말 넣는 방법. [레벨:30]아별 2009-11-11 3943
46 Excel에서 메뉴 및 메뉴 모음을 사용자 지정하는 방법 image [레벨:30]아별 2009-11-04 5148
45 기타 엑셀 기본 제공 대화 상자 인수 목록 file [레벨:30]아별 2009-11-04 5815