Jak sprawdzić, czy komórka ma błąd we wzorze W C#

W formule Excel możesz użyć =ISERR(A1) lub =ISERROR(A1)

W makrze VBA możesz użyć IsError(sheet.Cells(1, 1))

Ale używając projektu VSTO Excel Addin nie znalazłem podobnej funkcji pod Microsoft.Biuro.Interop.Excel API. Chcę tylko wiedzieć, czy w komórce jest błąd, nie interesuje mnie typ błędu.

Moje obecne obejście polega na tym, aby zrobić to dla wszystkich istniejących komunikatów o błędach.:

if (((Range)sheet.Cells[1, 1]).Text == "#N/A" || ...)
Czy jest na to lepszy sposób? Czy istnieje prosta funkcja w API do tego?
Author: Pascal, 2010-03-11

2 answers

Możesz użyć metody WorksheetFunction:

Globals.ThisAddIn.Application.WorksheetFunction.IsErr(...)

Lub

[Your Excel Object].WorksheetFunction.IsErr(...)

IsErr jest semantycznie identyczny z funkcją arkusza Excel, tylko zamiast przejścia odniesienia komórki w rzeczywistej wartości - AFAIK.

 12
Author: code4life,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-28 14:10:13

Radzenie sobie z wartościami CVErr w. NET jest bardzo trudnym tematem. Problem polega na tym, że.NET (słusznie) uważa CVErr za przestarzały w odniesieniu do obsługi błędów. Wartości CVErr są jednak nadal używane w komórkach programu Excel, więc jest to raczej duże pominięcie w przypadku automatyzacji programu Excel.

Na szczęście istnieje obejście. Sposobem sprawdzenia wartości CVErr jest sprawdzenie typu danych przechowywanego przez komórkę. Jeżeli posiadana wartość jest wpisana jako liczba całkowita (Int32), to posiadaną wartością jest CVErr. (Zauważ, że wartości liczbowe przechowywane w komórce są zwykle typowane jako podwójne, tylko wartości CVerr mogą być przekazywane jako liczba całkowita.)

To jest, na najprostszym poziomie, aby przetestować wartość CVErr, wystarczy użyć następującej funkcji:

bool IsXLCVErr(object obj)
{
    return obj is Int32;
}

Jeśli chcesz sprawdzić konkretną wartość CVErr (np. #N/A), Najpierw sprawdź, czy typ danych jest liczbą całkowitą (Int32), a następnie sprawdź określoną wartość przechowywaną przez komórkę, zgodnie z tym tabela:

  • -2146826281 = #DIV/0!
  • -2146826246 = #N/A
  • -2146826245 = # GETTING_DATA
  • -2146826259 = # nazwa?
  • -2146826288 = # NULL!
  • -2146826252 = # NUM!
  • -2146826265 = #REF!
  • -2146826273 = # VALUE!

Na przykład twój kod może wyglądać tak:

enum CVErrEnum : Int32
{
    ErrDiv0 = -2146826281,
    ErrGettingData = -2146826245,
    ErrNA = -2146826246,
    ErrName = -2146826259,
    ErrNull = -2146826288,
    ErrNum = -2146826252,
    ErrRef = -2146826265,
    ErrValue = -2146826273
}

bool IsXLCVErr(object obj)
{
    return (obj) is Int32;
}

bool IsXLCVErr(object obj, CVErrEnum whichError)
{
    return (obj is Int32) && ((Int32)obj == (Int32)whichError);
}

Napisałem szczegółowy dwuczęściowy artykuł na ten temat kilka lat temu:

Artykuły są napisane dla VB.NET, ale zasady są dokładnie takie same jak w przypadku C#. Nie powinieneś mieć problemów z tłumaczeniem, ale jeśli masz jakieś problemy, zapytaj. (Pewnego dnia mam nadzieję, że będę miał czas, aby zaktualizować ten artykuł do C#. Jeśli tak się stanie w pewnym momencie, edytuję post, aby zawierał link.)

Mam nadzieję, że to pomoże!
 61
Author: Mike Rosenblum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-18 19:09:31