9

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

我正在以编程方式生成 Excel 文件,但是当我添加上述验证时,异常被抛出为Exception from 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

非常感谢任何帮助。

4

3 回答 3

7

在添加另一个之前,您需要删除单元格验证器。否则,您将看到验证异常被抛出为 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参数xlBetweenValidation.Add的参数误导了我们。要使其适用于 Formula1 参数的参数XLDVType需要包含所有有效值 1、2、3...100:xlValidateList

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);
    }
}
于 2012-12-28T00:46:25.823 回答
3

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

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

例如:

ExcelApp.get_Range(col1, col2).Cells.Validation.Add(
    XlDVType.xlValidateList, 
    XlDVAlertStyle.xlValidAlertInformation, 
    XlFormatConditionOperator.xlBetween, 
    "1,100"
);
于 2012-12-17T09:29:17.300 回答
0

您可以使用宏来完成您想要的操作,该宏可以在单元格值更改时分配。对于 incopating 宏来动态创建 excel,请访问http://www.eggheadcafe.com/articles/create_macro_at_runtime_in_dotnet.asp。我以前有时也实现过,而且也更容易。

于 2012-12-28T10:30:05.347 回答