非连续范围的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范围函数中可以使用的字符串的大小方面似乎是有限制的。
。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;
}