解決済み

win7とwin10でマクロ動作が異なる

  • 暇なときにでも
  • 質問No.9589223
  • 閲覧数63
  • ありがとう数1
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 89% (156/175)

ノートパソコンで動作するマクロがディスクトップパソコンで動作しません。
excelマクロはoffice2010(32bit版)で、どちらも同じ。

ディスクトップパソコン:win10(64ビットオペレーティングシステム)
ノートパソコン:wwin7(32ビットオペレーティングシステム)
です。

動作させたマクロは、webに掲載されていたものを参考にA列へ名称記載を追加したものです。

Sub get_application()

'インストールされているアプリケーション一覧を取得するVBAマクロ

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

i = 1

For Each key In keys
display_name = ""
ret = reg.GetStringValue(HKEY_LOCAL_MACHINE, SubKeyName & key, "DisplayName", display_name)

If (ret = 0) And (Len(Trim(display_name)) > 0) Then ret = reg.GetStringValue(HKEY_LOCAL_MACHINE, SubKeyName & key, "QuietDisplayName", display_name)

If Len(Trim(display_name)) > 0 Then

Debug.Print display_name

Cells(i, 1) = display_name

i = i + 1

End If
Next
On Error GoTo 0

End Sub

win7だと上記マクロで動作するのですが、win10だとエラーがでるわけでもなく、だんまり状態となります。

If (ret = 0) And (Len(Trim(display_name)) > 0) Then ret = reg.GetStringValue(HKEY_LOCAL_MACHINE, SubKeyName & key, "QuietDisplayName", display_name)
の部分を削除すると、win7,win10共に動作します。
win7では、上記削除した部分の有無でマクロの実行結果は同じです。

なので、とりあえず、マクロ動作に関しては、不要で解決できているのですが、
何故win7で動作するマクロが、win10では、だんまりになるのか、
また、どういった処理なのかを、解説お願いできますでしょうか?

質問者が選んだベストアンサー

  • 回答No.1

ベストアンサー率 44% (4161/9385)

他カテゴリのカテゴリマスター
もし
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となるはずです。
補足コメント
3620313

お礼率 89% (156/175)

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がマクロ動作したので、本件クローズさせていただきます。
投稿日時 - 2019-02-19 09:59:15
お礼コメント
3620313

お礼率 89% (156/175)

回答ありがとうございます。
投稿日時 - 2019-02-19 09:59:21

その他の回答 (全1件)

  • 回答No.1

ベストアンサー率 59% (904/1509)

他カテゴリのカテゴリマスター
私のWindows10 64bitにOffice 365 64bit版の組み合わせでは最初のGetStringValueで一度も取得に成功しません。
https://qiita.com/mckee/items/30d7b37c512c558ee937
こちらのやり方ならQuietDisplayNameでNullが返ってくる以外は正常に動作します。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集

ピックアップ

ページ先頭へ