2

次のコードを使用して、Excel アドインを開発しています。クラス ライブラリを作成し、次のコードを追加しました

using System;
using System.Collections.Generic;
 using System.Linq;
 using System.Text;
  using System.Runtime.InteropServices;
  using Microsoft.Win32;

  namespace MyCustomAutomation
  {

// Replace the Guid below with your own guid that

// you generate using Create GUID from the Tools menu

[Guid("5268ABE2-9B09-439d-BE97-2EA60E103EF6")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class MyFunctions
{
    public MyFunctions()
    {

    }

    public double MultiplyNTimes(double number1, double number2, double timesToMultiply)
    {
        double result = number1;
        for (double i = 0; i < timesToMultiply; i++)
        {
            result = result * number2;
        }

        return result;


    }


    [ComRegisterFunctionAttribute]
    public static void RegisterFunction(Type type)
    {

        Registry.ClassesRoot.CreateSubKey(

          GetSubKeyName(type, "Programmable"));

        RegistryKey key = Registry.ClassesRoot.OpenSubKey(

          GetSubKeyName(type, "InprocServer32"), true);

        key.SetValue("",

          System.Environment.SystemDirectory + @"\mscoree.dll",

          RegistryValueKind.String);
    }

    [ComUnregisterFunctionAttribute]
    public static void UnregisterFunction(Type type)
    {

        Registry.ClassesRoot.DeleteSubKey(

          GetSubKeyName(type, "Programmable"), false);
    }

    private static string GetSubKeyName(Type type,

      string subKeyName)
    {

        System.Text.StringBuilder s =

          new System.Text.StringBuilder();

        s.Append(@"CLSID\{");

        s.Append(type.GUID.ToString().ToUpper());

        s.Append(@"}\");

        s.Append(subKeyName);

        return s.ToString();

    }
   }
  }

私はそれをインストールし、関数はExcelで正常に動作します.値を返すMultiplyNTimes関数を使用できます.しかし、私の問題は、セルから関数を呼び出すと、結果が同じセル自体に表示されるのに対し、結果が必要なことです.呼び出されたセル以外のセルで再生されます。どの方向にも到達できないため、まったくわかりません。助けてください

4

1 に答える 1

1

結果を別のセルに入れるには、単に結果を配列として返します。MultiplyNTimes 関数の別のバージョンの例として、これは次のように記述できます。

 public double[] MultiplyNTimesNextCell(double number1, double number2, double timesToMultiply)
{
       // result[0] is the value returned on the first cell
       // result[1] is the value returned on the next cell
       double[] result = new double[] {0, number1};
       for (double i = 0; i < timesToMultiply; i++)
       {
            // hardcoded to result[1] where to return the result
            result[1] = result[1] * number2;
       }

        return result;
}

そして、この関数を Excel で使用する場合は、配列数式構文を使用する必要があります。つまり、A1 に関数を入力し、セル A1 と B1 の両方を選択し、F2 を押してから Ctrl+Shift+Enter を押します。

また、数式が入力されたセルに 0 が返されるように単純に使用したことに注意してください。これを異なる型の別の値に変更したい場合は、オブジェクトの配列を結果のデータ型として使用できます。

したがって、たとえば、次のように書き換えることができます。

public object[] MultiplyNTimesObj(double number1, double number2, double timesToMultiply)
{
     object[] result = new object[] { "MultiplyNTimesObj=", number1 };
     for (double i = 0; i < timesToMultiply; i++)
     {
         result[1] = (double)result[1] * number2;
     }

     return result;
}
于 2013-02-11T13:31:48.557 に答える