Как в SpreadsheetGear проверить наличие ошибок в формулах или вычислениях?

Я использую SpreadsheetGear, чтобы скопировать диапазон из рабочего листа в «входной» диапазон другого рабочего листа и вручную пересчитать WorkbookSet. Есть ли способ легко проверить, есть ли какие-либо формулы или ошибки в расчетах после пересчета?

Целевая рабочая книга сложна со многими формулами, охватывающими рабочие листы, которые зависят от скопированного, поэтому был бы полезен простой глобальный способ обнаружения любых ошибок вычислений.


person Martin_W    schedule 30.12.2014    source источник


Ответы (2)


Я предполагаю, что под «ошибкой» вы подразумеваете значение ошибки формулы Excel, например #ЧИСЛО!, #ЗНАЧ, #ИМЯ? и т. д.? К сожалению, нет свойства, которое можно было бы проверить, чтобы определить, содержит ли книга одно или несколько из них после пересчета. Практически единственный способ сделать это — вручную перебрать все соответствующие ячейки в книге и проверить наличие ValueType of Error. Я понимаю, что для большой и сложной книги это может быть неосуществимо.

Несмотря на это, для такого подхода моим лучшим предложением было бы, если это возможно, ограничить эту проверку ошибок меньшим диапазоном или набором диапазонов, которые вас интересуют. Во-вторых, вы можете рассмотреть возможность использования «высокопроизводительного» API в SpreadsheetGear. Дополнительно.Ячейки для повышения производительности этой подпрограммы по сравнению с использованием традиционного IRange, который, вероятно, будет работать немного медленнее. Ниже приведен пример, демонстрирующий такой подход. Не стесняйтесь изменять по мере необходимости для ваших требований:

using SpreadsheetGear.Advanced.Cells;
...
private bool RangeContainsErrors(IRange range)
{
    // We obtain a "high performance" IValues object by casting a worksheet
    // to IValues.
    IValues values = (IValues)range.Worksheet;

    // Setup some indexes to help clarify and shorten the for loops.
    int startRow = range.Row;
    int startCol = range.Column;
    int endRow = startRow + range.RowCount;
    int endCol = startCol + range.ColumnCount;

    // Loop through rows of desired range.
    for (int row = startRow; row < endRow; row++)
    {
        // Now loop through columns of desired range.
        for (int col = startCol; col < endCol; col++)
        {
            // Get an IValue object for this cell.
            IValue val = values[row, col];

            // Check to ensure this cell even as a value and if so, check
            // for an Error value type.
            if(val != null && 
               val.Type == SpreadsheetGear.Advanced.Cells.ValueType.Error)
            {
                return true;
            }
        }
    }

    // If we made it this far there weren't any errors.
    return false;
}
person Tim Andersen    schedule 30.12.2014
comment
Да, я хотел обнаружить ошибки в формулах. Спасибо за пример кода и за подтверждение отсутствия глобального индикатора таких ошибок. - person Martin_W; 01.01.2015

У меня есть несколько советов для такой передачи.

  1. Несколько не по теме, но установите workbookSet.Calculation = SpreadsheetGear.Calculation.Manual; и запускайте вычисления вручную, когда вам нужно, с помощью workbookSet.Calculate();
  2. Ответ @ Тима Андерсена показывает, как вы получаете доступ к IValue. Оттуда вы можете прочитать свойство Text или Number, чтобы прочитать правильный тип значения.
  3. Вы можете сказать SetText или SetNumnber, если хотите установить.
  4. Если ячейка пуста, IValue будет просто нулевым!

Расширенный интерфейс отличается от обычного, я не понял, как обращаться к ячейкам по именам диапазонов. Похоже, интерфейс не позволяет этого, вы можете индексировать ячейку с помощью индексов строк-столбцов на основе 0.

person Csaba Toth    schedule 08.11.2015