2013-02-07 39 views
2

我正在开发一个使用我的以下代码的Excel插件。 我创建了一个类库,并添加以下代码使用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的函数,返回value.However我的问题是,当我打电话功能从单元格结果显示在同一个单元格本身,而我希望结果在被称为单元格以外的任何单元格中播放。我完全无能为力,因为我无法达到任何方向。 请帮忙

+0

那么你想要的结果,其细胞放在哪里? –

+0

可以说,如果公式是用A1写的我希望答案在B1或C1中。 – Rohit

+0

配置其他单元格的公式对于Excel用户来说完全违反直觉。也许你应该重新考虑你的设计。 –

回答

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; 
}