Tag: excel dna

当xlCoerce返回一个值时,它是否再次在单元格中计算公式?

当我在Excel中用C#编写一个简单的UDF时,我遇到了一个问题 该function使用这个: var reference = XlCall.Excel(XlCall.xlfCaller); string oldValue = ((ExcelReference)reference).GetValue().ToString(); 这将导致循环引用错误( GetValue尝试通过再次调用UDF来重新评估单元格),除非我指定了IsMacroType=true ,它将该函数标记为类2(将#添加到公式中)。 我不知道如何连接到循环错误。 但我猜ExcelReference.GetValue()有时会评估单元格,有时不是? 看来2类只影响xlfCaller , 后来我检查了ExcelReference的源代码,事实certificate,它实际上是调用xlCoerce。 另外,我注意到当我在单元格上按F2时,无论单元格是什么, GetValue()返回0。 而当我按Ctrl + Alt + F9强制重新计算所有, GetValue()返回以前的计算值。 有人能再详细说一下吗? xlCoerce是如何在单元值/公式上工作的,第二类如何影响它?

从新线程处理ExcelDnaUtil.Application

我正在使用ExcelDNA来开发一个XLL。 其中,我有一个生活在一个DLL中的表单,我通过“ExcelDnaUtil.Application”作为成员,以促进表单和运行XLL的Excel实例之间的交互。 如果我使用以下命令在主线程中启动表单: form1.show() 当我closures表单然后closuresExcel时,Process Explorer显示Excel进程已妥善处置。 如果我使用新线程启动表单: Dim workerThread As Thread workerThread = New Thread(Sub() form1.showdialog()) workerThread.Start() 当我closures表单然后closuresExcel时,该进程仍保留在Process Explorer中。 我一直小心不要在任何代码行中使用两个小数点,并在closures表单时将接口成员设置为“无”。 我没有使用“ReleaseCOMObject”,因为其他文章指出这是不好的做法。 问题:如何从一个单独的线程正确地处理Excel进程?

从工作簿macros调用Excel UDF

我可以使用ExcelDNA创buildExcel用户定义函数。 是否可以从工作簿macros调用它们?

Excel Interop Range.Replace方法不起作用

我正在尝试编写一个C#方法,它将从Excel电子表格中删除所有字符集合的实例。 使用Range对象的Replace方法似乎是最有效的方法,而不是遍历每个单元格。 以下是我正在处理的内容: 范围扩展方法: public static void ReplaceChars(this Range me, String toReplace, String replacement = "") { //App is a static reference to the active Excel instance. //Alerts must be suppressed for characters that are not present in data. App.DisplayAlerts = false; for (Int32 i = 0; i < toReplace.Length; i++) { me.Replace( //I'm using […]

什么是与ExcelDna一起使用的好的.Net RefEdit控件?

我正在使用ExcelDna和C#来构build一套工具。 其中一部分将是我希望用户从工作簿中select单元格/范围的表单。 我有Application.InputBox路线工作…但它只是不看起来很酷… 我还没有读过关于Excel的RefEdit控件的许多好消息,并且经常在(颤栗)VBA或者VB.Net中看到很多过去写过的变通方法。 然而,这些似乎都不是最近…通过ExcelDna运行的表单上的RefEditfunction的最佳方法/控制(如果适用)?

在ExcelDna中获取excel计算模式

是否有一个XlCall可以返回当前的Excel计算模式? 如果它是自动的,我想运行一个asynchronous命令,否则我希望它阻止。

如何处理UDF中的全列范围?

我使用Excel DNA为Excel开发了一个插件。 我声明了一个接受范围作为input的UDF,将ExcelReference转换为Range并使用GetEnumerator的枚举器收集List所有单元格值,以便进一步处理,然后将输出写入另一个范围。 作为一个testing,我试着将整列传递给函数( A:A ),并且所有东西都冻结了,因为枚举器在最后一个值之后继续枚举空单元格。 有没有更快的方法来检测一个全列的范围,并得到所有它不是空的单元格? 现在我正在使用这个代码,但是在上述情况下它是非常慢的。 Dim ue = inputRange.GetEnumerator Dim L As New List(Of String) Do If ue.MoveNext Then Dim c As Range = ue.Current Dim V As String = c.FormulaLocal If String.IsNullOrWhiteSpace(V) Then Continue Do L.Add(V) Else Exit Do End If Loop 我将使用以下解决方法,但我想防止在根。 Dim ue = inputRange.GetEnumerator Dim counter as integer=0 […]

用Excel C-API函数“xlfGetDocument”询问“最后使用的行/列”将返回“实际使用的范围”

我正在使用.NET库,Excel-DNA,将Excel的C-API暴露给C#代码。 使用这样的xlfGetDocument函数(我特别想要ints ): int rowLast = ((int)(double)XlCall.Excel(XlCall.xlfGetDocument, 10, sheetName) > 0) ? (int)(double)XlCall.Excel(XlCall.xlfGetDocument, 10, sheetName) – 1 : 0; int colLast = ((int)(double)XlCall.Excel(XlCall.xlfGetDocument, 12, sheetName) > 0) ? (int)(double)XlCall.Excel(XlCall.xlfGetDocument, 12, sheetName) – 1 : 0; 返回给我一个rowLast和rowFirst ,超出了我的数据范围。 根据史蒂夫·道尔顿(Steve Dalton)的书“在C / C ++中使用Excel插件开发的财务应用程序”,这个函数的'10'和'12'参数应该返回最后一个USED列/行。 但这种情况并非如此。 为什么是这样? 从获取上面的表单使用范围之后,我使用Excel-DNA获取实际内容: contentReference = new ExcelReference(0, rowLast, 0, colLast); contents = (object[,])contentReference.GetValue(); […]

有没有办法控制Excel加载插件? (useLegacyV2RuntimeActivationPolicy问题)

我陷入了一个真正的混乱局面。 scheme:我有一个Excel自动化VBA加载项,调用.NET 4.0库(通过ExcelDna)。 这个4.0库调用2.0混合模式库中的一些方法。 因此必须将“BindAsLegacyV2Runtime”设置为4.0 CLR。 我把它设置在4.0库中,当excel实例化这个库时,CLR加载这个属性集合,一切正常。(请看这个链接 )。 我无法修改excel.exe.config,因为它在生产计算机中被拒绝。 我从一个batch file开始excel进程,并加载我的插件: Start Excel.exe my4.0addin.xla 问题:发现这不适用于less数用户机器,并调查了这个问题,发现Excel在加载作为参数传入的插件之前,先在机器中加载了预先安装的插件。 因此,在4.0加载项加载之前,excel因为其他加载项而加载了2.0 CLR。 因此,这个属性是不能设置的,逻辑就是抛弃。 我无法修改excel.exe.config(要添加属性到configuration)或注册我的插件,因为这两个都需要在用户计算机上的pipe理权限,并且在我的环境中是不可能的。 因此,有没有办法控制Excel的加载或任何方式使这项工作?

用ExcelDNA或NetOffice插入Excel行/列

我正在使用ExcelDNA来设置和获取单元格值。 我可以获取和设置单元格值 var ref = ExcelReference(2, 2); var val = ref.GetValue(); ref.SetValue(42); 有没有办法通过向右或向下移动条目插入整个行或列? 我想要的行为与用户右键单击列时的行为相同,并且所有条目都向右移动。 如有必要,解决scheme可以使用NetOffice。