C# 非连续范围的Excel get_范围错误
我有下面一段VSTO代码,它的行为很奇怪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
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:Thankr.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;
}