如何处理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 Dim L As New List(Of String) Do If counter>10 Then Exit Do If ue.MoveNext Then Dim c As Range = ue.Current Dim V As String = c.FormulaLocal If String.IsNullOrWhiteSpace(V.Trim) Then counter = counter + 1 Continue Do End If L.Add(V) Else Exit Do End If Loop 

ExcelReference获取所有的值ExcelReference ,而不是获取COM Range对象。

从参数中删除AllowReference=true (然后您将直接获取值)或从ExcelReference获取值:

 object value = inputRef.GetValue(); if (value is object[,]) { object[,] valueArr = (object[,])value; int rows = valueArr.GetLength(0); int cols = valueArr.GetLength(1); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { object val = valueArr[i,j]; // Do more here... } } } 

如果一个单元格是空的,你得到的对象将是ExcelEmptytypes。 你可以忽略这些,你对空单元不感兴趣。

另一种方法是使用C API获取表单的使用范围,并与ExcelReference相交。 一个缺点是,这需要您的函数被标记为IsMacroType=true ,这与AllowReference=true一起具有使您的函数变得不稳定的副作用。

显示如何执行此操作的代码位于: https : //gist.github.com/govert/e66c5462901405dc96aab8e77abef24c