从UDF获取Excel单元格地址

我创build了一个Excel自动化插件,实现为包含UDF包装的ac#类库(我不使用VSTO)U​​DF如下所示:

string foo(string data){ //Do some work on the data passed string result; return(result); } 

有没有办法让我隐式地获取input公式的单元格的地址,而不会传递任何附加参数? 一种方法是将一个事件侦听器挂接到工作簿,一旦加载项加载,并捕获事件作为单元格的值更改; 但我正在寻找一个替代scheme。

谢谢,

你可以尝试Globals.ThisAddIn.Application.Caller,它返回一个包含单元格的Excel.Range。 也许这样的东西得到Excel.Application

 public class InteropHelper { public static void GetReferences(ref Microsoft.Office.Interop.Excel.Application _Application, ref Microsoft.Office.Interop.Excel.Workbook _Workbook) { EnumChildCallback cb; // First, get Excel's main window handle. int hwnd = (int)Process.GetCurrentProcess().MainWindowHandle; // We need to enumerate the child windows to find one that // supports accessibility. To do this, instantiate the // delegate and wrap the callback method in it, then call // EnumChildWindows, passing the delegate as the 2nd arg. if (hwnd != 0) { int hwndChild = 0; cb = new EnumChildCallback(EnumChildProc); EnumChildWindows(hwnd, cb, ref hwndChild); // If we found an accessible child window, call // AccessibleObjectFromWindow, passing the constant // OBJID_NATIVEOM (defined in winuser.h) and // IID_IDispatch - we want an IDispatch pointer // into the native object model. if (hwndChild != 0) { const uint OBJID_NATIVEOM = 0xFFFFFFF0; Guid IID_IDispatch = new Guid( "{00020400-0000-0000-C000-000000000046}"); Microsoft.Office.Interop.Excel.Window ptr = null; int hr = AccessibleObjectFromWindow( hwndChild, OBJID_NATIVEOM, IID_IDispatch.ToByteArray(), ref ptr); if (hr >= 0) { // If we successfully got a native OM // IDispatch pointer, we can QI this for // an Excel Application (using the implicit // cast operator supplied in the PIA). _Application = ptr.Application; _Workbook = _Application.ActiveWorkbook; } } } } [DllImport("Oleacc.dll")] public static extern int AccessibleObjectFromWindow( int hwnd, uint dwObjectID, byte[] riid, ref Microsoft.Office.Interop.Excel.Window ptr); public delegate bool EnumChildCallback(int hwnd, ref int lParam); [DllImport("User32.dll")] public static extern bool EnumChildWindows( int hWndParent, EnumChildCallback lpEnumFunc, ref int lParam); [DllImport("User32.dll")] public static extern int GetClassName( int hWnd, StringBuilder lpClassName, int nMaxCount); public static bool EnumChildProc(int hwndChild, ref int lParam) { StringBuilder buf = new StringBuilder(128); GetClassName(hwndChild, buf, 128); if (buf.ToString() == "EXCEL7") { lParam = hwndChild; return false; } return true; } } 

感谢brijesh指引我在正确的方向。 我使用以下来获取单元格地址:

 using Excel = Microsoft.Office.Interop.Excel; using System.Reflection; Excel.Application excelApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application"); Excel.Range target = (Excel.Range)excelApp.get_Caller(System.Type.Missing); string cellAddress = target.get_Address(Missing.Value, Missing.Value, Excel.XlReferenceStyle.xlA1, Missing.Value, Missing.Value);