1

Я получил этот код условно форматировать ячейки после того, как он был назначен, на основе значения он содержит:Почему я получаю «Invalid args» во время выполнения этого кода?

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 ячеек, а затем передаю это (значение2) методу, который должен условно форматировать ячейку.

Он компилируется, но во время выполнения он выходит из строя с сообщением «недействительные аргументы». Почему, и как я могу это исправить?

+0

Что значение 'cellVal' ?, что значение' rowIndex'? , в какой строке вы получили ошибку? – Rodolfo

ответ

2

После того как вы установка формулы для Value2, это свойство будет возвращает оценочное значение, которое является INT/двухместный в этом случае. Поэтому вам не нужно разбирать значение.

Просто измените тип параметра cellVal удвоится:

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; 
    } 
} 
+0

Ваше решение лучше, чем мое, так как оно короткое и прагматичное, что стоит упрек с моей стороны. Этот подход идеально подходит, если вы имеете дело с листами, которые вы заполнили сами, где вы знаете, что вернется (вот здесь). Но: я предпочел бы использовать подход, который не полагается на данные, находящиеся в правильном формате или типе ... (* защитное программирование *) – Shnugo

1

В этой линии вы передаете в Value2

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

Но Value2 является Range-объект в Excel и - может быть - не непосредственно полезной в C#.

Посмотрите на комментарий Д. Стэнли (Thx!), Который очистит эту точку.

Вот как-то связанный с этим вопрос: Casting Range.Value2 of Excel interop to string

Попробуйте добавить «.ToString()» после того, как Value2 и знать о возможностях „нуль“. Лучше использовать 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

+0

Нет, 'Value2' - это' object' ('Variant' в терминах VBA), а не' Range', это будет либо однострочное, либо двойное значение, либо 1 или 2-мерный массив 'string' или 'double'. –

+0

@DStanley, thx для очистки этого. моя собственная формулировка вводила в заблуждение ... Да, я знаю, что внутри C# это не объект Range. То, что я хотел сказать, это то, что, возможно, Value2 не используется напрямую. Во всяком случае, OP должен отслеживать, какие значения приходят туда (и давать более подробную информацию об ошибке) – Shnugo

+0

, тогда было бы более понятно сказать, что 'Value2' _could be_ array - OP _assuming_, это строка в методе что _might_ станет причиной проблемы. –

Смежные вопросы