非连续范围的Excel get_Range错误

本文关键字:Range 错误 get Excel 连续 范围 | 更新日期: 2023-09-27 18:14:09

我有以下一段行为奇怪的VSTO代码:

string s = "E6:N6,E8:N12,E14:N16,E18:N20,E23:N26,E28:N31,E33:N33,E35:N35,E37:N38,E40:N41,E43:N43,E45:N45,E47:N49,E52:N52,E55:N55,E58:N62,E64:N68,E70:N70,E72:N73,E76:N78,E80:N81,E83:N83,E86:N87";
Excel.Range r = worksheet.get_Range[s];

,当我检查r.Address时,现在它是:

"E6:N6,E8:N12,E14:N16,E18:N20,E23:N26,E28:N31,E33:N33,E35:N35,E37:N38,E40:N41,E43:N43,E45:N45,E47:N49,E52:N52,E55:N55,E58:N62,E64:N68,E70:N70,E72:N73,E76:N78,E80:N81"

注意最后两个区域不见了!

get_Range可以处理的区域数量是否有限制?

非连续范围的Excel get_Range错误

是的,在Excel范围函数中可以使用的字符串的大小方面似乎是有限制的。

。sheet.Range()将接受最多255个字符的范围,超过此范围将抛出错误。

在计算已存在的Range的Address时也是如此。

。的范围内。Address将返回一个长度不超过255个字符的字符串,即使该范围包含更多的值。

当选择大量不连续的单元格时,这通常是一个问题。

je吉普建议的解决方案只能让您到目前为止,因为它将返回单元格地址而不包含$,为地址定义留下更多字符,但是字符限制最终会达到。

我想到的解决方案是使用Range类的Areas属性,并循环遍历这些属性来构造最终地址。

此地址不能与sheet一起使用。范围直接由于字符限制,所以它必须合并在一起转换回可用的范围

请参阅以下方法,了解如何在c#中完成此操作:

    public static string GetRangeAddress( Range range )
    {
        string rangeAddress = string.Empty;
        int areaCount = 1;
        foreach (Range inputArea in range.Areas)
        {
            rangeAddress += inputArea.Address[0, 0];
            if (areaCount < range.Areas.Count)
                rangeAddress += ",";
            areaCount++;
        }
        return rangeAddress;
    }
    public static Range GetRangeFromAddress(Excel.Application app, Worksheet sheet, string address)
    {
        Range IR = null;
        string[] rangeAreas = address.Split(',');
        foreach (string area in rangeAreas)
        {
            if (IR != null)
                IR = app.Union(IR, sheet.Range[area]);
            else
                IR = sheet.Range[area];
        }
        return IR;
    }