2016-09-13 12 views
1

인터넷에서 검색 한 결과이 문제에 대한 해결책을 찾는 데 문제가 있습니다.Windows 셸을 사용하여 VBA 내에서 레지스트리 키 읽기

기본적으로 VBA 내에서 Shell.Application을 사용하여 관리자 권한으로 레지스트리 쿼리를 실행하여 TypeGuessRows의 값을 읽으려고합니다. 결국은 Excel을 사용하여 ADOdb를 사용하여 데이터를 올바르게 쿼리 할 수 ​​있도록 0으로 수정합니다. 나는 다음과 같은 서브 루틴 올라와있다 : 모든 것은이 루틴에서 반환

Sub Read_Registry_Value() 

'Declare variables 
Dim reg_key_location As String 
Dim reg_key_name As String 
Dim wsh As Object 

'Define registry key path and name 
reg_key_location = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\ClickToRun\REGISTRY\MACHINE\Software\Wow6432Node\Microsoft\Office\15.0\Access Connectivity Engine\Engines\Excel" 
reg_key_name = "TypeGuessRows" 

'Create instance of windows shell 
Set wsh = VBA.CreateObject("Shell.Application") 

'Execute registry query with administrative privileges 
wsh.ShellExecute "cmd", _ 
     "/K REG QUERY " & Chr(34) & reg_key_location & Chr(34) & " /v " & reg_key_name, _ 
     "", _ 
     "runas", _ 
     1 
End Sub 

은 다음과 같습니다

ERROR :

The system was unable to find the specified registry key or value.

레지스트리 키가 가장 확실히 존재하지만

. 아래 스크린 샷을 참조하십시오. 또한 위의 코드에 따라 관리자 권한으로 명령 프롬프트를 실행해야합니다.

레지스트리 키 스크린 샷 : enter image description here

는 또한

REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\ClickToRun\REGISTRY\MACHINE\Software\Wow6432Node\Microsoft\Office\15.0\Access Connectivity Engine\Engines\Excel" /v TypeGuessRows 

직접 명령 프롬프트가 모든 관리자 권한없이 작동 ... 명령을 실행. CMD에서

REG 수동으로 편집 : 그래서 제대로 작동이 기능이 문제에 어떤 도움을 얻는 방법에 잃었어요 enter image description here

이 많이 주시면 감사하겠습니다!

****의 UPDATE ****

좋아, 그래서 난이 첫 번째 대답에 Dinotom에 의해 제안 코드를 구현했습니다. 아래 코드를 참고하십시오. 다음과 같은 오류가 들어 X = 0 ... 줄에 반환 그러나

Sub Read_Registry() 

Dim entryArray() As Variant 
Dim valueArray() As Variant 
Dim reg_key_location As String 
Dim x As Integer 

reg_key_location = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\ClickToRun\REGISTRY\MACHINE\Software\Wow6432Node\Microsoft\Office\15.0\Access Connectivity Engine\Engines\Excel" 
Call EnumerateRegEntries(reg_key_location, entryArray, valueArray) 

For x = 0 To UBound(entryArray) 
    'Do something here 
Next x 

End Sub 

Public Sub EnumerateRegEntries(keyPath As String, arrEntryNames As Variant, arrValueTypes As Variant) 

Dim registryObject As Object 
Dim rootDirectory As String 

rootDirectory = "." 
Set registryObject = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ 
rootDirectory & "\root\default:StdRegProv") 

registryObject.EnumValues HKEY_LOCAL_MACHINE, keyPath, arrEntryNames, arrValueTypes 

End Sub 

...

ERROR :

Run-time error '9' Subscript out of range.

그것은 배열은 인구가되고있는 것처럼 보이지 않는다 아래 제안 된 레지스트리 데이터로 더 이상 아이디어가 없습니까?

+0

그 Sub는 모든 reg 키 테스트에 대해 나를 위해 작동하므로 잘못된 키 경로가 있거나 해당 레지스트리 키에 대한 허가 문제가 있습니다. – dinotom

+0

테스트 한 핵심 경로에 대해이 하위 항목이 작동하지 않습니다. 나는 시도했다 ... HKEY_LOCAL_MACHINE \ SOFTWARE; HKEY_LOCAL_MACHINE \ HARDWARE; HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Office \ Common의 몇 가지 예입니다 (HKLM 접두어를 생략 한 동일한 키 이외에). 그래서 확실히 파일 경로 문제가 아닙니다. 어쩌면 허가하는거야? ... 어떤 OS를 실행하고 있습니까? Windows 10을 사용하고 있습니다. 문제의 다른 아이디어도 있습니다. – Josh

답변

3

쉘을 사용해야합니까?

이렇게하면 레지스트리 항목이 열거되고 필요에 따라 조작됩니다. 매개 변수로 전달할 빈 배열을 설정하고 keypath는 열거 할 레지스트리의 로컬 파일 경로입니다. 하위 배열을 채 웁니다.

Dim entryArray() As Variant, valueArray() As Variant 
Call EnumerateRegEntries("pathtokey",entryArray, valueArray) 

아래의 하위 항목이 실행되고 entryArray 및 valueArray가 채워집니다. 은 그럼 당신은

For x = 0 to UBound(yourarrayhere) 
    'Do something here 
Next x 

열거 방법 배열을 반복 할 수 있습니다

Public Sub EnumerateRegEntries(keyPath As String, arrEntryNames As Variant, arrValueTypes As Variant) 

    Dim registryObject As Object 
    Dim rootDirectory As String 

    rootDirectory = "." 
    Set registryObject = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ 
    rootDirectory & "\root\default:StdRegProv") 

    registryObject.EnumValues HKEY_LOCAL_MACHINE, keyPath, arrEntryNames, arrValueTypes 

End Sub 

당신이있는 경우에 다음, 여기에 Chip Pearsons registry page

을 찾거나,이 서브를 변경하거나 사용할 수없는 경우 쉘을 사용하기위한 몇 가지 요구 사항, 관리자로 실행하는 방법을 보려면 여기를 클릭하십시오. run shell as admin

+0

굉장 해답 덕분에 dinotom! 껍질을 사용하지 않아도됩니다. 그것은 내가 VBA에서 레지스트리를 읽을 시간을 생각해 낼 수있는 유일한 옵션이었습니다. 빈 variant 배열을이 함수에 전달하려면 어떻게해야합니까? 그런 다음이 배열의 결과를 출력 하시겠습니까? 예제를 제공해 주시겠습니까? 도와 주셔서 다시 한 번 감사드립니다! – Josh

+0

좋아, 내가 위의 제안대로 VBA에 코드를 입력했습니다. 하지만 x = 0 Ubound (entryArray) 코드 부분에 도달하면 "Run Time Error 9, Range of Outrange"라는 아이디어가 반환됩니다. – Josh

+0

For x = ... 행에 중단 점을 넣고 코드를 실행하면 배열에있는 내용은 무엇입니까? 당신은 질문을 실행하고있는 모든 코드를 게시해야한다. 왜냐하면 내가 올바르게 구현했다는 것을 알지 못하기 때문이다. – dinotom