Перейти к содержимому

- - - - -

Excel - Вопросы и ответы. (1. Запрет пересчета одной ячейки в Эксель)


Сообщений в теме: 27

#1 Zhurlena Отправлено 02 Февраль 2012 - 11:14

название темы расширено
публикуйте свои вопросы по Excel и получайте ответы, советы, рекомендации форумчан

вопросы выделяйте крупно чтобы было удобно всем (см.ниже) :)
---модерация---


Здравствуйте!
Помогите пожалуйста!
Мне нужно, чтобы Эксель не пересчитывал формулу только в одной ячейке.
Как это можно сделать?

В частности, чтобы при первом открытии книги в ячейку вставлялась сегодняшняя дата (функцией СЕГОДНЯ()), но при дальнейшей работе (при открытии и сохранении книги) эта формула не пересчитывалась.

#2 Psw Отправлено 04 Февраль 2012 - 16:59

  • Не Бритое Зло

Очевидных путей не знаю.
Но встречал (давно) - когда в шаблоне книги нарисована кнопка типа "записать", к которой привязан макрос, который заменяет нужные ячейки на их текущие значения и заодно удаляет кнопку "записать" ;) Вполне работоспособно было.
Это возможно надо у КошакаЮвы спросить, вдруг он знает рецепт ;)

#3 vidyakin Отправлено 05 Февраль 2012 - 16:01

  • Делаю мир понятным

Просмотр сообщенияZhurlena (02 Февраль 2012 - 11:14) писал:

Здравствуйте!
Помогите пожалуйста!
Мне нужно, чтобы Эксель не пересчитывал формулу только в одной ячейке. Как это можно сделать?

В частности, чтобы при первом открытии книги в ячейку вставлялась сегодняшняя дата (функцией СЕГОДНЯ()), но при дальнейшей работе (при открытии и сохранении книги) эта формула не пересчитывалась.
Надо написать пару строчек на языке VBA. Какие именно строчки и где — после того, как будет ясна задача.
Стандартной функции для выполнения этой операции в Excel нет.
Я знаю, почему распяли Иисуса. У него не было лицензии на образовательную деятельность.

#4 Джамес Буль Отправлено 07 Февраль 2012 - 02:46

  • новичок

Просмотр сообщенияZhurlena (02 Февраль 2012 - 11:14) писал:

В частности, чтобы при первом открытии книги в ячейку вставлялась сегодняшняя дата (функцией СЕГОДНЯ()), но при дальнейшей работе (при открытии и сохранении книги) эта формула не пересчитывалась.

Код ниже
при открытии книги проверяется ячейка B4
если она пуста туда вводится текущая дата и время
если ячейка уже содержит значение ничего не будет изменено
подправьте адрес ячейки на нужный и пользуйтсь :)
Private Sub Workbook_Open()
Range("B4").Select
If Excel.ActiveCell.FormulaR1C1 = "" Then ActiveCell.FormulaR1C1 = Now
End Sub

этот код нужно скопировать в вашу книгу следующим образом
  • откройте нужную книгу
  • меню tools (инструменты) \ макросы \ редактор VBA
  • в открывшемся окне дважды кликните на "Эта книга"
  • в открывшееся окно вставляем код
  • подправляем адрес ячейки (B4)
  • сохраняем книгу
файл примера прикреплен :)

Прикрепленные файлы

  • Прикрепленный файл  Book500.zip   6,38К   8 Количество загрузок:


Анархия - мать порядка

#5 hren Отправлено 10 Февраль 2012 - 15:54

  • гуру

А зачем такая функция интересно? для контроля? тогда может защиту туда какую добавить

#6 Джамес Буль Отправлено 11 Февраль 2012 - 16:28

  • новичок

Просмотр сообщенияhren (10 Февраль 2012 - 15:54) писал:

А зачем такая функция интересно? для контроля? тогда может защиту туда какую добавить
обычно это требуется тем кто создает шаблоны
типо каждый новый документ при открытии шаблона получается частично заполнен и нужно тоько добавить инфы и можно отправлять :)

Кстати использовать шаблоны можно даже в таких простейших программах как Блокнот (notepad)
если в первой строке текстового файла написать ".LOG" (точка и большими буквами LOG без пробелов)
то при каждом открытии в конец файла будут добавлены текущая дата и время
Это можно использовать для ведения журналов :)
Анархия - мать порядка

#7 hren Отправлено 12 Февраль 2012 - 11:56

  • гуру

прикольно

#8 Psw Отправлено 21 Март 2012 - 12:52

  • Не Бритое Зло

Просмотр сообщенияДжамес Буль (07 Февраль 2012 - 02:46) писал:

Код ниже
Дядя, а как сделать в ексельном скрипте выход из бесконечного цикла по нажатию какой-либо кнопки ?
Ну в смысле кроме Ctrl+Break ;)
Возможно - не тока кнопки на клаве, а быть могет кнопки на рабочем листе ? Ибо запускаеццо это сейчас именно так ;)
Текст скрипта для непрерывного пингования подсетки:
Скрытый текст

---модерация---
вопрос выделен крупно после реорганизации темы

#9 Джамес Буль Отправлено 21 Март 2012 - 19:54

  • новичок

Просмотр сообщенияPsw (21 Март 2012 - 12:52) писал:

Дядя, а как сделать в ексельном скрипте выход из бесконечного цикла по нажатию какой-либо кнопки ?
Ну в смысле кроме Ctrl+Break ;)
Возможно - не тока кнопки на клаве, а быть могет кнопки на рабочем листе ? Ибо запускаеццо это сейчас именно так ;)
Текст скрипта для непрерывного пингования подсетки:
имхо бесконечный цикл это всегда плохо :no:

в экселе есть функция:
Application.OnTime время, название процедуры

вот пример из справки:
Application.OnTime Now + TimeValue("00:00:15"), "my_Procedure"
запустить через 15 секунд процедуру my_Procedure

Механизм такой:
В конце выполнения процедуры my_Procedure
повторяем вызов Application.OnTime со ссылкой на имя текущей процедуры
но этот вызов предворяем проверкой условия нажатия кнопки
например кнопка при нажатии устанавливает значение переменной NowStop=vbTrue
тогда:
if NowStop=vbFalse then Application.OnTime Now + TimeValue("00:00:05"), "my_Procedure"

В итоге процедура будет запускаться каждые 5 секунд если не была нажата кнопка
при нажатии кнопки текущая выполняемая процедура спокойно выполняется до конца но следующего запуска уже не будет :)
Анархия - мать порядка

#10 Psw Отправлено 21 Март 2012 - 21:23

  • Не Бритое Зло

Ничего не понял на спех ;) Зачем мне по времени шедулить если я могу прямо в бесконечный циклер (номинальная скорость порядка секунды на оборот) вставить опрос события (нажатия кнопки на клаве или раб листе) ?
Проблема в том что выполняющийся VBA скрипт вешает эхель мёртво и тот не осознаёт что были клики мыши по кнопам ;)
Нужен аналог басицной inkey$, даже если и с ограничениями - что будет ловить клики/нажатия тока в модальном окне - дань мелкомягкому не отягощает ;) И даже приветствуется ...
Прочитал ещё раз.
Ты думаешь что Application.OnTime Now + TimeValue("00:00:15"), "my_Procedure" будет запускаться в отдельном потоке ?
Мне другой знакомец тоже предложил ковырять многопоточность, но на мой взгляд - непонятно нахрена она нужна если я и в основном циклере могу опрашивать события, важно кто их будет порождать и как я их буду получать в скрипт VBA ?
Короче ты не мог бы опробовать своё предложение, я же текст приложил скрипта полный ?
А по поводу "бесконечные циклы=зло" - ядро любой много задачной операционки или проги - бесконечный циклер ;) Так что ... Мы все злые ;)
Начало бесконечного циклера - 111 строка приложенного скрипта.

#11 Джамес Буль Отправлено 22 Март 2012 - 00:55

  • новичок

Просмотр сообщенияPsw (21 Март 2012 - 21:23) писал:

Ничего не понял на спех ;) Зачем мне по времени шедулить если я могу прямо в бесконечный циклер (номинальная скорость порядка секунды на оборот) вставить опрос события (нажатия кнопки на клаве или раб листе) ?
Проблема в том что выполняющийся VBA скрипт вешает эхель мёртво и тот не осознаёт что были клики мыши по кнопам ;)
ответ на вопрос подчеркнут
Это Виндофс
Если используется зацикливание то процесс выбирает столько ресурсов системы сколько она позволяет (зависит от версии виндовс и множества других факторов)
а это может быть и 100 процентов и тогда будет практически полный висяк
поэтому я и написал что зацикливание это зло

Если процесс работает по времени то ожидание следующего запуска не требует выделения системой значительных ресурсов
и эти ресурсы отдаются другим программам либо просто не расходуются и система ждет "что хотите хозяин?"
и это правильный подход

Система всеравно не сможет выполнить свои задачи быстрее при зацикливании
потому при зацикливании просто паузы между повторами теоретически равны 0 а на самом деле
при вызове по времени если не делать паузы совсем микроскопическими достигается баланс между скорострельностью программы и требами системы

Просмотр сообщенияPsw (21 Март 2012 - 21:23) писал:

Ты думаешь что Application.OnTime Now + TimeValue("00:00:15"), "my_Procedure" будет запускаться в отдельном потоке ?
нет я такого не говорил
поток он один
разделение на потоки делается совсем по другому а в данной задаче оно ваще не нужно

Просмотр сообщенияPsw (21 Март 2012 - 21:23) писал:

Мне другой знакомец тоже предложил ковырять многопоточность, но на мой взгляд - непонятно нахрена она нужна если я и в основном циклере могу опрашивать события, важно кто их будет порождать и как я их буду получать в скрипт VBA ?
Короче ты не мог бы опробовать своё предложение, я же текст приложил скрипта полный ?
я OnTime использовал в некоторых задачах все там нормально
ваще если тебе нужно пинговать я не совсем понимаю нафига ваще нужен excel
обычный VBS (vbscript) примеры в сети найти можно готовые

Просмотр сообщенияPsw (21 Март 2012 - 21:23) писал:

А по поводу "бесконечные циклы=зло" - ядро любой много задачной операционки или проги - бесконечный циклер ;) Так что ... Мы все злые ;)
видишли то что ты называешь бесконечные циклы и то что приводишь в качестве примера inkey$
это реализуется в системе не совсем одинаково и последствия поэтому разные
в одном случае прога зажирает все ресурсы и тупо все начинает тормозить в другом случае цикл на языке высокого уровня проработан челами которые делают компиляторы и интерпретаторы так что на самом деле для операционки зацикливания нету :)
если ты будешь писать на низком уровне тогда можно спорить и рассуждать а код на VBA тут лучше не ходить на грабли по которым толпы уже ходили
в данном случае ты просишь Excel выполнить для тебя код VBA а там дальше такая начинается какафония :lol: лучше просто не вникать
Анархия - мать порядка

#12 Psw Отправлено 22 Март 2012 - 01:07

  • Не Бритое Зло

Просмотр сообщенияДжамес Буль (22 Март 2012 - 00:55) писал:

ваще если тебе нужно пинговать я не совсем понимаю нафига ваще нужен excel
обычный VBS (vbscript) примеры в сети найти можно готовые
Ехель - привычен просто, лублу я его ;) А васик-скрипты там вполне просто приделаны.
Ну хочеццо в потенциале долговременно хранить/обрабатывать результаты отклика. Кроме того, хочеццо знать например скока хостов реально существуют в подсетке, ибо списки DHCP сервака не актуальны ;) По разным причинам ...
Сейчас торможу скрипт Ctrl+Break и при ScreenUpdating=False экран эхеля при выходе из скрипта не подвисает, в отличие от прежних версий эхеля. Так что быть могет мой вопрос из практических перешёл в категорию чисто эстетических ;)


#13 Джамес Буль Отправлено 22 Март 2012 - 01:13

  • новичок

тада ага :)
я сам люблю экселю причем с версии гдето 4 :lol:
в то время это была самая чудесная программа которую я встретил

а ваще одно дело для себя а другое дело для клиента писать
писать для клиентов на VBA я зарекся давно
стрем разных версий и зависимость от особенностей конфигурации конкретного компа убивает всю идею
но как малая подручная автоматизация вполне ничо :)
Анархия - мать порядка

#14 Глум Отправлено 22 Март 2012 - 18:47

  • Nothing Else Matters

Просмотр сообщенияPsw сказал:

Текст скрипта для непрерывного пингования подсетки:
Извиняюсь за оффтоп злостный.
ПСВ, а как твоя прога реагирует, если машинка в подсети дропит пинги?

ПМСМ, для целей пинга локалки, да и не только, вполне себе ничего работает nmap. Задаёшь ему дипазон, задаёшь не сканить порты, а только пинговать, отправляешь результаты в файл. Всё - одна строка в консоли.
А уж из файла парси отчёты, как тебе угодно.

ЗЫ А зачем подсеть пинговать непрерывно? DDoS-ишь? :)
«Сегодня мы снова вернулись к «нормальной», «цивилизованной» коррупции, которая, увы, есть и в Китае (там за это, правда, расстреливают), и в Италии, и в Америке» © Говорухин.

#15 Кошак Юва Отправлено 22 Март 2012 - 19:47

  • гуру

Просмотр сообщенияPsw (21 Март 2012 - 21:23) писал:

Проблема в том что выполняющийся VBA скрипт вешает эхель мёртво
DoEvents( )
DoEvents passes control to the operating system. Control is returned after the operating system has finished processing the events in its queue and all keys in the SendKeys queue have been sent.
перевод приблизительно такой - передает управление ОС, чтобы та могла отработать другие события...Затем управление возвращается. Я - пользуюсь, помогает :)
Когда люди ходят с высоко поднятой головой, то часто спотыкаются и падают. Поэтому коты ходят с высоко поднятым хвостом

#16 Кошак Юва Отправлено 22 Март 2012 - 19:52

  • гуру

Просмотр сообщенияZhurlena (02 Февраль 2012 - 11:14) писал:

Мне нужно, чтобы Эксель не пересчитывал формулу только в одной ячейке. Как это можно сделать?
В частности, чтобы при первом открытии книги в ячейку вставлялась сегодняшняя дата (функцией СЕГОДНЯ()), но при дальнейшей работе (при открытии и сохранении книги) эта формула не пересчитывалась.
формула в ячейке "блокируется" содержимым другой ячейки, к примеру, ячейкой с именем Created_Date (=$B$5, к примеру, если не нравится работать с именованными ячейками):
=ЕСЛИ(ЕПУСТО(Created_Date);СЕГОДНЯ();Created_Date)
Когда люди ходят с высоко поднятой головой, то часто спотыкаются и падают. Поэтому коты ходят с высоко поднятым хвостом

#17 Джамес Буль Отправлено 22 Март 2012 - 22:20

  • новичок

Просмотр сообщенияКошак Юва (22 Март 2012 - 19:47) писал:

DoEvents( )
DoEvents passes control to the operating system. Control is returned after the operating system has finished processing the events in its queue and all keys in the SendKeys queue have been sent.
перевод приблизительно такой - передает управление ОС, чтобы та могла отработать другие события...Затем управление возвращается. Я - пользуюсь, помогает :)
doevents v VBA криво реализована это означает что поведение скрипта в разных версиях Excel и на разных ПК может сильно отличаться
да и ограничение серьезное есть связанное что в момент работы скрипта ничто другое не должно "мешать"
(майкрософты откровенно признают это в справке) (например обработка события может все подвесить)
на практике выжирает ресурсов много больше чем нужно для выполнения задачи
а в чудесных сочетаниях с другим софтом прекрасно тормозит всю систему :unsure:

впрочем если скрипт предполагается использовать только на текущем пк то можно поступить по правилу "если работает то и ладно" :)
Анархия - мать порядка

#18 Psw Отправлено 22 Март 2012 - 22:40

  • Не Бритое Зло

Просмотр сообщенияГлум (22 Март 2012 - 18:47) писал:

ПСВ, а как твоя прога реагирует, если машинка в подсети дропит пинги?
Если хост не отвечает - значит он лежит ;) Подсетка внутренняя, эхо ответ везде разрешён политиками.

Просмотр сообщенияГлум (22 Март 2012 - 18:47) писал:

ПМСМ, для целей пинга локалки, да и не только, вполне себе ничего работает nmap. Задаёшь ему дипазон, задаёшь не сканить порты, а только пинговать, отправляешь результаты в файл. Всё - одна строка в консоли.
А уж из файла парси отчёты, как тебе угодно.
ХЗ, давно мечтал пинговать прям из эхеля, вот наткнулсо - прикольно, работает ;)
Вызывать внешнюю прогу - тока путь удлиннять.
Как мне например построить график времени отклика от времени суток сотни хостов в подсетке ? ;) А в эхеле смогу ....

Просмотр сообщенияГлум (22 Март 2012 - 18:47) писал:

ЗЫ А зачем подсеть пинговать непрерывно? DDoS-ишь? :)
Моя подсетка - что хочу то и делаю ;) Зря штоле гигабитные свичи киловаты жуют ?

Просмотр сообщенияКошак Юва (22 Март 2012 - 19:47) писал:

DoEvents( )
DoEvents passes control to the operating system. Control is returned after the operating system has finished processing the events in its queue and all keys in the SendKeys queue have been sent.
перевод приблизительно такой - передает управление ОС, чтобы та могла отработать другие события...Затем управление возвращается. Я - пользуюсь, помогает :)
Про это мне знакомец уже намекнул. Сопроводив каментом что КПД упадёт ибо "DoEvents сильно жрёт ресурсы"
Кароче - попробовал - ничего не изменилось. Что я делаю не так ? Текущая версия скрипта:
Скрытый текст


#19 Глум Отправлено 23 Март 2012 - 00:09

  • Nothing Else Matters

Просмотр сообщенияPsw сказал:

Как мне например построить график времени отклика от времени суток сотни хостов в подсетке ?
Сверхзадача непонятна. :) Особенно если

Цитата

Если хост не отвечает - значит он лежит эхо ответ везде разрешён политиками.
А в чём важность непрерывной доступности каждого хоста? Провайдер что ле? Если одмин - утром позвонят с этого хоста: "Ничо не работаит!".
Поставь нмап на шедул.
Пингуешь тоже изнутри?

Цитата

ХЗ, давно мечтал пинговать прям из эхеля, вот наткнулсо - прикольно, работает
ХЗ, я б с калькулятра или косынки попробовал. Тоже прикольно, наверное. :D
«Сегодня мы снова вернулись к «нормальной», «цивилизованной» коррупции, которая, увы, есть и в Китае (там за это, правда, расстреливают), и в Италии, и в Америке» © Говорухин.

#20 Psw Отправлено 23 Март 2012 - 06:04

  • Не Бритое Зло

Просмотр сообщенияГлум (22 Март 2012 - 18:47) писал:

Извиняюсь за оффтоп злостный.
Кстати если вдруг модератор задним числом пере именует тему в что-либо типа "MS Excel - вопросы, проблемы и решения" - то тема себя долго смогет не исчерпать ;)

Просмотр сообщенияГлум (23 Март 2012 - 00:09) писал:

А в чём важность непрерывной доступности каждого хоста?
Скорее - время отклика живых и быстрых хостов, которые 0-5 мСек лаг имеют. Сам ещё не знаю зачем ;) Стат обработка данных показала, что она была бесполезной ;)

Просмотр сообщенияГлум (23 Март 2012 - 00:09) писал:

Поставь нмап на шедул.
Из этого скрипта сейчас чуть более сотни живых хостов пингуются пару/тройку раз за сек, и пара/тройка лежачих проверяются на лежачесть - соответственно картина вкл/выкл каждого конкретного хоста не особо меняет/портит частоту оборотов главного циклера.
НМАП позволяет сделать тайм-аут 50 мСек ? Даже если и так, то шедулить его даже если каждую секунду - не изврат ли ?
Пока не вижу необходимости. Недостаток васика в том что его приходится брэйком останавливать - не значительный для лично меня.
Кстати после добавления DoEvents() в главный циклер (вызывается 2-3 раза в сек) загрузка проца вроде не возросла. Но и не помогло останавливать "кнопкой".

Просмотр сообщенияГлум (23 Март 2012 - 00:09) писал:

Пингуешь тоже изнутри?
Ясное дело ;) По интернетам ловить лаги 0-5 мСек нереально.

#21 Джамес Буль Отправлено 23 Март 2012 - 15:31

  • новичок

название темы расширено
надеюсь автор темы непротиф :)
вопросы выделяйте жирно и крупно тада будет удобнее всем
---модерация---
Анархия - мать порядка

#22 Кошак Юва Отправлено 23 Март 2012 - 19:50

  • гуру

Просмотр сообщенияPsw (22 Март 2012 - 22:40) писал:

Что я делаю не так ? Текущая версия скрипта:
я ставлю DoEvents всегда после вызова любых функций на ассемблере (то, что грузит процессор) или старта внешних программ (использую обычно Access). При старте "длинных" операций (фоновые пересчеты базы или обработка файлов) фокус остается на стартующей кнопке - обрабатываю событие нажатия клавиши, проверяя, не нажал ли оператор ESC (это отмена операции). Если нажал - взводится триггер-переменная, которая анализируется в каждом цикле. Работает на базах в 100-200тыс файлов, компы Целероны в т.ч.
Если нужен код - только попросите, там десяток строк :yes:
Когда люди ходят с высоко поднятой головой, то часто спотыкаются и падают. Поэтому коты ходят с высоко поднятым хвостом

#23 Кошак Юва Отправлено 23 Март 2012 - 23:28

  • гуру

Цитата

Что я делаю не так ?
стормозил, допишу здесь... Psw, у тебя нет обработчика клавиши ESC (то есть отмены операции) - ну, тогда Excel'ю можно прекратить работу только по Ctrl+Breake, что, собственно, и происходит....DoEvents отдает управление другим обработчикам (мало ли что ты пускаешь параллельно со сканированием сети - при этом надо, чтобы комп на клавиши реагировал). Такое перебрасывание ресурсов процессора, естественно, шустроты программе не добавляет (о чем и писал Джамес Буль) - так оно и не надо вроде. Надо, чтобы программа максимум за цикл опроса одного хоста отреагировала, когда юзер нажмет на отмену операции
Когда люди ходят с высоко поднятой головой, то часто спотыкаются и падают. Поэтому коты ходят с высоко поднятым хвостом

#24 Psw Отправлено 24 Март 2012 - 10:03

  • Не Бритое Зло

Просмотр сообщенияКошак Юва (23 Март 2012 - 19:50) писал:

фокус остается на стартующей кнопке - обрабатываю событие нажатия клавиши, проверяя, не нажал ли оператор ESC (это отмена операции). Если нажал - взводится триггер-переменная, которая анализируется в каждом цикле.
<>
Если нужен код - только попросите, там десяток строк
Дядя, Дай кода ;) Вставлю. Именно это я и спрашивал - как опрашивать нажатия кнопок в скрипте не останавливая выполнение скрипта (аналог бэйсик inkey$ ) . Ибо inputbox будет ждать реакции человека.
Как при выполнении скрипта узнать что чел давил эскейп к примеру или мышой кликал по формам ?

Просмотр сообщенияКошак Юва (23 Март 2012 - 23:28) писал:

Надо, чтобы программа максимум за цикл опроса одного хоста отреагировала, когда юзер нажмет на отмену операции
Именно. Дайте кода ;) Который я всталю хоть перед каждым пингом, нет проблем.
Кстати гугель показал что такой вопрос существует не тока у меня ;)

#25 Кошак Юва Отправлено 24 Март 2012 - 10:58

  • гуру

Просмотр сообщенияPsw (24 Март 2012 - 10:03) писал:

Как при выполнении скрипта узнать что чел давил эскейп к примеру или мышой кликал по формам ?
обрабатывай события "нажатие на клавишу" (OnKeyDown) для своей кнопки "Выполнить" (ибо фокус остаётся на ней при нажатии мышой) и событие OnClick для формы. NB! Если ты не прерываешь цикл с помощью DoEvents, твои нажатия остаются в очереди до выхода из цикла - то есть навсегда или до Ctrl+Break.Код ушел в личку, если считаешь полезным - выложи сюда всем.
ЗЫ вообще-то я принудительно перед запуском счета ставлю фокус на кнопку Cancel и обрабатываю события на ней - оператор может нажать кнопку пробелом, мышой или нажать ESC на клавиатуре, но текст проги несколько запутывается... Тебе послал простой вариант.
Когда люди ходят с высоко поднятой головой, то часто спотыкаются и падают. Поэтому коты ходят с высоко поднятым хвостом





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 скрытых пользователей