.NET でインストールされている Excel の内部バージョンを確認する

Siden oppdatert :
ページ作成日 :

動作確認環境

Visual Studio
  • Visual Studio 2022
.NET
  • .NET 6.0
Windows
  • Windows 11
Excel
  • Microsoft 365

動作必須環境

Windows
  • いずれかのバージョン
Excel
  • いずれかのバージョン

内部バージョンについて

今回プログラムで Excel の内部バージョンを調べることができるのですが、2023/05/07 時点で Excel 2016 以降は内部バージョンが 16.0 から変わっていません。 そのため Excel 2016, 2019, 2021, Microsoft 265 を内部バージョンで識別することは出来なくなっています。 ですが、内部バージョンが変わっていないのでメリットとしては新しいバージョンが出ない限りは Excel のライブラリは 2016 以降共通で使用することが出来ます。

動作プログラムについて

以下のコードでインストールされている Excel の内部バージョンを調べることができます。メソッド化しているのでそのまま自身のプログラムに持っていくことも可能です。 GetInstallExcelVersion メソッドを呼べばバージョンが数値で返ってきます。

/// <summary>
/// インストールされている Excel の内部バージョンを取得します。
/// </summary>
/// <returns>インストールされている Excel の内部バージョン。正常に取得できなかった場合は 0 を返します。</returns>
static decimal GetInstallExcelVersion()
{
  // Excel.Application の Type を取得
  var type = Type.GetTypeFromProgID("Excel.Application");
  if (type == null)
  {
    // Excel がインストールされていない
    return 0;
  }

  object? application = null;
  try
  {
    // Excel.Application のインスタンスを生成します
    application = Activator.CreateInstance(type);
    if (application == null)
    {
      // Excel.Application の生成に失敗
      return 0;
    }

    // バージョンを取得
    var ver = application.GetType().InvokeMember("Version", System.Reflection.BindingFlags.GetProperty, null, application, null);
    if (ver == null)
    {
      return 0;
    }

    // 文字列を数値に変換します
    decimal version;
    if (!decimal.TryParse(ver.ToString(), out version))
    {
      return 0;
    }
    return version;
  }
  finally
  {
    // 生成した Excel のリソースを解放します
    if (application != null)
    {
      System.Runtime.InteropServices.Marshal.ReleaseComObject(application);
    }
  }
}

プログラムを簡単に解説すると、Type.GetTypeFromProgID メソッドを使用して Excel.Application プログラム ID のタイプを取得し、 Activator.CreateInstance メソッドで Excel.Application のインスタンスを生成します。 直接 Excel.Application のインスタンスを生成しないのは、直接参照することによって Excel ライブラリのバージョンに依存してしまうことを回避するためです。 この方法をとることにより、最新のバージョンを参照することができるようになります。

あとは生成された application インスタンスから Version プロパティを参照しバージョンを取得することができます。 取得されるバージョンは Excel が内部に持つバージョンです。例えば、Excel 2010 は 14.0、Excel 2013 は 15.0、Excel 2016 以降は 16.0 となります。

この処理は実際に Excel を起動しているのと変わらないので System.Runtime.InteropServices.Marshal.ReleaseComObject メソッドを呼んで Excel.Application を解放しないと Excel のプロセスが残るので注意して下さい。

ちなみにこのコードは .NET 6 で動作確認していますが、ほぼ同じ形で .NET Framework でも使用できると思います。 .NET で動作しますが Type.GetTypeFromProgID メソッドや System.Runtime.InteropServices.Marshal.ReleaseComObject メソッドは Windows 専用のコードなので他のプラットフォームでは動作しないことに注意してください。