Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Знаете ли Вы, что..., Пара трюков в VBA :)
 
Я давно уже использую в своем проекте панель CommandBars. Вешаю ее где находятся стандартные панели, а их прячу. Но с CommandBar при правом клике по ячейке не работал. Вообще конечно интересно. Пока вроде как никуда не надо, но интересно. Еще один инструмент в копилке знаний никогда не будет лишним. Мало ли где понадобится. Обычно всегда так. Только когда хорошо изучишь что то новое, видишь где это можно использовать.
Сегодня второй день работы с общим классом из главной книги. Пока все отлично. Скорость не упала . Вообще не вижу разницы. Багов нет. Все отлично! Теперь, так же как с функциями и процедурами, могу править этот класс и сразу смотреть на результаты.
Знаете ли Вы, что..., Пара трюков в VBA :)
 
Цитата
EducatedFool пишет:
Цитата
Johny пишет:
И ещё:
Код
  VBE.ActiveVBProject.VBComponents("clsMyClass").Properties("Instancing") = 5 'Multi-Use  

Эх, как же долго я искал вариант с использованием модулей класса одного файла в другом...
Где ж вы раньше были)))
Да вот и правда, где? А точнее сказать где был этот ответ, когда я долго его искал. Наверное все же плохо искал )) В начале, когда весь проект свелся к общей книге и множеству других ведомых ею книг, была написала процедура, которая экспортирует формы, модули и классы из главной книги в каталог и импортирует их в каждую книгу. Работало, даже было весьма неплохо доделано. Потом я узнал о References. О чудо, это работает. Очень удобно. Но с классами не прокатило как не выеживался. Класс как и раньше я таскал из общей книги в каждую где он нужен. Вдоль и поперек изъел publicnotcreatable, но безуспешно. А тут вон как. Свойство есть, но мышкой не задашь.
Сейчас такое чувство, что все это время заходил в этот дом через окно...
Ну и как обычно, искал сейчас совсем другое. А нашел эту ветку. Спасибо Johny!!! Огромное человеческое спасибо.
Двухсторонняя печать средствами VBA (Переключение дуплекса)
 
Тут все равно уже курилка а не ветка.  
Продолжение обсуждения темы http://www.planetaexcel.ru/forum.php?thread_id=46166&forum_id=129&page_forum=lastpage&allnum_forum=0#post369486  
Там все обобщено и убрано не нужное.
Excel. Настройки принтера. Двухсторонняя печать
 
Задача: Изменение настроек выбранного принтера Excel из VBA.  
 
Определимся с условными названиями:  
Принтер Windows  -  Принтера из Пуск -> Панель управления -> Принтеры  
Примнет Excel  -  Excel -> Файл -> Печать  
И там и там можно открыть свойства принтера. Но это не одно и тоже. Когда Excel открывается, он читает настройки принтера, выбранного по умолчанию в Windows, далее по тексту просто принтер Windows. Можно изменять свойства принтера Windows и его свойства будут прочитаны Excel-ом при открытии или выборе этого принтера в Excel. Если принтер в Excel уже выбран, то изменять свойства принтера Windows уже бес толку, так как Excel их уже получил, запомнил, и больше смотреть туда не будет до выбора другого принтера.  
 
Двухсторонняя печать и другие свойства принтера:  
Первое что надо вкурить - в Excel и вообще в Оффисе нет, не было и наверное не будет двухсторонней печати. Точно также как подобного свойства нет и в других программах, например в 1С или в простом блокноте. Да проще сказать где оно есть. Есть оно например в программе FinePrint. Кто юзал, тот поймет. А в других программах мы просто вызываем свойства принтера и выбираем там режим двухсторонней печати. То есть все это обрабатывает драйвер принтера, а не Excel. Excel просто отправляет документ на печать с настройками, которые уже получил и помнит.  
 
Что делать если ну очень хочется?  
Изменить свойства принтера по средствам вызова API функций из VBA, а затем отправить документ на печать. Тут стоит сразу отметить, что Excel и Word ведут себя по разному, но сейчас не об этом.  
 
Для окончательного усвоения материала, проделаем следующее:  
Забудем на время про VBA, API и вообще все что связано с программированием. Открываем принтер Windows (см. формулировку в начале статьи). Ставим там у принтера по умолчанию например свойство двухсторонней печати (далее по тексту Duplex). Открываем Excel. Смотрим свойства принтера Excel (Excel -> Файл -> Печать -> Свойства). Видим там что Duplex выставлен. Закрываем свойства принтера Excel, но не сам Excel. Открываем свойства принтера Windows и убираем Duplex. Опять открываем совйства принтера Excel, смотрим, а дуплекс то там остался, хоть мы и убрали его в принтере Windows.  
Что же это означает? А то, что после того, как Excel получил свойства принтера Windows, изменять их уже бес толку, потому что Excel помнит свою копию свойств.  
А теперь проделаем все наоборот. Изменим свойства принтера Excel и посмотрим отразились ли они на свойствах принтера Windows. А и не отобразились, но Excel продолжает их помнить. Ну а это означает, что изменение свойств принтера Excel никак не повлияет на свойства принтера Winows, и другие программы не увидят этих изменений, что мы сделали в Excel.  
 
Теперь подумаем что и когда надо менять:    
Правильнее будет предоставить изменять свойства принтера Windows только пользователю. Пусть он сам установит те первоначальные свойства принтеров, с какими он бы хотел видеть их в других программах. А вод свойства принтера Excel можно "гнуть" как угодно под каждую конкретную задачу.  
 
Ну а теперь грустный финал этой статьи. Увы это не урок, а простой вопрос. Есть пример VBA который легко, быстро, и надежно (ну у меня по крайней мере) меняет свойства принтера Windows. А нужно изменять свойства принтера Excel.  
 
Как нелепое решение могу предложить следующее:    
Меняем принтер Excel на какой нибудь другой. Изменяем свойства принтера Windows. Выбираем в Excel этот принтер. В момент выбора будут опять прочитаны его уже измененные свойства.  
Недостатки этого способа:  
1. Танцы со сменой принтеров требуют задержки и нагружают код нашей программы.  
2. Изменения сделанные кодом нашей программы влияют на все другие программы, т.к. мы изменяем общие свойства принтера. Можно конечно по завершению вернуть все обратно, но можно и забыть, или например прога завершиться не корректно, и возврат сделан не будет.  
 
В примере сразу смотрим модуль PrinterDuplex. Там внизу две процедуры теста. Получение и установка дуплекса.  
 
Что нужно:  
Добиться чтобы пример изменял не свойства принтера Windows, а свойства принтера Excel.  
 
Давайте сделаем это. Любые идеи, будем пробовать. Очень бы помогла консультация специалиста на тему печати в целом. Где и как хранятся свойства принтера на время жизни программы, которая отправляет документы на печать. Вот например тот же Блокнот тоже позволит открыть свойства принтера. Но там не будет кнопки "Применить". И все изменения будут сразу же забыты при закрытии диалога печати.
Двухсторонняя печать средствами VBA (Переключение дуплекса)
 
Обновил пример. Все комментарии в модуле PrinterDuplex. Пробуем, пишем любые идеи.
Двухсторонняя печать средствами VBA (Переключение дуплекса)
 
Юрий, ну даже зипом не сжать было меньше. Давайте лучше по теме, и не будем тут воду лить.  
Вот, постирал некоторое описание и пустые листы. Вы уж блесните знаниями по поставленному вопросу, чем файлы подрезать. Я бы с радостью почитал любые мысли и идеи.
Двухсторонняя печать средствами VBA (Переключение дуплекса)
 
Вы чего прикалывайтесь? 118 килобайт всего файл был.
Двухсторонняя печать средствами VBA (Переключение дуплекса)
 
Это переделанный первый пример. Убрано лишнее, добавлено интересное.  
 
Пример изменяет настройки драйвера принтера. И у него это отично получается. Но нужно изменять настройки текущего принтера в Ексел. Подробности в примере.  
<EM><STRONG>Файл удален</STRONG> - велик размер - [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>
Двухсторонняя печать средствами VBA (Переключение дуплекса)
 
Так у меня и получилось :)  
 
Проблема двухсторонней печати из Офиса активно обсуждается с 2007 года. Да может и ранее, не суть. Но до сих пор решения нет. А нет его потому, что Офис не работал и не работает с настройками принтера. То что мы можем переключить при подготовке документа на печать, это свойства драйвера принтера, а не настройки Офиса.    
 
Теперь нужно уловить один важный момент: Офис при открытии считывает настройки принтера по умолчанию. Структура DEVMODE.  
 
Скоро выложу примерчик по понятней, и будем разбираться.
Заменить отриц. значения на нули
 
y = (x+abs(x))/2  
 
при любом отрицательном x значение y = 0
Возможно ли определить размерность массива в VBA?
 
Ни разу не пришлось заморачиваться над определением мерности массива так сказать. Вот потребовалось. Полез искать волшебное слово, которое вернет мне количество измерений. А не тут то было.  
Спасибо участникам за предложенные варианты. Но от On Error у меня глаз нервенно дергается, а стиль Мерседеса без явной необходимости применять не хочется, хоть и дружу с Api.  
Пожалуй я обойду проблемку стороной.
Двухсторонняя печать средствами VBA (Переключение дуплекса)
 
Постараюсь изложить проблему не вдаваясь в ненужные детали.  
Я уже несколько лет пишу простенький софт на VBA для заполнения налоговых деклараций. Excel + VBA позволяют быстренько состряпать ново введенную форму, а сроки, это для меня главное.  
Идет много печати, и в процессе нужно отправлять одни задания с дуплексом, другие просто на одной стороне. У команды PrintOut нет параметров выбора дуплекса. Да и простого пути тут тоже нет. Сейчас пользуюсь прогой FinePrint. Отправляю печать на нее, а она может перенаправить на выбранный принтер с указанием флага дуплекса. Способ не полностью автоматизировал работу. Оператору нужно каждый раз выбирать, печатать с дуплексом или без.  
 
Вчера удалось найти еще одно временное решение. Добавил нововведение в программу. Все получилось. Дуплекс нормально работает. Были редкие несрабатывания, но задержка в одну секунду даже простым способом Application.Wait исправила положение.  
Что получилось найти:  
Есть два способа переключить дуплекс. Первый полностью на VBA, второй использует стороннюю dll библиотеку.  
У этих способов есть общий минус. Они меняют параметры принтера не в Excel, а общие (Пуск -> Принтеры). Это конечно неудобство, но можно мириться. Оба способа рабочие, но столкнулся с такой проблемой. Я не могу поменять дуплекс у принтера, если он выбран активным в Excel (2003). То есть поменять то я могу, и после запуска VBA дуплекс действительно переключится, и это можно увидеть открыв свойства принтера из проводника Windiws, но не из Excel. Нашел только следующее решение:  
- Делаем нужный принтер не активным (выбираем любой другой).  
- Переключаем дуплекс нужному принтеру  
- Выбираем его активным.  
Тогда настройки будут прочитаны. Способ тоже не очень, но он пока единственный.  
Я прикладываю примеры в файле, чтобы не раздувать тему тут.  
В примере есть еще разные модуля, думаю они будут интересны тем, кто изучает тему печати.  
Хотелось бы обсудить модуль PrinterDuplexVBA Function TestPrinter()  
Неплохо бы было изменять не общие настройки драйвера а только настройки активного принтера Excel, чтобы это не касалось других программ.  
 
Смотрите в моем файле модуль PrinterDuplexVBA. Там две функции. Это все что надо для работы.  
Функция TestPrinter запускает функцию SetPrinterDuplex.
Страницы: 1
Наверх