определите, содержит ли ячейка Excel формулу (VSTO: C # или VB)

#c# #excel #vsto

#c# #excel #vsto

Вопрос:

У меня есть таблица:

введите описание изображения здесь

Приложение должно распознавать формулы и обрабатывать их особым образом (например, не переопределять их). Каждая строка читается следующим образом:

 object[,] formulas = (object[,])worksheet.Range["A2:C2"].Formula;

if (((string)formulas[1,3]).StartsWith("="))
{
    //handle formula
}
  

В этом решении есть важная ошибка. Кажется, он не может «видеть» знак одинарной кавычки, то есть:

  • "=A1" считывается свойством формулы как "=A1" и распознавание работает
  • "'=A1" считывается свойством Formula как "=A1" , поэтому оно распознается как формула, даже если это не так

Существует еще одно решение, которое я исследовал, явное свойство диапазона HasFormula .

 if ((bool)worksheet.Range["C5"].HasFormula == true)
{
    //handle formula
}
  

HasFormula не возвращает массив, поэтому вам нужно проверять каждую ячейку. Это имеет огромный недостаток производительности и является основной причиной, по которой я читаю целые строки, а не отдельные ячейки.

Итак, первое решение ненадежно, второе неэффективно, и теперь у меня нет вариантов.
Есть ли что-нибудь еще, что я могу попробовать?

Комментарии:

1. Может SpecialCells быть, и xlCellTypeFormulas ?

2. Хорошо, я проверяю это. Специальные ячейки могут генерировать непрямоугольный диапазон, содержащий только ячейки, содержимое которых является формулами, и это делается одним вызовом COM. Затем я должен проверить, включена ли каждая из моих ячеек в возвращаемый диапазон SpecialCells. Это должно быть сделано без использования функций Excel, таких как Intersect, потому что это будет вызов COM для каждой ячейки, и таким образом мы вернемся к большой проблеме с производительностью. Я думаю, что это решение не очень простое, но выполнимо, я пытаюсь реализовать что-то подобное сейчас. Надеюсь, что есть лучшее решение.

Ответ №1:

Начальная одинарная кавычка — это устаревшее сокращение для перевода ячейки в текстовый режим.

Вы можете получить к ней доступ как к свойству отдельной ячейки в VBA / C с помощью метода .PrefixCharacter, который возвращает строку из одного символа или значение null, если префикс существует.

 HasPrefixString = Range("B2").PrefixCharacter 
  

C # должен иметь аналогичный метод (или лучше), чем VBA или аналогичный C .

Комментарии:

1. Это интересно, к сожалению, это невозможно сделать для диапазонов, а только по ячейкам, то есть вызов COM для каждой ячейки и большая неэффективность. Таблица, скажем, из 10 * 1000 ячеек, может быть прочитана за доли секунды в целом, в то время как чтение ячейки за ячейкой может занять до 15 секунд.