Формула Excel для проверки содержимого ячеек - PullRequest
8 голосов
/ 19 октября 2010

Я пытаюсь создать условное форматирование во время выполнения (huzzah) для надстройки (double huzzah) и обнаружил, что, по-видимому, некоторые функции нельзя использовать так, как в обычной рабочей таблице. (Я просто получаю неверную ошибку вызова процедуры 5 при попытке создать CF, ссылающийся на функцию VBA, которую я могу вызвать в ячейке, даже если она находится в надстройке, а не в рабочей книге; я могу создать штраф CF с помощью встроенной в действии.) Самое ясное подтверждение, которое я нашел для этого, - здесь , но это не объясняет, в чем проблема; это эзотерическая часть, хотелось бы услышать больше о том, что я могу ожидать с этим.

Часть "резиновая встреча с дорогой": могу ли я вообще отказаться от VBA и использовать серию встроенных функций только для Excel, чтобы проверить, содержит ли данная ячейка константу (т. Е. Значение введенный пользователем), формула (т.е. какой-то расчет, логическая операция и т. д. - в значительной степени начинается с =) или ссылка (т. е. ссылка на ячейку в другой рабочей таблице или другой рабочей книге)? Я знаю, что в Excel это определение всегда под рукой; засвидетельствуйте использование и скорость GoTo / Special. Как может I достичь этого?

Заранее спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 25 февраля 2016

Обновлено для Excel 2013:

Для версий Office 2013 и выше доступна функция ISFORMULA ¹.Комбинируя это с функцией NOT , функцией AND и функциями COUNTBLANK , ISBLANK или LEN , можно получитьформула для определения, содержит ли ячейка константу.

Стандартные формулы в E2: F2:

=ISFORMULA(D2)
=AND(NOT(ISFORMULA(D2)), LEN(D2))

ISFORMULA_update

Если требуется дополнительная информация о природе значения ячейки, можно использовать функцию TYPE , чтобы определить, является ли содержимое ячейки числом, текстом, логическим значением, ошибкой или массивом.

При использованиисовместно обсуждаемые здесь собственные функции рабочего листа могут воспроизводить результаты, доступные из перечисления Range.SpecialCells VBA * и его xlCellTypeConstants или xlCellTypeFormulas xlCellType перечисления.


¹ Функция ISFORMULA была введена в Excel 2013. Она недоступна в более ранних версиях.

0 голосов
/ 17 апреля 2011

Я не думаю, что вы можете вообще избежать VBA, но вы можете создать простой UDF и использовать его в Excel

Например

Function IsFormula(Check_Cell As Range)
  IsFormula = Check_Cell.HasFormula
End Function

и

Function IsLink(Check_Cell As Range)

  If InStr(1, Check_Cell.Formula, "!", vbTextCompare) Then
   IsLink = Check_Cell.HasFormula
  End If
End Function

= IsFormula (A1) вернет TRUE, если в A1 есть формула, и FALSE в противном случае = IsLink (A1) вернет TRUE, если в A1 есть формула, содержащая '!'в противном случае FALSE

Вы можете объединить их и создать строковый вывод «Формула», «Ссылка», «Значение»

0 голосов
/ 20 октября 2010

Не уверен, что это то, что вы хотите, но, похоже, он выполняет то, о чем вы просите, по крайней мере, часть из этого.

http://www.ozgrid.com/VBA/special-cells.htm

Это метод range.specialcells.

Возвращает диапазон, который содержит только константы или только формулы и т. Д.

Пример использования этого кода показан ниже:

Sub CheckForConstants()
    Dim x As Range
    Set x = Selection.SpecialCells(xlCellTypeConstants, xlNumbers)
    MsgBox "address of cells that contain numbers only is " & x.Address
    Set x = Selection.SpecialCells(xlCellTypeConstants)
    MsgBox "address of cells that contain constant of any type is " & x.Address
End Sub

Вы выбираете диапазон и затем выполняете этот макрос, и он возвращает адрес тех ячеек, которые отвечают требованиям.

Первый х ищет ячейки, которые содержат только цифры. Второй х ищет ячейки, которые содержат любые константы

В этом случае диапазон был выбран, но вы можете установить то, что хотите, то есть диапазон («a1: b5») и т. Д.

Я вернулся на рабочий лист и использовал специальный метод goto.

Очевидно, он также использует метод range.special.

Я использовал опцию записи макроса, и это то, что я получил.

Selection.SpecialCells(xlCellTypeConstants, 23).Select
    Range("M7").Select
    Selection.SpecialCells(xlCellTypeFormulas, 23).Select
    Range("I6:J16").Select
    Selection.SpecialCells(xlCellTypeConstants, 1).Select
    Range("L9").Select
    ActiveWindow.ScrollWorkbookTabs Position:=xlFirst
    Sheets("CP").Select
    Application.CutCopyMode = False
    Range("I21").Select
    ActiveSheet.DrawingObjects.Select
    Application.Goto Reference:="GoToSpecialRoutine"

Специальная функция goto на листе использует метод специальных ячеек для некоторых действий.

Он также использует других. В последних 5 строках кода я изменил рабочий лист и попросил его перейти к объектам.

Это действительно не идет к ним. Он просто выбирает их.

Рабочий лист CP содержал объекты, и он использовал код в последних 3 строках, чтобы выбрать все объекты на рабочем листе.

Лучше всего увидеть код позади goto special - записать макрос, а затем использовать функцию goto / special на листе.

Когда закончите, остановите запись и просмотрите записанный вами макрос.

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

...