![]() |
Excel 2007, способ определить, есть ли в непустой ячейке формула
Добрый день.
Проблема следующая. Есть расчет в excel, версия на самом деле не очень принципиальна, для определенности -2007. Один из столбцов вычисляет значения, но в некоторых случаях значение может вбиваться вручную (формула не учитывает все параметры). Хотел бы выделить ячейки, вычисляющие значения, либо наоборот, значение в которых вбито, используя стандартные средства без применения VBA. Т.е. ячейки с содержимым "=10*10" и "100" должны иметь разную заливку (или иное выделение), несмотря что у обоих будет одинаковое значение "100". И вообще понять, есть ли разница между такими ячейками (вроде бы есть, т.к. на VBA cells(,).formula="100" для вбитого значения "100" и cells(,).formula="=100" для вбитого "=100", хотя кто его знает) На данный момент пользуюсь сочетанием "ctrl+~", но очень неудобно. Пытался решить вопрос условным форматированием, но оно работает на основании значения ячейки - неважно рассчитывается ли оно или вбито. Пытался подобрать стандартную функцию (чтобы вбить в соседнюю ячейку), но не получилось. Честно гуглил, правда времени нет на это, хотя по ощущением - должно быть простое и очевидное решение. Буду благодарен даже за подсказку в направлении, где стоит поискать решение. |
1) F5 - Выделить группу ячеек - Формулы - OK
2) Вкладка "Формулы" - Показать формулы (или используйте сочетание клавиш Ctrl + `) |
okshef, спасибо. Пользовался вторым способом, а вот про первый забыл - в моем случае он более удобный, т.к. позволяет выделить цветом нужные ячейки (от "ctrl+`" уже реально в глазах рябит, тяжело вглядываться, большой шанс пропустить ячейку).
И все же это не совсем то, что я хотел - т.к. цель расчетов другая, и отвлекаться на контроль этих ячеек сильно не хочется, поэтому хотелось бы реализовать полностью автоматическое условное Нашел способ создавать макрофункцию "=получить.ячейку(48;Лист1!A1)" и присваивать ей имя в диспетчере имен Источник, это именно то, что я хочу - но работает только на одном листе (в данном случае - "Лист1"), если листов будет 20 - нужно присваивать 20 имен :( Соответственно, когда таких файлов несколько, опять же не смешно. К сожалению в Макрофункциях я мало что понимаю, да и в именах не особо... Как вариант буду пользоваться F5, наверное самый приемлемый способ :) |
a_axe, ну, добавьте в модуль рабочего листа что-нибудь наподобие:
Код:
Private Sub Worksheet_Change(ByVal Target As Range) Цитата:
Код:
Option Explicit |
Хех, только хотел пожаловаться, что нет «ThisWorksheet» (по аналогии с «ThisWorkbook»), но вовремя вспомнил ;). Для ссылки на рабочий лист, который содержит вышеприведённый код, вместо:
Код:
Set objTargetRange = ThisWorkbook.Worksheets.Item("Лист1").Range("D2:D20") Код:
Set objTargetRange = Me.Range("D2:D20") |
Iska, спасибо за развернутый и проработанный ответ. Попробовал ваш способ, и вся моя решимость не использовать VBA растворилась в воздухе)))
Строка "Set objTargetRange = Me.Range("D2:D20")" работает. Расчет достаточно сложный, но структурированный (однотипные расчетные листы и несколько сводных расчетов - максимум 3 на файл), поэтому вашу программу легко удалось адаптировать к конкретной таблице. Практически ничего менять не пришлось, адаптировал следующее: 1. Событием сделал изменение в документе Код:
Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Код:
Set objTargetRange = ActiveSheet.Range("e2:e20") Код:
If Not left(ActiveSheet.Name,7) = "Сводная" Then okshef, Iska еще раз спасибо за помощь. Всегда приятно, когда кто-то другой делает за тебя твою работу :grin:, особенно когда времени катастрофически нет. |
Цитата:
Update: хотя нет, это относилось к функциям с «Application.Volatile». Кажется ;). |
Время: 22:06. |
Время: 22:06.
© OSzone.net 2001-