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);

セルバリデーターが存在しない場合 (つまり、初めて)、削除しても問題は発生せず、そのままにしておいても安全です。

編集/解決策:

コードの問題は、変数1 と100arrの 2 つの項目が含まれていたことです。引数Formula1XLDVTypeで機能させるには、すべての有効な値 1、2、3...100 を含める必要があります。xlBetweenValidation.AddxlValidateList

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 - Formula1が必要です。Formula2は無視されます。Formula1には、値のコンマ区切りリストまたはこのリストへのワークシート参照が含まれている必要があります。

例えば:

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

セル値の変更に割り当てることができるマクロを使用して、必要なことを行うことができます。動的に作成された Excel にマクロを組み込むには、 http: //www.eggheadcafe.com/articles/create_macro_at_runtime_in_dotnet.asp にアクセスしてください。私は時々前に同じことを実装しましたが、それも簡単です。

于 2012-12-28T10:30:05.347 に答える