C# 非连续范围的Excel get_范围错误

C# 非连续范围的Excel get_范围错误,c#,excel,vsto,C#,Excel,Vsto,我有下面一段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_Ran

我有下面一段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.地址时,它是:

"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 Range函数使用的字符串大小似乎有限制

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

计算现有范围的地址时也是如此

e、 g.range.Address将返回长度不超过255个字符的字符串,即使该范围包含更多值

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

Jeeped建议的解决方案只会让您走这么远,因为它将返回没有$的单元格地址,为地址定义留下更多字符,但是最终将达到字符限制

我提出的解决方案是使用Range类的Areas属性并循环这些属性来构造最终地址

由于如上所述的字符限制,此地址不能直接用于sheet.Range,因此必须将其联合在一起才能转换回可用范围

有关如何在c#中执行此操作,请参见以下方法:

公共静态字符串GetRangeAddress(范围)
{
string rangeAddress=string.Empty;
int areaCount=1;
foreach(范围区域中的范围输入区域)
{
rangeAddress+=输入区域地址[0,0];
if(面积计数<范围面积计数)
rangeAddress+=“,”;
面积计数++;
}
返回地址;
}
公共静态范围GetRangeFromAddress(Excel.Application应用程序、工作表、字符串地址)
{
范围IR=零;
字符串[]rangeAreas=address.Split(',');
foreach(rangeAreas中的字符串区域)
{
如果(IR!=null)
IR=应用接头(IR,板材范围[面积]);
其他的
IR=板材范围[面积];
}
返回红外光谱;
}

FWIW如果我缩短一些范围地址字符串(
E1:N1
,而不是
E14:N16
),则Excel本身(VBA)中的
ActiveSheet.Range(你的str.Address)也会发生同样的情况,因此明显存在长度限制…检查
r.Address(0,0)
@Jeeped:Thank
r.Address[0,0]
成功了!并显示缺失的区域。你能解释一下为什么
r.Address
隐藏地址的后面部分吗?
Len(r.Address[0,0])
@Jeeped:请把这个作为答案,这样我们就可以完成这个问答了。
    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;
    }