質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.97%

インストールされているOffice製品をコードで判定する方法

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 3,779

trons

score 17

 前提・実現したいこと

対象PCにインストールされているOffice製品(ExcelやWord)などがどのバージョンか
コードから調べる方法を調査していますが、方法が分かりません。

Office2013までは内部バージョンで判定をすることにより、2007や2013と判定することができましたが、Office2016以降2019、Office365製品では全て同じ内部バージョン(16.x)となっているようで旧来の判定方法では対応できません。

画面上では、[ファイル]タブ=>[アカウント]上にて、
インストールされている製品が何かわかります。

なんらかの方法により画面上と同じように
Office2016のExcel2016
Office2019のExcel2019
Office365のExcel といったように
判定する方法をどなたかご存じでないでしょうか?

宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

ろくに動作確認出来ていませんが一例として。

UIAutomationとかを使って表示されている文字からそれっぽいものを抜き出すコードです。
Windows PowerShell ISEとかに貼り付けて実行してみてください。

# 必要なライブラリロード
Add-Type -AssemblyName UIAutomationClient, System.Windows.Forms, Microsoft.VisualBasic


# Excelを新規でインスタンス
[__ComObject]$appXl = New-Object -ComObject Excel.Application -Property @{Visible = $true}


### [ファイル]タブ=>[アカウント] を開く ###
    # 無理矢理SendKeysで操作。UIAutomationをちゃんと使えば無しで行けるとは思うけれど
    # 待ち時間(Start-Sleep)は適度に調整

# Excelを最前面に
[Microsoft.VisualBasic.Interaction]::AppActivate($appXl.Caption)
Start-Sleep -Seconds 1

# 「Alt+F+D」のキーを送信して [ファイル]タブ=>[アカウント] を開く
[Windows.Forms.SendKeys]::SendWait('%F')
Start-Sleep -Seconds 1
[Windows.Forms.SendKeys]::SendWait('%D')
Start-Sleep -Seconds 1


### UIAutomationで要素を走査して製品情報ぽいものを探す ###

# UIAutomation補助関数
function Get-UIChildren {
    [CmdletBinding()]
    [OutputType([Windows.Automation.AutomationElement])]
    Param (
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [Windows.Automation.AutomationElement[]]$InputObject,
        [Windows.Automation.TreeScope]$TreeScope = [Windows.Automation.TreeScope]::Children
    )
    Process {
        foreach( $ele in $InputObject ) {
            $ele.FindAll($TreeScope, [Windows.Automation.Condition]::TrueCondition) | Write-Output
        }
    }
}

# Excelトップを取得
[IntPtr]$hwndXl = $appXl.Hwnd
$xlAutoEle = [Windows.Automation.AutomationElement]::FromHandle( $hwndXl )

# 子要素群取得
[Windows.Automation.AutomationElement[]]$elements = 
    $xlAutoEle | 
    Get-UIChildren -TreeScope Descendants

# 製品情報っぽいものを探す
[Windows.Automation.AutomationElement+AutomationElementInformation[]]$officeInfo? = 
    $elements |
        % { $_.Current } |
        ? { # テキストで、'Microsoft Office'が含まれるもの
            $_.ControlType -eq [Windows.Automation.ControlType]::Text -and 
            $_.Name -match 'Microsoft Office'
        } # | Select-Object -Property ClassName, LocalizedControlType, ControlType, Name 

# 取得した要素の名前を出力
$officeInfo? | Select-Object -ExpandProperty Name

$appXl.Quit()

Office2016(Office 365)やOffice2013の環境では以下の文字列がコンソールに出力されました。

Microsoft Office 365
Microsoft Office Professional 2013

UIAutomation周りのアプローチは以下のサイトも参考になると思います(私は、正直ろくに知識が無いので)。

Officeアプリケーションのバージョン情報ダイアログから情報を取得するVBScript | 初心者備忘録

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/31 11:50

    imihito様 ご回答ありがとうございます。
    低維持いただいたコードを実行したところ、製品情報が取得できることを
    確認させていただきました。
    UIAutomationは使ったことが無いので、調べてみたいと思います。

    ありがとうございました。

    キャンセル

0

使ったことは無いのですが、Application配下のプロパティだとこの辺が使えるかも?

Application.Build ビルド番号 マイナーバージョン?(表示上のバージョンとは一致しないが・・・)

Application.CalculationVersion 計算エンジンのバージョン?

(インストールされているOfficeが一つに絞れるのであれば)インストール情報を取得して、そこからバージョンを特定することは可能かもしれません。
PowerShell/インストール済アプリケーション一覧を取得する

Get-ChildItem -Path(
'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall',
'HKCU:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall') | 
% { Get-ItemProperty $_.PsPath | Select-Object DisplayName, DisplayVersion, Publisher }

参考になるか分かりませんが、以下のコマンドでバージョン情報が取得できるみたいでした。
こちらのOffice 2016の場合:16.0.9226.2126が出ました。

(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration" -ErrorAction SilentlyContinue).VersionToReport 

実行中のプロセス情報からEXCEL.EXEのパスを特定して、実行ファイルのプロパティ情報からバージョンを取得することなら可能かもしれません。(ソース無し)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/25 16:56 編集

    ご指摘の通り、インストール情報からは複数のバージョンの場合は特定できなさそうです。
    また、Excelなどの本体EXEのファイルプロパティのバージョン情報ですが、上記に記載した画面上で
    表示される情報と同一でした。
    こちらからも特定は困難なようです。

    API等を駆使して、GUI操作をコードで再現し[Excelのバージョン情報]を開けば表示されるダイアログが「Microsoft Excel for Office 365のバージョン情報」などと表示されますのでタイトルで判定できそうですが、実際の動作を考えると現実的ではないと思います。

    キャンセル

  • 2018/10/25 18:37 編集

    失礼しました。Office365とインストール版の判定も行いたいんでしたね。これ以上、出来そうな方法が思いつきません。有識者の回答をお待ち下さい・・。

    その文字を表示しているXML?レジストリ?にアクセスできれば、あるいは・・・私にはお手上げですorz

    キャンセル

  • 2018/10/30 14:12

    Office2019の製品版が手に入りましたのでバージョン情報を追記します。
    Office2016 Excel 16.0.11001.20070 1810(ビルド11001.20074)
    Office2019 Excel 16.0.11001.20070 1810(ビルド11001.20074)
    Office365  Excel 16.0.11001.20064  1810(ビルド11001.20074)
    (10/30日現在)
    やはりバージョン16.xで内部バージョンは統一されている模様です。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる