C# 如何使用C在MS Excel单元格中添加数字验证#

C# 如何使用C在MS Excel单元格中添加数字验证#,c#,.net,excel,validation,C#,.net,Excel,Validation,我的目标是限制用户在MS Excel单元格中仅输入1到100之间的值 我正在以编程方式生成Excel文件,但当我添加上述验证时,异常作为来自HRESULT:0x800A03EC的异常抛出 我写的代码如下: int[] arr = {1,100}; ExcelApp.get_Range(col1, col2).Cells.Validation.Add(Microsoft.Office.Interop.Excel.XlDVType.xlValidateList, Microsoft.Office.I

我的目标是限制用户在MS Excel单元格中仅输入1到100之间的值

我正在以编程方式生成Excel文件,但当我添加上述验证时,异常作为来自HRESULT:0x800A03EC的
异常抛出

我写的代码如下:

int[] arr = {1,100};
ExcelApp.get_Range(col1, col2).Cells.Validation.Add(Microsoft.Office.Interop.Excel.XlDVType.xlValidateList, Microsoft.Office.Interop.Excel.XlDVAlertStyle.xlValidAlertInformation, Microsoft.Office.Interop.Excel.XlFormatConditionOperator.xlBetween, arr, Type.Missing);
在上面的代码中,ExcelApp是Microsoft.Office.Interop.Excel.ApplicationClass的对象


非常感谢您的帮助。

我认为您无法传入.NET整数数组。您需要传入逗号分隔的字符串或对工作表范围的字符串引用。从:

xlValidateList-需要公式1;忽略公式2。公式1必须包含逗号分隔的值列表或对该列表的工作表引用

例如:

ExcelApp.get_Range(col1, col2).Cells.Validation.Add(
    XlDVType.xlValidateList, 
    XlDVAlertStyle.xlValidAlertInformation, 
    XlFormatConditionOperator.xlBetween, 
    "1,100"
);

在添加另一个单元验证程序之前,需要删除该单元验证程序。否则,您将看到验证异常作为来自HRESULT:0x800A03EC的异常抛出

ExcelApp.get_Range("A1").Cells.Validation.Delete();

ExcelApp.get_Range("A1").Cells.Validation.Add(Microsoft.Office.Interop.Excel.XlDVType.xlValidateList, Microsoft.Office.Interop.Excel.XlDVAlertStyle.xlValidAlertInformation, Microsoft.Office.Interop.Excel.XlFormatConditionOperator.xlBetween, delimitedString1To100, Type.Missing);
如果不存在单元格验证器(即第一次),则删除不会导致问题,可以安全地保留

编辑/解决方案: 代码中的问题是变量
arr
包含两个项目1和100。我猜
验证中的XLFormatConditionOperator参数
xlBetween
。Add
的参数误导了我们。要使其适用于
xlValidateList
的参数XLDVType公式1参数需要包含所有有效值1,2,3…100:

var val = new Random();
var delimitedString1To100 = string.Join(",", (int[])Enumerable.Range(1, 100).ToArray());
for (int i = 1; i < 11; i++)
{
    using (var rnCells = xlApp.Range["A" + i.ToString()].WithComCleanup())
    {
        rnCells.Resource.Value2 = val.Next(100);
        rnCells.Resource.Cells.Validation.Delete();
        rnCells.Resource.Cells.Validation.Add(
            Microsoft.Office.Interop.Excel.XlDVType.xlValidateList,
            Microsoft.Office.Interop.Excel.XlDVAlertStyle.xlValidAlertInformation,
            Microsoft.Office.Interop.Excel.XlFormatConditionOperator.xlBetween, delimitedString1To100, Type.Missing);
    }
}
var val=new Random();
var delimitedString1To100=string.Join(“,”,(int[])可枚举.Range(1100.ToArray());
对于(int i=1;i<11;i++)
{
使用(var rnCells=xlApp.Range[“A”+i.ToString()].WithComCleanup())
{
rnCells.Resource.Value2=val.Next(100);
rnCells.Resource.Cells.Validation.Delete();
rnCells.Resource.Cells.Validation.Add(
Microsoft.Office.Interop.Excel.XlDVType.xlValidateList,
Microsoft.Office.Interop.Excel.XlDVAlertStyle.xlValidAlertInformation,
Microsoft.Office.Interop.Excel.XlFormatConditionOperator.xlBetween,分隔符字符串1到100,键入。缺少);
}
}

可以使用宏来完成所需操作,宏可以在单元格值更改时指定。
要使宏无法操作以动态创建excel,请访问。有时我也实现了同样的方法,而且更简单。

检查我在问我的问题之前查看过这个问题,但该问题中给出的问题与我的不同,我认为我在将参数传递给方法验证时出错。Add();如果使用Microsoft.Office.Interop.Excel将
添加到代码文件的顶部,并直接引用枚举,则代码将更加简洁。仍然会给出与“来自HRESULT的异常:0x800A03EC”相同的异常。将“(col1,col2)”作为get_Range()的参数传递不是问题,因为这两个变量都包含单元格地址。请查看我的编辑或在此处尝试解决方案(它包含VSTO.Contrib ref)。谢谢你的赏金!我知道这很晚了,但它解决了问题吗?很抱歉在赏金被自动授予后编辑得太晚,但是这个解决方案对我和至少3个其他人都有效。愿意接受吗?干杯