前提・実現したいこと
対象PCにインストールされているOffice製品(ExcelやWord)などがどのバージョンか
コードから調べる方法を調査していますが、方法が分かりません。
Office2013までは内部バージョンで判定をすることにより、2007や2013と判定することができましたが、Office2016以降2019、Office365製品では全て同じ内部バージョン(16.x)となっているようで旧来の判定方法では対応できません。
画面上では、[ファイル]タブ=>[アカウント]上にて、
インストールされている製品が何かわかります。
なんらかの方法により画面上と同じように
Office2016のExcel2016
Office2019のExcel2019
Office365のExcel といったように
判定する方法をどなたかご存じでないでしょうか?
宜しくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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周りのアプローチは以下のサイトも参考になると思います(私は、正直ろくに知識が無いので)。
投稿2018/10/30 14:34
総合スコア2166
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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/25 06:16
2018/10/25 06:29
退会済みユーザー
2018/10/25 07:27 編集
2018/10/25 08:06 編集
退会済みユーザー
2018/10/25 09:38 編集
2018/10/30 05:12
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/31 02:50