[[20150818201948]] 『レジストリの書き換え』(nobuhiko) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『レジストリの書き換え』(nobuhiko)

お世話になります。

レジストリの

HKEY_LOCAL_MACHINE

の値の書き換えは、excel vbaでは無理なのでしょうか?

どうかよろしくお願いいたします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 私自身は GetSettingやSaveSettingの可能範囲(HKEY_CURRENT_USER)でのみ処理していますが

https://support.microsoft.com/ja-jp/kb/145679

 APIを使えば可能なんでしょうね。

 くれぐれも自己責任で。

(β) 2015/08/18(火) 20:42


ご回答ありがとうございます。

下記のサイトには、APIでも書き込めない様な事が書いてあり、

このサイトに相談させてもらいに来ました。

可能なんでしょうか?

 RegQueryValueでは、読み込めたのですが。

http://backyard.hatenablog.com/entry/20150528/1432800450

どうかよろしくお願いいたします。

(nobuhiko) 2015/08/18(火) 21:02


 私は、これをよく使います。嘘です、そんなにレジストリを触ることはないので
 ごくたまに使います。

http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/wshshell.htm

 本社サイト
https://msdn.microsoft.com/ja-jp/library/cc364417.aspx

 自己責任というのは 同じです。

(ichinose) 2015/08/18(火) 21:14


お世話になります。

今は私もこれでやっています。

ですが、問題があって、

 regwriteにて値を

"\\192.168.100.180\My_System\dat\"から

"\\192.168.100.75\My_System\dat\"に変更

こうした場合、

実際の使用データは、"\\192.168.100.75\My_System\dat\"のデータになっているにも関わらず、

レジストリエディターの値は "\\192.168.100.180\My_System\dat\" と変わらずなのですが、

VBSの書き方に問題があるのでしょうか?

要するに書き換わっているのですが、目視する値が変わっていない状況です。

うーん。上手く伝わってますでしょうか?

どうかよろしくお願いいたします。

(nobuhiko) 2015/08/18(火) 21:32


 コードを見せてください

(ichinose) 2015/08/18(火) 23:24


 このあたり全く素人ですが、HKEY_CURRENT_USER の範囲で、以下を実行してみます。

 Sub TextX()
    On Error Resume Next
    DeleteSetting "MainKey1", "SubKey1", "Item1"
    On Error GoTo 0
 End Sub

 Sub Test0()
    Dim ans As Variant

    ans = GetSetting("MainKey1", "SubKey1", "Item1")
    If ans = "" Then
        MsgBox "未登録"
    Else
        MsgBox "登録済み:" & ans
    End If

 End Sub

 Sub Test1()
    SaveSetting "MainKey1", "SubKey1", "Item1", "myData1"
 End Sub

 ここで RegEdit を開きます。

 MainKey1/SubKey1/Item1 の値は myData1 になっています。

 この時点で Test0 を実行すると、あたりまえですが myData1 と表示されます。
 で、以下を実行します。

 Sub Test2()
    SaveSetting "MainKey1", "SubKey1", "Item1", "myData2"
 End Sub

 実行後、Test0 を実行すると、これも当たり前ですが、myData2 が表示されます。

 でも RegEdit画面では myData1 のままです。
 RegEditを終了させ、あらためて RegEditを動かしますと、myData2 が表示されています。

 すべっているかもしれませんが・・・

(β) 2015/08/19(水) 08:58


お世話になります。

返信が遅れ申し訳ございません。

>コードを見せてください

了解いたしました。

下記になります。

 Option Explicit

 Dim WshShell

 Set WshShell = WScript.CreateObject("WScript.Shell")

 ' ↓\\192.168.100.180\My_System\dat\ と表示されます エディタは、\\192.168.100.180\My_System\dat\ となっています

 WScript.Echo WshShell.RegRead("HKLM\Software\MySoft\MyPATH")

 WshShell.RegWrite "HKEY_LOCAL_MACHINE\Software\MySoft\MyPATH", "\\192.168.100.75\My_System\dat\", "REG_SZ"

 ' ↓\\192.168.100.75\My_System\dat\に設定しました と表示されます エディタは、\\192.168.100.180\My_System\dat\ となっています

 WScript.Echo WshShell.RegRead("HKLM\Software\MySoft\MyPATH") & "に設定しました"

 Set WshShell = Nothing

エクセルの質問でなくなってしまい申し訳ございません。

宜しくお願い致します。

(nobuhiko) 2015/08/19(水) 09:48


 実行後、エディターを終了させ、もう一度エディターを動かしても、表示はかわっていないのですか?

(β) 2015/08/19(水) 12:24


βさん、お付き合いありがとうございます。

また、返信遅くなり申し訳ございません。

>実行後、エディターを終了させ、
>もう一度エディターを動かしても、表示はかわっていないのですか?

はい、変わっていないんです。

これは、パソコンの問題なのでしょうかね。

(nobuhiko) 2015/08/19(水) 16:24


調べもせずに書いていますが、権限がないせいで、要求が捨てられているのかも知れませんね。

別案として、書き換えたい周辺の情報をファイルにエクスポート(.reg)。このファイルを書き換え。
regedit にファイル名を引数指定すると更新してくれます。試してみてください。
(???) 2015/08/19(水) 17:00


 現象を確認しました。原因はわかりません。

 とにかく、違うレジストリを見ているような不思議な現象です。

 VBAから WSHのRegreadやRegwriteを使って値の書き換え・読込を行うと
 正しく変更されている結果が表示されます(これ、実行した直後だけでなく、PCを立ち上げなおしても
 変更は、持続しています)。

 が、Regeditで参照すると、対象の値は何も変わっていません。

 これ ???さんの Regeditから regファイルを引数指定しても VBAからは、WSHを使った現象と同じです。

 Regeditからの手動操作やregファイルの実行では 想定通りの結果が得られます。

又、VBAではなく、VBSで

 Dim WshShell
 Set WshShell = WScript.CreateObject("WScript.Shell")
 ' ↓\\192.168.100.180\My_System\dat\ と表示されます エディタは、\\192.168.100.180\My_System\dat\ となっています
 WScript.Echo WshShell.RegRead("HKLM\Software\MySoft\MyPATH")
 WshShell.RegWrite "HKEY_LOCAL_MACHINE\Software\MySoft\MyPATH", "\\192.168.100.75\My_System\dat\", "REG_SZ"
 ' ↓\\192.168.100.75\My_System\dat\に設定しました と表示されます エディタは、\\192.168.100.180\My_System\dat\ となっています
 WScript.Echo WshShell.RegRead("HKLM\Software\MySoft\MyPATH") & "に設定しました"
 Set WshShell = Nothing

 nobuhikoさんが提示されたようなコードを実行すれば 正しく作動します。

 ???さんご提案のregeditを使った方法

 with wscript.createobject("wscript.shell")
   .run "regedit /s D:\F\レジストリ退避\test.reg"
 end with

 このようなコードも正常に作動します。

 VBAでは作動しません(エラーにならず、一見正常に終了しますし、その値も正しくみえるように変わっていますが、手動でRefeditを参照すると 変わっていません)。

 セキュリティを変更して試しましたが、私には VBAでは 実際にレジストリを変えることはできませんでした。

 もう少し 探ってみますが、VBSでは、変更できる という結果から 何か解決させる方法も
 念頭に置いてみてください。

(ichinose) 2015/08/21(金) 05:33


 追伸 nobuhikoさんも私と同じでしょうか?

 つまり、VBAでは変更不可でも VBSでは、可 

 現象が違うなら教えてください

 手動操作も不可なら 問題が違ってきますから・・・・。
(ichinose) 2015/08/21(金) 05:43

 随分と時間が掛かりましたが、

 6台ほど試しました。

 結果は、VBAから、

 途中VBSをRUNさせてRegReadで読み込んだものをINIファイルに書き込み
 (VBSにINIのAPIはありませんが)

 それをVBAから読み込むようにしました。

 ただ、VBSでRegWriteすると、エディータでEntryを自分で書き換えても

 変更してくれないPCもありました。そのPCはVBSでしか変更できなくなりました。

 自分が未熟なのもありますが。

 ただ、危険だなという感想を持ちました。

 返信が随分と遅くなり、大変申し訳ございませんでした。

 また、宜しくお願い致します。

 

 
(nobuhiko) 2015/10/11(日) 10:06


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.