Страницы: 1
RSS
UDF для отлавливания в ячейках "полужирный" и "курсив"
 
Наши "мудрые" менеджеры (поубивал бы нафиг половину!) догадались в большой таблице выделять одни нужные строки курсивом, а другие полужирным. И ещё говорят: "Нам так удобнее. Ну, неужели вам трудно выбирать данные? Ведь они отлично выделяются из текста на листе!"  
А мне из этой таблицы нужно данные регулярно выбирать, да ещё хорошо бы динамически отслеживать изменения (таблица в общем доступе на сервере)...  
Решил сделать пару простейших UDF-ок чтобы различали полужирный и курсив:  
 
Function ЖИРНЫЙ(ЯЧЕЙКА): ЖИРНЫЙ = ЯЧЕЙКА.Font.Bold: End Function  
Function КУРСИВ(ЯЧЕЙКА): КУРСИВ = ЯЧЕЙКА.Font.Italic: End Function  
 
Работают.    
Но динамически не отслеживается изменение формата (ведь это не изменение данных и формулы поэтому не пересчитываются).  
Пробовал и добавлять в UDF Application.Volatile, и "летучие функции" (типа =СЛЧИС() ) на листе в ячейки ставил - не помогает.  
Где-то на Планете,кажется, видел решение похожей проблемы... Поискал, не нашёл.  
Может, кто-нибудь что-то посоветует или куда-то пошлёт (по ссылке, конечно :)?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Добавь  
Application.Volatile True
 
Недописал :)  
Отреагируй на событие Worksheet_Change и пропиши Me.Calculate
 
Я же написАл в своём посте, что это не помогает...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
А файлик можно?
 
я вчера выкладывал примерчик в теме про часы.  
чуть подправил.  
сейчас будет запускать пересчет книги каждую секунду.  
интервал можно поменять в макросе.  
 
можть, устроит такой вариант?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
{quote}{login=ikki}{date=26.04.2011 09:38}{thema=}{/quote}  
ThisWorkbook.Calculate ?????
 
{quote}{login=NullUzer}{date=26.04.2011 09:42}{thema=Re: }{post}{quote}{login=ikki}{date=26.04.2011 09:38}{thema=}{/quote}  
ThisWorkbook.Calculate ?????{/post}{/quote}  
млин... не проверил. :(  
а что, у книги нет такого метода?  
ну тогда Application.Calculate или ActiveSheet.Calculate  
 
сорри
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
ikki  
А что - IntelliSense не работает? :)
 
{quote}{login=NullUzer}{date=26.04.2011 09:48}{thema=Re: Re: Re: }{post}ikki  
А что - IntelliSense не работает? :){/post}{/quote}  
 
угум :(  
за неуплату отключили
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Прошу прощения, ЗАВИС. Перегружался.  
Вот примерчик.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=26.04.2011 09:53}{thema=}{post}Прошу прощения, ЗАВИС. Перегружался.  
Вот примерчик.{/post}{/quote}  
мой вариант не устроил?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Да ну, использовать Application.OnTime - это грубо...  
Да и код UDF-ки тогда разрастается из одной строчки в стандартном модуле в две процедуры в каждом модуле листа, где захочешь эту UDF использовать - процедуру для пересчёта экрана и таймер для её регулярного вызова.    
А если в модуле листа эти процедуры не поставишь, то и функция на этом листе обновляться не будет.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Да и к тому же применение Application.OnTime не позволяет пользоваться буфером обмена на листе (он постоянно сбрасывается), а самое мерзкое - перестаёт работать UnDo !!!
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
что грубовато - согласен :)  
насчет всего остального - нет.  
сам надеюсь, что найдётся решение получше.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
{quote}{login=ikki}{date=26.04.2011 10:07}{thema=}{post}  
насчет всего остального - нет{/post}{/quote}  
???  
У вас что, буфер обмена не сбрасывается и UnDo на листе работает если включено Application.OnTime ???
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
напишите им автоматизацию смены шрифта, которая будет автоматически  в доп столбце ставить признак выделения.  
 
и им будет еще удобнее и вам  
 
хотя, конечно, это не панацея.. обязательно кто нить вручную сделает..
Живи и дай жить..
 
Дмитрий, спасибо. Интересный вариант.    
Но всё равно UDF получаются какими-то "недофункциями". Т.е. сами по себе без "костылей" не обновляющимися.  
Ну и фиг с ним с автоматическим обновлением. Мне проще даблкликнуть в любую ячейку листа чтобы они пересчитались, чем так заморачиваться...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=26.04.2011 10:12}{thema=Re: }{post}{quote}{login=ikki}{date=26.04.2011 10:07}{thema=}{post}  
насчет всего остального - нет{/post}{/quote}  
???  
У вас что, буфер обмена не сбрасывается и UnDo на листе работает если включено Application.OnTime ???{/post}{/quote}  
 
бефер не сбрасывается.  
Undo работает.  
 
но... с простым Calculate почему-то перестало работать %)  
пришлось заменить на CalculateFull
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
ikki, спасибо.  
Этот ваш вариант с Application.CalculateFull и сам работает,и не мешает работать буферу обмена и UnDo.  
Но пересчитывать ежесекундно по таймеру ВСЮ КНИГУ по - это ИМХО уж слишком!  
 
К сожалению если вместо Application.CalculateFull поставить ActiveSheet.Calculate, то будет ежесекундно сбрасываться буфер и станет невозможно UnDo...  
Замкнутый круг получается…
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
паллиатив, конечно :(  
 
1. смотря какая оперативность требуется (может быть, и раз в минуту достаточно, а то и ежесекундно может оказаться слишком поздно)  
2. смотря каких размеров файл.  
3. смотря насколько сложные формулы.  
4. и др. ......  
 
кардинальное решение: уволить таких менеджеров нафиг :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Алекс а может событие  Sub Worksheet_SelectionChange(ByVal Target As Range) спасет ситуацию. Процедура персчитывает весь лист.
 
Володя, я думаю овчинка не стоит выделки.    
Всё равно нормальную функцию листа из этих ЮДФ-ок не сделать. Без всяческих "костылей" работать они не будут.  
Да в общем-то этого и стоило ожидать, ведь стандартные-то формулы листа не умеют на формат реагировать... Формат же - это не изменение данных.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
Страницы: 1
Читают тему
Наверх