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

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

기타 조회 수 8669 추천 수 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"

 

참 쉽죠? ^^

 

간단하게 아래와 같이 해도 된다.

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_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
번호 제목 글쓴이 날짜 조회 수sort
공지 기타 엑셀 VBA 간단한 팁 모아놓기.. +_+ [레벨:30]아별 2007-01-24 33814
64 기타 오피스2010 64bit(64비트)를 위한 API Declare 방법 _ 윈도우 도움말 file [레벨:30]아별 2017-04-21 39345
63 [펌] Visual Basic (비쥬얼 베이직) 함수 정리 imagefile [레벨:30]아별 2009-11-27 20068
62 시트에서 콤보박스 활용하기 file [레벨:30]a☆ 2005-11-12 16707
61 메시지 박스 대용으로 Shape 사용하기 file [레벨:30]아별 2009-05-07 16044
60 기타 [펌] 엑셀 VBA 총정리 _ Excel 개체 모델 참조 등 image [2] [레벨:30]아별 2010-03-09 15917
59 [VBA] 전역변수 설정하기. Public 문, Private 문 imagefile [레벨:30]아별 2008-07-01 14017
58 엑셀에서 사용하는 언어 확인하기. file [1] [레벨:30]아별 2009-06-03 13774
57 기타 [펌] VBA 공부를 시작하시는분들에게 추천하는 강의자료 imagefile [4] [레벨:30]아별 2011-03-21 13697
56 기타 [Excel VBA] 피벗테이블(PivotTable)을 VBA로 컨트롤해보자.. [레벨:30]아별 2008-12-19 12073
55 [엑셀VBA] 자동필터를 매크로로 구현하기 [레벨:30]아별 2008-08-28 11224
54 엑셀에서 달력 집어 넣기.. [1] [레벨:30]a☆ 2004-10-21 10945
53 엑셀2007에서 셀의 색상을 RGB로 뽑아내기 file [레벨:30]아별 2009-10-06 10196
52 엑셀의 유저폼 관련 [1] [레벨:30]a☆ 2004-10-21 10049
51 엑셀에서 줄바꿈에 대해서.. 줄바꿈하기 제거하기 등등.. [레벨:30]a☆ 2004-11-15 9991
50 기타 [링크] VBA로 파일을 다루는 방법에 대한 강좌들을 모아놓은 겁니다. [레벨:30]아별 2010-03-03 9830
49 기타 오피스2010 64bit(64비트)를 위한 API Declare 방법 file [2] [레벨:30]아별 2011-10-05 9215
48 [엑셀VBA] 네이버 지식인 답변 _ 엑셀 쿼리를 이용해서 펀드 기준가 데이터를 읽어오기. file [레벨:30]아별 2008-04-30 9120
» 기타 VBA _ 레지스트리 다루기 ( registry control ) imagefile [레벨:30]아별 2011-03-19 8669
46 [10/19일 수정] 엑셀 매크로 수정하기... [2] [레벨:30]a☆ 2003-09-29 8250