none
32bit版VBAから64bitPowershellの起動が出来ない RRS feed

  • 質問

  •  64bit版Windows10でOffice365の32bit版を使用しています。Excel vba から 64bit版PowerShellを指定して起動すると、32bit版のPowerShellが起動されるため、以下のエラーが表示されます。回避方法を教えて頂きたい。

    尚、VBAからバッチファイル経由で同PowerShellを起動すれば正常に処理されます。

                           - 記 -
    <エラーログの内容>
    **********************
    Windows   PowerShell トランスクリプト開始
    開始時刻:   20200120172651
    ユーザー名:   IIYAMA-1\seki
    RunAs   ユーザー: IIYAMA-1\seki
    構成名:
    コンピューター:   IIYAMA-1 (Microsoft Windows NT 10.0.17763.0)
    ホスト   アプリケーション: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoLogo   -ExecutionPolicy RemoteSigned -Command ./Excelデータ更新_D.ps1
    プロセス   ID: 10412
    PSVersion:   5.1.17763.771
    PSEdition:   Desktop
    PSCompatibleVersions:   1.0, 2.0, 3.0, 4.0, 5.0, 5.1.17763.771
    BuildVersion:   10.0.17763.771
    CLRVersion:   4.0.30319.42000
    WSManStackVersion:   3.0
    PSRemotingProtocolVersion:   2.3
    SerializationVersion:   1.1.0.1
    **********************
    トランスクリプトが開始されました。出力ファイル:   C:\作業LOG\データ更新_D.txt
    Name                             Value
    ----                             -----
    PROCESSOR_ARCHITECTURE           x86
    プロバイダーが見つかりません。正しくインストールされていない可能性があります。
    発生場所   C:\会計補助バッチ処理\Excelデータ更新_D.ps1:41 文字:1
    +   $cnn.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$db")

    +   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    VBAでの指定内容>
    '   WshShellを扱うオブジェクト宣言
    Private   objWshShell As Object
    Sub   ボタン1_Click()
          Dim cmdStr          As   String                   ' コマンド
          Dim strResult       As   String                   ' PowerShell実行結果
          Dim PwsPath         As   String                   ' PowerShell実行パス
       
          ' バッチ起動パス設定
          ' PwsPath = "C:\会計補助バッチ処理\"
          ' コマンド設定
          cmdStr = "./Excelデータ更新_D.ps1"
       
          ' PowerShellの実行(Execコマンド使用バージョン)
          strResult = RunPowerShell(cmdStr)
          ' 名前参照セルに、結果を設定する
          Range("res_cell").Value = strResult
    End   Sub
    '   **************************************************
    '   PowerShellの実行(Runコマンド使用バージョン)
    '   **************************************************
    Private   Function RunPowerShell(cmdStr As String) As String
          ' WshShellを扱うオブジェクト(PowerShellの実行用)を取得する
          Set objWshShell = CreateObject("WScript.Shell")
          ' PowerShwll起動パス設定
          objWshShell.CurrentDirectory = "C:\会計補助バッチ処理\"
          ' PowerShellの実行コマンドレット構文を実行して結果を得る
          RunPowerShell = GetPowerShellResult(cmdStr)
          ' 後処理(オブジェクトの解放)
          If Not (objWshShell Is Nothing) Then
              Set objWshShell = Nothing
          End If
    End   Function
    '   **************************************************
    '   PowerShellを実行し結果を取得する
    '   **************************************************
    Function   GetPowerShellResult(cmdStr) As String
       
          Dim result As String
       
          ' Rnuコマンド、非表示(0)で実行して完了を待つ
          '    -NoLogo                            見出しを出さない
          '  -ExecutionPolicy RemoteSigned    実行権限を設定
          '    -Command                           コマンド引数(これ以降にPowerShellのコマンドレット構文を記載)
          Call   objWshShell.Run("C:\Windows\Sysnative\WindowsPowerShell\v1.0\powershell.exe   " & _
                               "-NoLogo -ExecutionPolicy RemoteSigned -Command " & cmdStr, 1)
         
        ' 出力結果を返す

          GetPowerShellResult = "正常終了"

                          - 以上 -

    2020年1月23日 1:08

すべての返信

  • ホスト アプリケーション: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoLogo -ExecutionPolicy RemoteSigned -Command ./Excelデータ更新_D.ps1

    を見る限り、PowerShellは64bit版が動作しているように見えます(32bit版が動いているならSystem32ではなくSysWOW64を指すはず)。

    ACEプロバイダは基本的に64bit版か32bit版かいずれか片方しかインストールできないはずで、特にAccessがインストールされているのであればその64bit/32bitに従うことになるはずなので、むしろPowerShellは32bit版を動かす必要があるのではないでしょうか?

    2020年1月23日 2:02
  • > Excel vba から 64bit版PowerShellを指定して起動すると、32bit版のPowerShellが起動されるため、

    Win7ですが、64bit版のPowerShell が起動しますよ。

    Sysnativeなので当たり前と言えば当たり前・・・

    > 尚、VBAからバッチファイル経由で同PowerShellを起動すれば正常に処理されます。

    逆に、バッチファイルの方では、32bit版のPowerShellが起動しているとか?

    2020年1月23日 6:45
  • 質問者さんはどこかに去ってしまったようですが・・・

    表題の、

    > 32bit版VBAから64bitPowershellの起動が出来ない

    は思い違いで、実は PowerShell は 64-bit で動いているのではなかろうかと思います。

    タスクマネージャーで起動されている PowerShell が 32/64-bit どちらか調べることはできないでしょうか? それが分かればはっきりすると思うのですが。



    現状の構成は、

    VBA ⇔ PowerShell ⇔ ADO.NET ⇔ ACE ⇔ Excel ファイル

    のようになっていて、

    > 64bit版Windows10でOffice365の32bit版

    ということから ACE は 32-bit 版と想像してますが、とすると ADO.NET は 32-bit で動いてないとダメで、それを使う PowerShell も 32-bit で動いてないとダメということになるはずです。

    エラーメッセージの、

    > プロバイダーが見つかりません。正しくインストールされていない可能性があります。

    というのは ADO.NET ⇔ ACE の 32/64-bit 不一致の時に出る FAQ 的な話なのでそう思いました。
    2020年1月24日 0:49
  • ご指摘ありがとうございます。

    ログ中の

    Name                             Value
    ----                             -----

    PROCESSOR_ARCHITECTURE           x86

    この部分は実行させるpowershellの先頭に実行パージョンを表示させる目的で追加

    した以下のコマンドの出力結果です。

    #TEST
    Start-Transcript C:\作業LOG\データ更新_D.txt
    echo [%PROCESSOR_ARCHITECTURE%] environment

    このことから、64bitで起動はしているが、powsrshellの実行段階では32bitになって

    しまっているように見えるのですが、どうでしょうか?

    ちなみに、VBAからバッチファイルで起動させた場合ここが、AMD64と表示されていました。

    2020年1月24日 0:57
  • タスクマネージャーを使って PowerShell が 32/64-bit どちらで動いているか調べるという案を提案しましたが、それができない事情があるのですか?

    > このことから、64bitで起動はしているが、powsrshellの実行段階では32bitになってしまっているように見えるのですが、どうでしょうか?

    VBA とか PowerShell は自分は知識がないので分かりませんが、とにかく、

    > プロバイダーが見つかりません。正しくインストールされていない可能性があります。

    というエラーが出るのは ADO.NET ⇔ ACE の 32/64-bit 不一致が原因であるのは間違いないと思います。(たぶん、他の回答者の皆さんも同じ意見と思います)

    なので、上の回答に書きました通り、PowerShell/ADO.NET は 64-bit で動いていて、ACE は 32-bit 版になっていると思います。それ以外に原因は想像できません。

    その想像が合っているのか間違っているのか、質問者さんの実環境で調べてください。

    2020年1月24日 1:37
  • ありがとうございます。

    確認したところ、ログと同じでバッチで起動した場合は64ビット、powershellで起動した場合は32ビット

    と表示されました。

    現在の環境ではMicrosoft.ACE.OLEDB.12.0を認識させる際、64bit版powershellには登録できましたが、

    32bit版ではエラーとなり登録できませんでした。そのため64bit版powershellでなければエラーとなって

    います。

    2020年1月24日 7:03
  • Office 2010のVBAで簡単に確認しましたが、Start-Transcriptの「ホスト アプリケーション」は、Runメソッドに渡した文字列がそのまま表示されるようです。

    Start-TranscriptとPROCESSOR_ARCHITECTUREを出すだけのps1ファイルを作り、

    VBAでSystem32, SysWOW64, SysNative でそれぞれRunで上記ps1を呼び出して、結果を確認してみてください。

    2020年1月24日 7:22
  • > 確認したところ、ログと同じでバッチで起動した場合は64ビット、powershellで起動した場合は32ビットと表示されました。

    何を確認したのでしょう?

    「ログと同じでバッチで起動」と「powershellで起動」との違いが分からないのですが、最初の質問にあった、

    > Excel vba から 64bit版PowerShellを指定して起動すると、

    は結局どちらなのでしょう?

    > 現在の環境ではMicrosoft.ACE.OLEDB.12.0を認識させる際、64bit版powershellには登録できましたが、32bit版ではエラーとなり登録できませんでした。

    それも分かりません。何をどこにどのように登録したのですか?

    ACE のことなら、

    > Office365の32bit版を使用

    というところで、「登録」とかはしなくても 32-bit 版がインストールされていると思うのですが?
    2020年1月24日 8:56