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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Office 365

Office 365は、マイクロソフトが販売している企業向けクラウドベースのグループウエアサービス。電子メールや予定表、Webサイト構築、オンラインストレージ、ビデオ会議などビジネスで必要な機能を備えています。クラウドサービスのため、自社での専用サーバーの設置の必要がないことが特徴です。

Q&A

解決済

2回答

14033閲覧

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

trons

総合スコア20

Office 365

Office 365は、マイクロソフトが販売している企業向けクラウドベースのグループウエアサービス。電子メールや予定表、Webサイト構築、オンラインストレージ、ビデオ会議などビジネスで必要な機能を備えています。クラウドサービスのため、自社での専用サーバーの設置の必要がないことが特徴です。

0グッド

1クリップ

投稿2018/10/25 05:20

前提・実現したいこと

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

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

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

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

宜しくお願い致します。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

PowerShell

1# 必要なライブラリロード 2Add-Type -AssemblyName UIAutomationClient, System.Windows.Forms, Microsoft.VisualBasic 3 4 5# Excelを新規でインスタンス 6[__ComObject]$appXl = New-Object -ComObject Excel.Application -Property @{Visible = $true} 7 8 9### [ファイル]タブ=>[アカウント] を開く ### 10 # 無理矢理SendKeysで操作。UIAutomationをちゃんと使えば無しで行けるとは思うけれど 11 # 待ち時間(Start-Sleep)は適度に調整 12 13# Excelを最前面に 14[Microsoft.VisualBasic.Interaction]::AppActivate($appXl.Caption) 15Start-Sleep -Seconds 1 16 17# 「Alt+F+D」のキーを送信して [ファイル]タブ=>[アカウント] を開く 18[Windows.Forms.SendKeys]::SendWait('%F') 19Start-Sleep -Seconds 1 20[Windows.Forms.SendKeys]::SendWait('%D') 21Start-Sleep -Seconds 1 22 23 24### UIAutomationで要素を走査して製品情報ぽいものを探す ### 25 26# UIAutomation補助関数 27function Get-UIChildren { 28 [CmdletBinding()] 29 [OutputType([Windows.Automation.AutomationElement])] 30 Param ( 31 [Parameter(Mandatory=$true,ValueFromPipeline=$true)] 32 [Windows.Automation.AutomationElement[]]$InputObject, 33 [Windows.Automation.TreeScope]$TreeScope = [Windows.Automation.TreeScope]::Children 34 ) 35 Process { 36 foreach( $ele in $InputObject ) { 37 $ele.FindAll($TreeScope, [Windows.Automation.Condition]::TrueCondition) | Write-Output 38 } 39 } 40} 41 42# Excelトップを取得 43[IntPtr]$hwndXl = $appXl.Hwnd 44$xlAutoEle = [Windows.Automation.AutomationElement]::FromHandle( $hwndXl ) 45 46# 子要素群取得 47[Windows.Automation.AutomationElement[]]$elements = 48 $xlAutoEle | 49 Get-UIChildren -TreeScope Descendants 50 51# 製品情報っぽいものを探す 52[Windows.Automation.AutomationElement+AutomationElementInformation[]]$officeInfo? = 53 $elements | 54 % { $_.Current } | 55 ? { # テキストで、'Microsoft Office'が含まれるもの 56 $_.ControlType -eq [Windows.Automation.ControlType]::Text -and 57 $_.Name -match 'Microsoft Office' 58 } # | Select-Object -Property ClassName, LocalizedControlType, ControlType, Name 59 60# 取得した要素の名前を出力 61$officeInfo? | Select-Object -ExpandProperty Name 62 63$appXl.Quit()

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

text

1Microsoft Office 365 2Microsoft Office Professional 2013

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

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

投稿2018/10/30 14:34

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

trons

2018/10/31 02:50

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

0

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

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

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

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

PowerShell

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

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

PowerShell

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

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

投稿2018/10/25 05:41

編集2018/10/25 07:32
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

trons

2018/10/25 06:11 編集

ご回答ありがとうございます。 旧来であればApplication関連を使うのがデフォルトでしたが 手持ちの環境では Office2016 Excel 16.0.10827.20118 Office2019 Excel 16.0.10337.20021(Preview版) Office365  Excel 16.0.10827.20118 となっており、バージョン情報から規則性を見出せませんでした。 (Office2019は値が異なるが・・・Previewのため製品版が同じかどうかは不明?) また、VBAバージョンも全て同じ値となっておりました。 7.1.1084でした Application.CalculationVersionの方は Office2016 162913 Office2019 179021 Office365 179021 でした。 公式の情報があればよいのですが・・・
trons

2018/10/25 06:16

PowerShellの結果も追記します。 Office365 16.0.10827.20181 Office2019 16.0.10827.20181 です。
trons

2018/10/25 06:29

インストール情報から調べてみました。、 Office365: Microsoft Office 365 ProPlus - ja-ja Office2016: Microsoft Office Professional Plus 2016 - ja-ja Office2019: Microsoft Office Professional Plus 2019 - ja-ja のように表示されるので、実際ExcelやWordがどれが入っているかは 判断できなさそうです
退会済みユーザー

退会済みユーザー

2018/10/25 07:27 編集

報告有難うございます。 インストール情報にはバージョン情報も埋め込まれているのでセットで取り出せるはずですよ。上にPowerShellの例ですが追記しておきます。 しかし複数バージョン同時にインストールされている場合、判別が難しそうですね。 あと考えられるのは自分自身の実行ファイルを特定してファイルのプロパティからバージョン情報を取得するというのはいかがでしょうか。
trons

2018/10/25 08:06 編集

ご指摘の通り、インストール情報からは複数のバージョンの場合は特定できなさそうです。 また、Excelなどの本体EXEのファイルプロパティのバージョン情報ですが、上記に記載した画面上で 表示される情報と同一でした。 こちらからも特定は困難なようです。 API等を駆使して、GUI操作をコードで再現し[Excelのバージョン情報]を開けば表示されるダイアログが「Microsoft Excel for Office 365のバージョン情報」などと表示されますのでタイトルで判定できそうですが、実際の動作を考えると現実的ではないと思います。
退会済みユーザー

退会済みユーザー

2018/10/25 09:38 編集

失礼しました。Office365とインストール版の判定も行いたいんでしたね。これ以上、出来そうな方法が思いつきません。有識者の回答をお待ち下さい・・。 その文字を表示しているXML?レジストリ?にアクセスできれば、あるいは・・・私にはお手上げですorz
trons

2018/10/30 05: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で内部バージョンは統一されている模様です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問