【发布时间】:2015-09-11 08:51:58
【问题描述】:
我正在研究如何正确/最佳地通过 Excel-DNA 将 Excel.Range 对象从 Excel 中的 VBA 传递到 C#,然后通过传递的引用与 Excel 对象模型进行交互。
示例代码:
'***************** VBA code ********************
Sub test2()
Dim rng As Excel.Range
Set rng = Worksheets("test_output").Range("D9")
Dim myDLL As New XLServer.MyClass
Call myDLL.test_ExcelRangePassedAsObject(rng)
Call myDLL.test_ExcelRangePassedAsRange(rng)
End Sub
//**************** C# Code **********************
using System;
using ExcelDna.Integration;
using ExcelDna.ComInterop;
using System.Runtime.InteropServices;
using Microsoft.Office.Interop;
using Excel = Microsoft.Office.Interop.Excel;
namespace XLServer
{
[ComVisible(false)]
class ExcelAddin : IExcelAddIn
{
public void AutoOpen()
{
ComServer.DllRegisterServer();
}
public void AutoClose()
{
ComServer.DllUnregisterServer();
}
}
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class MyClass
{
public void test_ExcelRangePassedAsObject(object range)
{
Excel.Range rng = (Excel.Range)range;
rng.Worksheet.Cells[1, 1].Value = "Specified range was: " + rng.Address.ToString();
}
public void test_ExcelRangePassedAsRange(Excel.Range range)
{
Excel.Range rng = range;
rng.Worksheet.Cells[2, 1].Value = "Specified range was: " + rng.Address.ToString();
}
当我运行它时,我得到了预期的输出:
A1:指定范围为:$D$9
A2:指定范围为:$D$9
在花费大量时间在 Google 上搜索 Excel-DNA 问题但一无所获后,我刚刚写了这篇文章,实际上很惊讶它没有出现任何问题。
所以我想我的问题是那些在这方面有经验的人......这是正确/最好的方法吗?
例如,我遇到过很多类似这样的帖子:
https://groups.google.com/forum/#!topic/exceldna/zqzEIos7ma0
....人们在哪里处理 ExcelReference 对象并且不得不使用非常晦涩的代码将它们转换为 Excel.Range 对象,感觉就像我缺少了什么?
【问题讨论】:
-
这就是我来 Stack Overflow 而不是 Google Groups 的原因...
-
这就是我不明白的。公平地说,这个帖子最初是在 2011 年开始的,但是 2014 年 10 月 14 日发布的问题仍然在为此苦苦挣扎,而且他来自 来自 c#,所以为什么他不能只获得 Range直接参考我不懂。也许他的插件是基于 Excel-DNA 而不是 VSTO?这甚至有意义吗?我只是在学习这个所以不知道。
-
实际上,Govert 也不知道那家伙在说什么,因为我重读了它....lol