7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C#でExcelワークシート関数を自作する

Last updated at Posted at 2023-07-16

はじめに

Excel-DNAやVBAを使用せずに、C#のみで自作のワークシート関数(ユーザー定義関数、User-defined functions、UDFs)を作成する方法です。VBAマクロで作成した関数と異なり、高速で処理をすることができます。

Excel から使うマネージDLL を作る。 | supermab's blog
udfnibai.gif  

作成方法

  1. Visual Studio を起動します。

  2. 「新しいプロジェクトの作成」を押します。
    udf01.png

  3. 「C#」の「クラスライブラリ(.NET Framework)」を選択して「次へ」を押します。
    udf02.png

  4. プロジェクト名として「MyAddin」を入力し、フレームワークとして「.NET Framework4.8」を選択後「作成」を押します。ここでは「MyAddin」と設定しましたが他の名前でも構いません。

  5. コードを記載します。
    udf03.png  

    Class1.cs
    using System;
    using System.Runtime.InteropServices;
    using Microsoft.Win32;
    
    namespace MyAddin
    {
        //インターフェース
        [ComVisible(true)]
        [Guid("71E317FB-04C2-48CF-BEB4-2B4452116B7B")]//GUID(変更必要)
        [InterfaceType(ComInterfaceType.InterfaceIsDual)]
        public interface IUdfs
        {
            //公開したい関数
            double nibai(double x);
        }
    
        //クラス
        [ComVisible(true)]
        [Guid("0679B1F1-A380-4D18-A5BB-BD5B42BF7A0B")]//GUID(変更必要)
        [ProgId("MyAddin.Udfs")]
        [ClassInterface(ClassInterfaceType.None)]
        public class Udfs : IUdfs
        {
            //公開したい関数の実装
            public double nibai(double x)
            {
                return x * 2;
            }
    
            //以下おまじない
            //Regasmでの登録時に行われる処理
            [ComRegisterFunctionAttribute]
            private static void RegisterFunction(Type type)
            {
                //CLSID\{GUID}\Programmable
                //新規作成
                Registry.ClassesRoot.CreateSubKey(@"CLSID\{" + type.GUID.ToString().ToUpper() + @"}\Programmable");
    
                //CLSID\{GUID}\InprocServer32
                //既定の値を変更:mscoree.dll→C:\Windows\system32\mscoree.dll
                RegistryKey key = Registry.ClassesRoot.OpenSubKey(@"CLSID\{" + type.GUID.ToString().ToUpper() + @"}\InprocServer32", true);
                key.SetValue("", System.Environment.SystemDirectory + @"\mscoree.dll", RegistryValueKind.String);
            }
    
            //Regasmでの登録解除時に行われる処理    
            [ComUnregisterFunctionAttribute]
            private static void UnregisterFunction(Type type)
            {
                //CLSID\{GUID}\Programmable
                //削除
                Registry.ClassesRoot.DeleteSubKey(@"CLSID\{" + type.GUID.ToString().ToUpper() + @"}\Programmable", false);
            }
        }
    }
    
  6. ソースコード内に2箇所ある//GUID(変更必要)のコメント部のGUIDを新規作成したものに置き換えます。2箇所には別々のGUIDを新規に設定します。

    GUIDの新規作成方法
    「ツール」から「GUIDの作成」を選択します。
    udf04.png
    形式を選択して「コピー」を押しクリップボードにコピーしたら「終了」を押します。
    udf05.png

  7. プロジェクトのプロパティを開きます。
    udf06.png

  8. 署名を新規作成します。
    udf07.png

  9. キーファイル名を入力して「OK」を押します。
    udf08.png

  10. 64bit用のExcelを対象にするので構成をx64※に変更します。「Release」を選択後、「Any CPU」をプルダウンし、「構成マネージャー」を選択します。
    ※32bit用のExcelを対象にする場合はx86
    udf09.png

  11. 「アクティブ ソリューション プラットフォーム」で「新規作成」を選択します。
    udf10.png

  12. 「x64」を選択して「OK」を押します。
    udf11.png

  13. 「閉じる」を押します。
    udf12.png

  14. ビルドします。
    udf13.png

登録して使用する

  1. 管理者権限でコマンドプロンプトを開いてRegAsmを利用して登録します。

    REM 以下は64bit版Excelの場合。32bitの場合はFramework64をFrameworkに変更する。
    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe /tlb /codebase MyAddin.dll
    

    udf14.png

  2. Excelを開いて「開発」タブ→「Excelアドイン」をクリックします。アドイン画面が出るので「オートメーション」を押します。
    udf15.png

  3. 「MyAddin.Udfs」を選択して「OK」
    udf16.png

  4. 「OK」を押します。
    udf17.png

  5. あとは関数を入力して使用します。
    udf18.png

通常の関数、例えばSUMであれば「S」を押した時点で関数候補としてSUMが出てきますが、今回の方法で作成したワークシート関数の場合は「n」を押しても「nibai」が候補として出てきませんでした。

登録を解除して使用をやめる

  1. 管理者権限でコマンドプロンプトを開いてRegAsmを利用して登録を解除します。

    REM 以下は64bit版Excelの場合。32bitの場合はFramework64をFrameworkに変更する。
    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe /tlb /u MyAddin.dll
    

    udf19.png

  2. Excelを開いて「開発」タブ→「Excelアドイン」をクリック。「Myaddin」のチェックを外そうとするとアドインが見つからないので削除するか聞いてくるので「はい」を押します。その後「OK」を押せば終了です。
    udf20.png

補足

上記はVisual Studioを立ち上げて作成しましたが、コマンドラインで作成することも可能です。

キーペアの作成。Sn.exeの場所は環境によって異なるためDeveloper Command Promptを立ち上げてwhere snで確認します。

sn -k MyAddin.snk

コンパイル&登録(管理者権限で実行)

REM ソースファイル名はMyAddin.csとする。
REM 以下は64bit版Excelの場合。32bitの場合はFramework64をFrameworkに変更する。
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /target:library /keyfile:MyAddin.snk /platform:x64 MyAddin.cs
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe /tlb /codebase MyAddin.dll

登録解除(管理者権限で実行)

REM 以下は64bit版Excelの場合。32bitの場合はFramework64をFrameworkに変更する。
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe /tlb /u MyAddin.dll

またPowerShellを利用することでGUIDを作成しクリップボードにコピーすることができます。

(New-Guid).Guid | clip

参考URL

インターフェース

COM

署名

GUID作成

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?