エクセルのサービスパックのバージョンを調べる

エクセルのサービスパックのバージョンを調べる手順をまとめてみる。



エクセル用のアプリを作っていると、バージョンが違ったり、サービスパックが当たっていなかったりすると動作が違って困ったりする。

そこで、エクセルのバージョンを調べたいとなる。エクセルの実行ファイルのプロパティを見るとファイルバージョン、製品バージョンという項目があるので、これを読めばよいのだろう。


ちなみに、製品名の「エクセル2016」とバージョン番号の「16」は、たまたま同じだが、「エクセル2013」以前の製品では同じではないので注意。下表にまとめたが、バージョン13はなぜか欠番。




製品名サービスパックバージョン番号
Excel200712.0.4518.1014
SP112.0.6214.1000
SP212.0.6425.1000
SP312.0.6611.1000
Excel201014.0.4763.1000
SP114.0.6029.1000
SP214.0.7015.1000
Excel201315.0.4420.1017
SP115.0.4569.1506



あとは、エクセルの実行ファイルからファイル情報をゲットして、プロダクトバージョンからエクセルの製品名の年式とサービスパックの番号を得るメソッドをごりごり書く。


  1.     class mmExcelVersionInfo
  2.     {
  3.         public class mmExcelVersion
  4.         {
  5.             public string ProductName;
  6.             public string ProductVersion;
  7.             public int ExcelProductNumber;      // Excel2016 なら 2016
  8.             public int ExcelServicePackNumber;  // SP3なら3
  9.         }
  10.  
  11.         /// <summary>
  12.         /// エクセルの製品番号とサービスパック番号を得る
  13.         /// </summary>
  14.         /// <returns></returns>
  15.         static public mmExcelVersion getVersion()
  16.         {
  17.             string p = @"C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE";
  18.  
  19.             System.Diagnostics.FileVersionInfo fv = System.Diagnostics.FileVersionInfo.GetVersionInfo(p);
  20.  
  21.             mmExcelVersion v = new mmExcelVersion();
  22.             v.ProductName = fv.ProductName;
  23.             v.ProductVersion = fv.ProductVersion;
  24.  
  25.             int m = fv.ProductMajorPart;
  26.             int b = fv.ProductBuildPart;
  27.  
  28.             switch (m)
  29.             {
  30.                 case 12:
  31.                     v.ExcelProductNumber = 2007;
  32.                     if (b >= 6611) { v.ExcelServicePackNumber = 3; }
  33.                     else if (b >= 6425) { v.ExcelServicePackNumber = 2; }
  34.                     else if (b >= 6214) { v.ExcelServicePackNumber = 1; }
  35.                     break;
  36.                 case 14:
  37.                     v.ExcelProductNumber = 2010;
  38.                     if (b >= 7015) { v.ExcelServicePackNumber = 2; }
  39.                     else if (b >= 6029) { v.ExcelServicePackNumber = 1; }
  40.                     break;
  41.                 case 15:
  42.                     v.ExcelProductNumber = 2013;
  43.                     if (b >= 4569) { v.ExcelServicePackNumber = 1; }
  44.                     break;
  45.                 case 16:
  46.                     v.ExcelProductNumber = 2016;
  47.                     break;
  48.             }
  49.  
  50.             return v;
  51.         }
  52.     }

if文がたくさんあると何も考えていないような感じがしてとても嫌な気持ちになるのだが、この場合はがまんする。

あと、エクセルの実行ファイルのパスはバージョンごとに違うので、本当はレジストリを参照してゲットしないといけない。ここでは簡単にするために決め打ちで書いてある。



このメソッドを使って、たとえば、エクセル2010より古いものはサポートしないというときは、以下のようにチェックする。

  1. try
  2. {
  3.   mmExcelVersionInfo.mmExcelVersion v = mmExcelVersionInfo.getVersion();
  4.  
  5.     if (v.ExcelProductNumber < 2010)
  6.     {
  7.       throw new ApplicationException("このバージョンのエクセルは動作保証しません。");
  8.     }
  9.     string sp = v.ExcelServicePackNumber == 0 ? "SP無" : string.Format("SP{0}", v.ExcelServicePackNumber);
  10.                
  11.     this.labelVersion.Text = string.Format("{0}({1})  Excel{2} {3}", v.ProductName, v.ProductVersion, v.ExcelProductNumber, sp);
  12.  }
  13.  catch (Exception ex)
  14.  {
  15.   MessageBox.Show(ex.Message);
  16.  }

エクセル2016なら画面のラベルに下のようなテキストが表示される。


しかし、このメソッドはエクセルのバージョンが上がるたびに改訂していく必要があって、ずっと保守していくのはつらいような、、、

コメント

このブログの人気の投稿

varchar をデータ型 numeric に変換中に、算術オーバーフロー エラーが発生しました。