为什么我使用此代码在运行时得到 "Invalid args"?

Why do I get "Invalid args" at runtime with this code?

我有这段代码可以根据单元格包含的值在单元格被分配后有条件地格式化单元格:

var avgWeeklyDeliveriesCell = (Excel.Range)_xlSheet.Cells[curDelPerfRow,
     AVG_WEEKLY_DELIVERIES_COLUMN];
avgWeeklyDeliveriesCell.Value2 = string.Format("=ROUND(AVERAGE(C{0}:I{0}), 
     2)", curDelPerfRow);
avgWeeklyDeliveriesCell.NumberFormat = "#,##0.00";    
ConditionallyHighlight(avgWeeklyDeliveriesCell.Value2,
   _xlSheet.UsedRange.Row);

private void ConditionallyHighlight(string cellVal, int rowIndex)
{
    int COL_K_INDEX = 11;
    float avgWeeklyDelivery = float.Parse(cellVal, 
        CultureInfo.InvariantCulture);
    if (avgWeeklyDelivery > delsPerWeek)
    {
        Excel.Range cellToHighlight = (Excel.Range)_xlSheet.Cells[rowIndex
            COL_K_INDEX];
        cellToHighlight.Interior.Color = OUT_OF_BOUNDS_HIGHLIGHT_COLOR;
    }
}

问题出在cellVal上;它似乎是一个字符串,因为我将 String.Format() 调用的结果分配给单元格的 Value2 属性,然后将该 (value2) 传递给有条件格式化的方法单元格。

它可以编译,但在运行时会失败并显示 "invalid args" 消息。为什么,我该如何解决?

在这一行中,您将传递一个 Value2

ConditionallyHighlight(avgWeeklyDeliveriesCell.Value2, _xlSheet.UsedRange.Row);

但是 Value2 在 Excel 中是一个范围对象,并且 - 可能 - 在 C# 中不能直接使用。

看看清除了这一点的 D Stanley 的评论(谢谢!)。

这是一个有点相关的问题:

尝试在 Value2 之后添加一个“.ToString()”并注意 "null" 的可能性。最好使用 float.TryParse()

string YourString = "ImpossibleValue";
float f;
if (!float.TryParse(YourString, out f)) {
    //React on the failed parsing (default value, error... 
}
//go ahead with f, which holds the correct (or defaulted) value

这里有一些背景:https://msdn.microsoft.com/en-us/library/office/ff193553.aspx

将公式设置为 Value2 后,此 属性 将 returns 评估值,在本例中为 int/double。所以你不需要解析这个值。

只需将参数 cellVal 类型更改为 double:

private void ConditionallyHighlight(double cellVal, int rowIndex)
{
    int COL_K_INDEX = 11;
    if (cellVal > delsPerWeek)
    {
        Excel.Range cellToHighlight = (Excel.Range)_xlSheet.Cells[rowIndex,
            COL_K_INDEX];
        cellToHighlight.Interior.Color = OUT_OF_BOUNDS_HIGHLIGHT_COLOR;
    }
}