Я думаю, что проблема здесь была в том, что у макроса не было разрешения на запись в реестр.
Дополнительные сведения см. на этой странице. Я мог бы просто прочитать значение ключа, используя объект WScript:
Debug.Print CreateObject("WScript.Shell").RegRead("HKLM\SYSTEM\CurrentControlSet\Services\USBSTOR\Start")
Чтобы написать (это должно работать, если у вас есть разрешения):
CreateObject("WScript.Shell").RegWrite "HKLM\SYSTEM\CurrentControlSet\Services\USBSTOR\Start", 4, "REG_DWORD"
Как я заставил его работать (поскольку мой скрипт, похоже, не имеет необходимых разрешений):
ShellExecute 0, "runas", "C:\Windows\System32\cmd.exe", "/k %windir%\System32\reg.exe ADD HKLM\SYSTEM\CurrentControlSet\Services\USBSTOR /f /v Start /t REG_DWORD /d 4", "C:\", 0
В этом последнем примере пользователю будет предложено предоставить необходимое разрешение.
PS: HKLM — это сокращение от HKEY_LOCAL_MACHINE. Все остальные имена корневых ключей имеют аналогичные сокращения, с которыми можно ознакомиться в страница, упомянутая вверху.
В качестве практического примера я опубликую свое использование этих выражений для включения/отключения запоминающего устройства USB (когда включено, когда выключено):
Sub DoUSB_Control()
If CreateObject("WScript.Shell").RegRead("HKLM\SYSTEM\CurrentControlSet\Services\USBSTOR\Start") = 3 Then
ShellExecute 0, "runas", "C:\Windows\System32\cmd.exe", "/k %windir%\System32\reg.exe ADD HKLM\SYSTEM\CurrentControlSet\Services\USBSTOR /f /v Start /t REG_DWORD /d 4", "C:\", 0
Else
ShellExecute 0, "runas", "C:\Windows\System32\cmd.exe", "/k %windir%\System32\reg.exe ADD HKLM\SYSTEM\CurrentControlSet\Services\USBSTOR /f /v Start /t REG_DWORD /d 3", "C:\", 0
End If
End Sub
person
jony
schedule
03.09.2015
.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\Start", 4, "REG_DWORD"
. Но это будет работать только в том случае, если пользователь, который запускает VBA, имеет права на изменение реестра вHKEY_LOCAL_MACHINE
. - person Axel Richter   schedule 02.09.2015