- ベストアンサー
win7とwin10でマクロ動作が異なる
- win7とwin10の間でマクロの動作が異なる問題が発生しています。ノートパソコンでは動作するマクロがディスクトップパソコンでは動作しないという状況です。マクロはExcelのオフィス2010(32bit版)で作成されており、両方のパソコンで同じものを使用しています。
- ディスクトップパソコンはwin10(64ビットオペレーティングシステム)で、ノートパソコンはwin7(32ビットオペレーティングシステム)です。
- マクロの動作確認を行った結果、win7では正常に動作しましたが、win10ではエラーは発生せずに何も起こりませんでした。マクロのコードの一部を削除すると、win10でも正常に動作することが確認されました。しかし、なぜこのような違いが生じるのか、具体的な処理の解説は求められています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
もし https://www.ka-net.org/blog/?p=4878 を参考にしているのであれば If (ret = 0) And (Len(Trim(display_name)) > 0) Then ret = ... のところは If ret <> 0 Then ret = ... となっていますが,どうして変更したのでしょう? win10では ret = reg.GetStringValue(HKEY_LOCAL_MACHINE, SubKeyName & key, "DisplayName", display_name) でdisplay_nameに値がちゃんと入って,ret=0の正常終了コードが帰り,その後に If (ret = 0) And (Len(Trim(display_name)) > 0) Then ret = reg.GetStringValue(HKEY_LOCAL_MACHINE, SubKeyName & key, "QuietDisplayName", display_name) でdisplay_name=""となって値が入らず,ret=1の異常終了コードが帰ってきます。そうするとIf Len(Trim(display_name)) > 0 Thenの中には入らずに,何も書かないということになってしまいます。 ret = reg.GetStringValue(HKEY_LOCAL_MACHINE, SubKeyName & key, "QuietDisplayName", display_name) は ret = reg.GetStringValue(HKEY_LOCAL_MACHINE, SubKeyName & key, "DisplayName", display_name) が異常終了したときだけ実行すればよいのでIf ret <> 0 Thenとなるはずです。
その他の回答 (1)
- unokwave
- ベストアンサー率58% (966/1654)
私のWindows10 64bitにOffice 365 64bit版の組み合わせでは最初のGetStringValueで一度も取得に成功しません。 https://qiita.com/mckee/items/30d7b37c512c558ee937 こちらのやり方ならQuietDisplayNameでNullが返ってくる以外は正常に動作します。
お礼
回答ありがとうございます。
補足
If ret <> 0 Then ret = ... となっていますが,どうして変更したのでしょう? → https://www.ka-net.org/blog/?p=4878 まで調べていただき、お手数おかけしました。 上記のwebでは Option Explicit Public Sub ListInstalledApplication() Dim reg As Object Dim keys As Variant Dim key As Variant Dim ret As Long Dim display_name As String Const HKEY_LOCAL_MACHINE = &H80000002 Const SubKeyName = "Software\Microsoft\Windows\CurrentVersion\Uninstall\" Set reg = CreateObject("WbemScripting.SWbemLocator") _ .ConnectServer(, "root\default").Get("StdRegProv") reg.EnumKey HKEY_LOCAL_MACHINE, SubKeyName, keys On Error Resume Next For Each key In keys display_name = "" ret = reg.GetStringValue(HKEY_LOCAL_MACHINE, SubKeyName & key, "DisplayName", display_name) If ret <> 0 Then ret = reg.GetStringValue(HKEY_LOCAL_MACHINE, SubKeyName & key, "QuietDisplayName", display_name) If (ret = 0) And (Len(Trim(display_name)) > 0) Then Debug.Print display_name End If Next On Error GoTo 0 End Sub となっています。 ret = reg.GetStringValue(HKEY_LOCAL_MACHINE, SubKeyName & key, "DisplayName", display_name) が異常終了したときだけ実行 というのが分からなかったです。 2つめのif文で、 Debug.Print display_name display_nameを表示する条件にret=0のAND条件となっていたので、 ret=0の時に、display_nameを表示するのだと思い、 1つめのif文を If ret <> 0 Then → If ret = 0 Then に変え、1つ目でret = 0でパスしてるので、 2つ目のif文条件に ret=0は不要と判断して削除した次第です。 なお、言われるとおり、 If ret = 0 Then → If ret <> 0 Then にすると、win10でマクロ動作しました。 win7では、If ret = 0 ThenでもIf ret <> 0 Thenでも両方共マクロ動作するというのが?ですが、 If ret <> 0 Then にてwin10がマクロ動作したので、本件クローズさせていただきます。