寻找一种从另一个插件访问全局变量的方法

时间:2019-07-01 15:02:01

标签: c# .net excel user-defined-functions excel-interop

所以,我正在研究一个使用RibbonBar和一些外部DLL的Excel加载项(普通VSTO项目)。 因为需要在Excel中导入一些用户定义的函数(UDF),所以我读到您只能通过用COM注册它来实现,而我只能通过函数的接口来实现。 我进行了注册,如https://theofficecontext.com/2013/06/08/update-creating-excel-udfs-in-c/所示 注册工作正常,可以在Excel中调用导入的函数。 我使用了一些对话框来让用户设置一些用于UDF的变量,然后发现这两件事是在单独的AddIn对象中进行管理的。

那就是问题所在。因为它们是两个不同的对象,所以我在对话框中输入的所有内容都无法由UDF访问。

当通过与工作环境交互加载UDF时,从Excel内部调用OnConnection()。


namespace myExcelAddin
{
    public partial class ThisAddIn
    { 
        public static int iUser = 0;
        // .. some other static variables

        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
          // some startup work 
        }
     }
}

namespace myExcelAddin
{
  [ComVisible(true)]
  public interface IFunctions
  {
       // ... some functions
  }

    [ComVisible(true)]
    [GuidAttribute("1D3001F4-5307-49A6-98F2-B3B76B3D0AA3"),
    ProgId("myExcelAddin.Functions"),
    ClassInterface(ClassInterfaceType.None),
    ComDefaultInterface(typeof(IFunctions))]

  public partial class Connect : Object, Extensibility.IDTExtensibility2,      IFunctions
  {
       // ... implementation of interface functions
  }

public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom)
 {
       // get a reference to the instance of the add-in
       Application = application as Excel.Application;
       thisAddIn = addInInst;
  }

  [ComRegisterFunctionAttribute]
  public static void RegisterFunction(Type type)
  {
      //... registration work
  }

  [ComUnregisterFunctionAttribute]
  public static void UnregisterFunction(Type type)
  {
     // ... unregistration work
  }
}

那么是否有可能获得用户输入的内容? 因为两者的Globals处理方式也不同...

1 个答案:

答案 0 :(得分:0)

这似乎是一个复杂的问题,但是我几乎没有想到:

1)注册表-如果数据量很小,则为HKEY_CURRENT_USER

2)将其放入文件并从其他AddIn读取文件

3)这看起来最可行-使用Excel传输数据-即创建隐藏的工作表,然后将数据放入其中-但是如果您不想修改现有工作簿,则可能会很困难