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

このQ&Aのポイント
  • win7とwin10の間でマクロの動作が異なる問題が発生しています。ノートパソコンでは動作するマクロがディスクトップパソコンでは動作しないという状況です。マクロはExcelのオフィス2010(32bit版)で作成されており、両方のパソコンで同じものを使用しています。
  • ディスクトップパソコンはwin10(64ビットオペレーティングシステム)で、ノートパソコンはwin7(32ビットオペレーティングシステム)です。
  • マクロの動作確認を行った結果、win7では正常に動作しましたが、win10ではエラーは発生せずに何も起こりませんでした。マクロのコードの一部を削除すると、win10でも正常に動作することが確認されました。しかし、なぜこのような違いが生じるのか、具体的な処理の解説は求められています。
回答を見る
  • ベストアンサー

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

ノートパソコンで動作するマクロがディスクトップパソコンで動作しません。 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では、だんまりになるのか、 また、どういった処理なのかを、解説お願いできますでしょうか?

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

  • ベストアンサー
  • f272
  • ベストアンサー率46% (7996/17094)
回答No.1

もし 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
質問者

お礼

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

3620313
質問者

補足

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がマクロ動作したので、本件クローズさせていただきます。

その他の回答 (1)

  • unokwave
  • ベストアンサー率58% (966/1654)
回答No.1

私のWindows10 64bitにOffice 365 64bit版の組み合わせでは最初のGetStringValueで一度も取得に成功しません。 https://qiita.com/mckee/items/30d7b37c512c558ee937 こちらのやり方ならQuietDisplayNameでNullが返ってくる以外は正常に動作します。

関連するQ&A

  • (VBA)RegDeleteKeyがエラー

    RegDeleteKeyについて教えてください ○削除するレジストリHKEY_LOCAL_MACHINE\SOFTWARE\XTSEGRSCESK\AAA ○ソース Public Const HKEY_LOCAL_MACHINE = &H80000002 Dim lRootKey As Long Dim sSubKey As String Dim lRet As Long lRootKey = HKEY_LOCAL_MACHINE sSubKey = "SOFTWARE\XTSEGRSCESK\AAA" lRet = RegDeleteKey(lRootKey, sSubKey) ○結果 RegDeleteKeyの戻り値が2 どこが悪いか教えてください お願いします

  • レジストの参照・登録するときの権限について

    VB6.0SP5 WIN2000で開発していますが レジストリの操作でどうしても解らないので質問します administratorの権限をもつユーザーからログインして レジストリのなかは全て参照したり登録したりできるのでしょうか? 現在は登録するときAPIで下記のようにしています。 Dim lngResult As Long Dim lngDisposition As Long rc = RegCreateKeyEx(HKEY_LOCAL_MACHINE, _ "SOFTWARE\Microsoft\Shared Tools\*****", _ 0&, _ vbNullString, _ REG_OPTION_NON_VOLATILE, _ KEY_CREATE_SUB_KEY, _ udtSECURITY_ATTRIBUTES, _ lngResult, _ lngDisposition) よろしくお願いします。

  • VB2003で レジストリを格納する

    レジストリを格納するために、以下のように宣言し、 Private Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Integer, ByVal lpSubKey As String, ByVal Reserved As Integer, ByVal lpClass As String, ByVal dwOptions As Integer, ByVal samDesired As Integer, ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, ByRef phkResult As Integer, ByRef lpdwDisposition As Integer) As Integer Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Integer, ByVal lpValueName As String, ByVal Reserved As Integer, ByVal dwType As Integer, ByRef lpData As String, ByVal cbData As Integer) As Integer Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Integer) As Integer 以下のようなコードで、ユーザーエージェントをmozillaからoperaへ(またはoperaからmozilla)書き換えようとしていますが、うまくいきません。 問題点1.同じuser agentの下に”(既定)”が2つできてしまう 問題点2.データが正しく(operaと)書き込まれず、文字化けしたものが書き込まれている。 C言語用のサンプルやVB6.0のサンプルは見ますが、VB2003ではどのように指定するのか、わかりませんでした。 Dim ret As Long Dim hKey As Long, lngDisposition As Long Dim udt As SECURITY_ATTRIBUTES Dim myroot_key As String, mysub_key_user_agent As String, myName As String,StrValue As String myroot_key = &H80000002 '"HKEY_LOCAL_MACHINE" を指定している mysub_key_user_agent ="Software\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\User Agent" myName = "(既定)" strValue="Opera" ret = RegCreateKeyEx(myroot_key, mysub_key_user_agent, 0&, vbNullString, _ 0, &H4 Or &H2, udt, hKey, lngDisposition) If ret = 0 Then ret = RegSetValueEx(hKey, myName, 0, 1, strValue, Len(strValue) + 1) RegCloseKey(hKey)

  • どうすればいいのでしょう?

    パソコンの動作が異常に遅いのでスキャンをしてみたところ、 key:HKEY_LOCAL_MACHINE\software\classes\moviecommanderというのが引っかかりました。それを削除して再起動してもまだ動作が遅かったのでもう一度スキャンしたらまた同じものが引っかかりました。これはどうすれば解決できるのでしょうか?

  • エクセルマクロでフォルダのコピーがしたい

    こんにちわ 色々調べてフォルダのコピーはできたのですが、色々いじっていて分からないことが出てきたので質問に来ました。 やりたいことはフォルダをコピーしたいのですが、それぞれ名前を自動で変えようと思い下記(1)を元に下記(2)を作ってみましたが、動きませんでした。 (1)いくつかのサイトを見て動いたマクロ sub test() Dim myFSO As New FileSystemObject myFSO.CopyFolder "C:\test", "C:\test2" End Sub (2)ちょっといじって動かないマクロ sub test() Dim myFSO As New FileSystemObject Dim name As String Dim name2 As String name = "C:\test" name2 = "C:\test2" myFSO.CopyFolder "name", "name2" End Sub 「パスが見つかりません」と出てきたので、読み込んでいないのだとは思うのですが、どうしたら動くかアドバイスをいただきたいです。 よろしくお願いします。

  • マクロが動作しない

    Office2003にバージョンアップすると動作しないマクロが出ました。ちゃんと動作するものもあります。 内容は変更していないので内容はあってるはずですが 念のためコピーします。 Sub 電装品() Dim Gyou As Integer Dim Gyouz As Integer Dim State As Integer Dim Statez As Integer Dim CelValue As String Dim CelValuez As String Dim CopyCelNo As String Dim CopyCelNoz As String Dim WS1 As Object Dim WS2 As Object Set WS1 = Worksheets("購入品リスト") Set WS2 = Worksheets("電装品リスト") WS2.Range("A:G").Delete Shift:=xlToLeft WS2.Range("B1") = "電 装 品 リ ス ト" With WS2.Range("B1") .Font.Bold = True .Font.Italic = True .Font.Size = 24 End With WS2.Range("D1") = "作成日:" & Date WS1.Range("C3:E3").Copy (WS2.Range("A2:C2")) State = 3 For Gyou = 1 To 2000 CopyCelNo = "A" & State CelValue = WS1.Cells(Gyou, 17).Value If CelValue = "1" Then WS1.Range(WS1.Cells(Gyou, 3), WS1.Cells(Gyou, 5)).Copy (WS2.Range (CopyCelNo)) State = State + 1 End If Next WS1.Range("G3:J3").Copy (WS2.Range("D2:G2")) Statez = 3 For Gyouz = 1 To 2000 CopyCelNoz = "D" & Statez CelValuez = WS1.Cells(Gyouz, 18).Value If CelValuez = "1" Then WS1.Range(WS1.Cells(Gyouz, 7), WS1.Cells(Gyouz, 10)).Copy (WS2.Range (CopyCelNoz)) Statez = Statez + 1 End If Next End Sub

  • アプリケーションの追加と削除のアプリケーション名変更について

    アプリケーションの追加と削除のアプリケーション名変更について HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall のDisplay nameで変更できるようですが 適用されるものとされないものがあります。 されないもののさせ方をぜひ教えてください。

  • レジストリエディタ エントリの作成の仕方

    レジストリの修正をしたいのですが、 「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\drivers.desc」キーを開き、その中に次のエントリを作成し値を設定します。 エントリ名「msacm32.drv」、種類「文字列値(REG_SZ)」、値「msacm32.drv」 「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32」キーを開き、その中に次の2つのエントリを作成し値を設定します。 エントリ名「wavemapper」、種類「文字列値(REG_SZ)」、値「msacm32.drv」 エントリ名「midimapper」、種類「文字列値(REG_SZ)」、値「midimap.dll」 と書いてある通りにしたいのですが、どなたか分かりやすく説明していただけないでしょうか

  • Ad-Awareの「CriticalObjects」は、すべて危険ですか?

    Ad-Awareでスキャンをかけると、「CriticalObjects」として次のようなものが検出されます。 一度は removed(隔離?)してみたのですが、IEの履歴と表示されたので、また戻してしまいました。 これは危険なんでしょうか? Name=Alexa Type=Regkey Category=DateMiner Object=HKEY_LOCAL_MACHINE:software/microsoft/internet explorer/extensions/{c95f...}/ Name=Alexa Type=RegValue Category=DateMiner Object=HKEY_USERS:S-15-21-122.../software/microsoft/internet explorer/extensions/cmdmapping"{c95f...} HKEY_LOCAL_MACHINE:software/microsoft/internet explorer/extensions/{c95f...}"Script" HKEY_LOCAL_MACHINE:software/microsoft/internet explorer/extensions/{c95f...}"MenuStatusBar" HKEY_LOCAL_MACHINE:software/microsoft/internet explorer/extensions/{c95f...}"Icon" HKEY_LOCAL_MACHINE:software/microsoft/internet explorer/extensions/{c95f...}"HotIcon" HKEY_LOCAL_MACHINE:software/microsoft/internet explorer/extensions/{c95f...}"clsid" HKEY_LOCAL_MACHINE:software/microsoft/internet explorer/extensions/{c95f...}"ButtonText"

  • コマンドラインパラメーターが多すぎる

    reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy" REG_DWORD /d 1 ドロー値を1にしたいのですが、コマンドラインパラメーターが多すぎると言われていしまいます。 どなたかご教示下さい。

専門家に質問してみよう