【问题标题】:Excel-DNA: One-Dimensional Array limited to 65536 rowsExcel-DNA:一维数组限制为 65536 行
【发布时间】:2012-12-24 20:59:54
【问题描述】:

当尝试在 VBA 中调用以下 Excel-DNA-Method 时,我只得到一个大小为 1 的数组(在 65536 行之后,该数组似乎被调整为实际数组大小 - 65537)。当将工作表中的方法作为数组函数调用时,整个过程都有效。

[ExcelFunction(Description = "Example", Name = "Example", HelpTopic = "")]
        public static object[] example() {
            object[] ret = new object[65537];
            return ret;
        }

我正在使用 Excel 2007,工作表是 xlsm-Worksheet,当使用这样的二维数组时,一切正常。

 [ExcelFunction(Description = "Example", Name = "Example", HelpTopic = "")]
        public static object[,] example() {
            object[,] ret = new object[65537,1];
            return ret;
        }

但使用二维数组的方式与其他情况相同

[ExcelFunction(Description = "Example", Name = "Example", HelpTopic = "")]
        public static object[,] example() {
            object[,] ret = new object[1,65537];
            return ret;
        }

有人知道如何解决这个问题吗?

在 VBA 中做同样的事情效果很好

Function test()
    Dim ret As Variant
    ReDim ret(65536)
    test = ret
End Function

Sub testSub()
    Dim output
    output = Application.Run("test")
End Sub

输出的维度为 65537(索引从 0 开始),大于 65537 的数字也有效。

【问题讨论】:

  • 在第一个例子中你想用object[] 代替object[,] 吗?
  • 如果你做一个VBA函数返回这样一个一维数组,并通过Application.Run调用它,你有同样的问题吗?
  • 是的,第一个例子是一个对象[]
  • 您能将 object[65537,1] 的情况与 object[1, 65537] 进行比较吗?我认为后者应该和object[65537]一样。
  • Excel C API 没有一维数组。 Excel-DNA(使用 C API)将对象 [65537] 编组为对象 [1,65537]。剩下的就是通过制作一个返回具有正确内容的数组类型 XLOPER12 的小型 C 插件来确认这确实是 Excel C API 中的一个限制(错误?),并检查它是否存在相同的问题。至少,这将排除 Excel-DNA 的问题。

标签: c# excel vba user-defined-functions excel-dna


【解决方案1】:

鉴于您使用二维数组和翻转维度表示了不同的性能,听起来您遇到了行和/或列的限制。

此页面:http://office.microsoft.com/en-us/excel-help/excel-specifications-and-limits-HP010073849.aspx 给出了 Excel 2007 的限制。如您所见,工作表中的列数被限制为 16,384,您的值超过了该值的许多倍。另一方面,1,048,576 的行限制很容易容纳 65537 的值。

我的猜测是,当您请求具有 65537 列的对象时,构造函数会默默地处理溢出并将其解析为 1。

【讨论】:

  • 顺便提一下,当去掉 2^13 (16384) 以上的位时,65537 是 1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多