エクセルのサービスパックのバージョンを調べる手順をまとめてみる。
エクセル用のアプリを作っていると、バージョンが違ったり、サービスパックが当たっていなかったりすると動作が違って困ったりする。
そこで、エクセルのバージョンを調べたいとなる。エクセルの実行ファイルのプロパティを見るとファイルバージョン、製品バージョンという項目があるので、これを読めばよいのだろう。
ちなみに、製品名の「エクセル2016」とバージョン番号の「16」は、たまたま同じだが、「エクセル2013」以前の製品では同じではないので注意。下表にまとめたが、バージョン13はなぜか欠番。
*
*
あとは、エクセルの実行ファイルからファイル情報をゲットして、プロダクトバージョンからエクセルの製品名の年式とサービスパックの番号を得るメソッドをごりごり書く。
if文がたくさんあると何も考えていないような感じがしてとても嫌な気持ちになるのだが、この場合はがまんする。
あと、エクセルの実行ファイルのパスはバージョンごとに違うので、本当はレジストリを参照してゲットしないといけない。ここでは簡単にするために決め打ちで書いてある。
*
このメソッドを使って、たとえば、エクセル2010より古いものはサポートしないというときは、以下のようにチェックする。
エクセル2016なら画面のラベルに下のようなテキストが表示される。
しかし、このメソッドはエクセルのバージョンが上がるたびに改訂していく必要があって、ずっと保守していくのはつらいような、、、
エクセル用のアプリを作っていると、バージョンが違ったり、サービスパックが当たっていなかったりすると動作が違って困ったりする。
そこで、エクセルのバージョンを調べたいとなる。エクセルの実行ファイルのプロパティを見るとファイルバージョン、製品バージョンという項目があるので、これを読めばよいのだろう。
ちなみに、製品名の「エクセル2016」とバージョン番号の「16」は、たまたま同じだが、「エクセル2013」以前の製品では同じではないので注意。下表にまとめたが、バージョン13はなぜか欠番。
*
| 製品名 | サービスパック | バージョン番号 |
| Excel2007 | 12.0.4518.1014 | |
| SP1 | 12.0.6214.1000 | |
| SP2 | 12.0.6425.1000 | |
| SP3 | 12.0.6611.1000 | |
| Excel2010 | 14.0.4763.1000 | |
| SP1 | 14.0.6029.1000 | |
| SP2 | 14.0.7015.1000 | |
| Excel2013 | 15.0.4420.1017 | |
| SP1 | 15.0.4569.1506 |
*
あとは、エクセルの実行ファイルからファイル情報をゲットして、プロダクトバージョンからエクセルの製品名の年式とサービスパックの番号を得るメソッドをごりごり書く。
class mmExcelVersionInfo
{
public class mmExcelVersion
{
public string ProductName;
public string ProductVersion;
public int ExcelProductNumber; // Excel2016 なら 2016
public int ExcelServicePackNumber; // SP3なら3
}
/// <summary>
/// エクセルの製品番号とサービスパック番号を得る
/// </summary>
/// <returns></returns>
static public mmExcelVersion getVersion()
{
string p = @"C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE";
System.Diagnostics.FileVersionInfo fv = System.Diagnostics.FileVersionInfo.GetVersionInfo(p);
mmExcelVersion v = new mmExcelVersion();
v.ProductName = fv.ProductName;
v.ProductVersion = fv.ProductVersion;
int m = fv.ProductMajorPart;
int b = fv.ProductBuildPart;
switch (m)
{
case 12:
v.ExcelProductNumber = 2007;
if (b >= 6611) { v.ExcelServicePackNumber = 3; }
else if (b >= 6425) { v.ExcelServicePackNumber = 2; }
else if (b >= 6214) { v.ExcelServicePackNumber = 1; }
break;
case 14:
v.ExcelProductNumber = 2010;
if (b >= 7015) { v.ExcelServicePackNumber = 2; }
else if (b >= 6029) { v.ExcelServicePackNumber = 1; }
break;
case 15:
v.ExcelProductNumber = 2013;
if (b >= 4569) { v.ExcelServicePackNumber = 1; }
break;
case 16:
v.ExcelProductNumber = 2016;
break;
}
return v;
}
}
if文がたくさんあると何も考えていないような感じがしてとても嫌な気持ちになるのだが、この場合はがまんする。
あと、エクセルの実行ファイルのパスはバージョンごとに違うので、本当はレジストリを参照してゲットしないといけない。ここでは簡単にするために決め打ちで書いてある。
*
このメソッドを使って、たとえば、エクセル2010より古いものはサポートしないというときは、以下のようにチェックする。
try
{
mmExcelVersionInfo.mmExcelVersion v = mmExcelVersionInfo.getVersion();
if (v.ExcelProductNumber < 2010)
{
throw new ApplicationException("このバージョンのエクセルは動作保証しません。");
}
string sp = v.ExcelServicePackNumber == 0 ? "SP無" : string.Format("SP{0}", v.ExcelServicePackNumber);
this.labelVersion.Text = string.Format("{0}({1}) Excel{2} {3}", v.ProductName, v.ProductVersion, v.ExcelProductNumber, sp);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
エクセル2016なら画面のラベルに下のようなテキストが表示される。
しかし、このメソッドはエクセルのバージョンが上がるたびに改訂していく必要があって、ずっと保守していくのはつらいような、、、


コメント
コメントを投稿