Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 12.01.2009, 09:22   #1
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию О форматировании листов для печати!

Уважаемые господа!

При отработке программы в VBA используеться форматирование листов под формат A3 следующий образом
PHP код:
With ActiveSheet.PageSetup
    
.PaperSize xlPaperA3
    
.FirstPageNumber xlAutomatic
    
.Order xlDownThenOver
    
.Zoom 92
End With 
На моем компьютере (подключенном к лазерному принтеру Kyocera имеющий формат A3) работает, но когда я перенес таблицу на другой компьютер (сервер обработки данных) подключенный к HP1022 проявился сбой, который связан с отсутствием у него данного формата. Включение обработчика ошибки привело к необходимости для всех кто пользуеться расчитанной таблицей проводить ее форматирование (каждого из 17 листов), что не очень удобно.
Вопрос. что сделать для выполнения данного форматирования на любом компе который не имеет данного формата листа
Юнлинг вне форума
Старый 13.01.2009, 19:50   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Попробуйте так:

Код:
Sub test()
    With ActiveSheet.PageSetup
        .PaperSize = GetPaperSize
        .Zoom = 92
    End With
End Sub

Function GetPaperSize() As Integer
    GetPaperSize = xlPaperA4 ' по умолчанию формат А4
    If InStr(1, Application.ActivePrinter, "Kyocera", vbTextCompare) > 0 Then GetPaperSize = xlPaperA3
End Function
Макрос выставит листу формат А3 только в том случае, если активным принтером является Kyocera.
EducatedFool вне форума
Старый 14.01.2009, 08:46   #3
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Попробуйте так:

Код:
Sub test()
    With ActiveSheet.PageSetup
        .PaperSize = GetPaperSize
        .Zoom = 92
    End With
End Sub

Function GetPaperSize() As Integer
    GetPaperSize = xlPaperA4 ' по умолчанию формат А4
    If InStr(1, Application.ActivePrinter, "Kyocera", vbTextCompare) > 0 Then GetPaperSize = xlPaperA3
End Function
Макрос выставит листу формат А3 только в том случае, если активным принтером является Kyocera.
Уважаемый EducatedFool!
ваше предложение действительно срабатывает, только есть одно маленькое, но макрос у меня работает на "сервере" и по окончанию работы макрос удаляеться, а расчитанная таблица сохраняеться в другом месте.
По этой причине и возник этот вопрос
Я попробовал использовать для формирования страницы квазипринтер Microsoft Office Document. все вроде получаеться, но есть маленький нюанс, который я по своей тупости не могу сделать, а именно макросом активизировать вышеназванный принтер, а по окончанию выполнения вернуть активность к принтеру HP1022.
Хочу отметить что необходимо именно сделать активиным принтер Microsoft а не просто передать управление из следующих соображений.
Среднее время выполнения макроса составляет от 30 минут до 3 часов (зависит от количества записей во внешней базе время обработки одного строчки таблицы составляет 4 секунды - количество строчек колеблется в разных листах от 6 до 150) а время востановления активности принетера для Excel составляет около 15 минут.
Юнлинг вне форума
Старый 14.01.2009, 15:47   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
макросом активизировать вышеназванный принтер, а по окончанию выполнения вернуть активность к принтеру HP1022
Делается примерно так:
Код:
Sub Макрос1()
    Application.ActivePrinter = "Microsoft Office Document Image Writer (Ne00:)"
    ' здесь пишем код
    Application.ActivePrinter = "Kyocera Mita DP-2800Plus (LPT1:)"
End Sub
Включите макрорекордер, нажмите Файл - Печать, смените принтер, нажмите Отмена в окне печати.
Макрорекордер как раз и запишет команду смены активного принтера.

Цитата:
Среднее время выполнения макроса составляет от 30 минут до 3 часов (зависит от количества записей во внешней базе время обработки одного строчки таблицы составляет 4 секунды - количество строчек колеблется в разных листах от 6 до 150)
Что-то тут не то... особенно удивляет значение 4 секунды на одну строку

Вообще-то, результат выполнения запроса к БД обычно возвращает сразу много записей. Получается, уже на обработку записи Excel-ем тратится так много времени?

Вообще, если тормоза не на стороне базы данных, то проблема явно в макросе.
Бывает, немного неправильно написанный цикл (в то же время вполне работоспособный) 200 - 500 строк отрабатывает моментально, а потом начинает жутко тормозить. (с каждой новой строкой скорость существенно снижается, что увеличивает в сотни раз время выполнения)

Прикрепите к сообщению файл с макросом - посмотрим, может, проблема в нём.
Если проблема не в базе данных, вполне реально сократить время выполнения макроса до нескольких секунд.

Цитата:
На моем компьютере (подключенном к лазерному принтеру Kyocera имеющий формат A3) работает, но когда я перенес таблицу на другой компьютер (сервер обработки данных) подключенный к HP1022 проявился сбой, который связан с отсутствием у него данного формата.
А что, собственно, мешает установить этот принтер на сервере?
(имеется в виду не непосредственное подключение принтера к серверу, а только установка драйверов)

Вот у меня нет принтера Kyocera Mita DP-2800Plus, однако на установку его в системе потребовалась 1 минута.
И теперь мой комп уверен, что такой принтер к нему подключен (хотя у меня даже LPT-порта нет...)

Выберите установку локального принтера (без автоматического поиска таковых), выберите из списка доступных принтеров любой, какой Вам понравится (чтобы только он поддерживал нужный формат), и нажмите Установить.
Я не раз так делал, когда требовалось подготовить рисунки формата A2 в CorelDRAW с учётом параметров типографских принтеров.

Чем не решение проблемы?

Последний раз редактировалось EducatedFool; 14.01.2009 в 15:59.
EducatedFool вне форума
Старый 14.01.2009, 17:24   #5
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Делается примерно так:
Код:
Sub Макрос1()
    Application.ActivePrinter = "Microsoft Office Document Image Writer (Ne00:)"
    ' здесь пишем код
    Application.ActivePrinter = "Kyocera Mita DP-2800Plus (LPT1:)"
End Sub
Попробую

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Включите макрорекордер, нажмите Файл - Печать, смените принтер, нажмите Отмена в окне печати.
Макрорекордер как раз и запишет команду смены активного принтера.
Меняет ОС (точнее настройка) а не Excel. именно по этой причине смена принтера через макрорекордер не спасает. Хотя если менять во время форматирования листа это идея.

Цитата:
Сообщение от EducatedFool Посмотреть сообщение

Что-то тут не то... особенно удивляет значение 4 секунды на одну строку .....
Если проблема не в базе данных, вполне реально сократить время выполнения макроса до нескольких секунд.
Проблема именно в базе на формирование одной строки обрабатывается от 500 до 15000 записей БД. Можно было бы быстрее если бы это была база MS SQL (тогда бы сделал процедуру обработки на SQL), а то БД Access а я его практически не знаю и никогда не работал.

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
А что, собственно, мешает установить этот принтер на сервере?
(имеется в виду не непосредственное подключение принтера к серверу, а только установка драйверов)...

Чем не решение проблемы?
Не думал, хотя это может быть выход.

P.S. принесли прогу автоматической замены активного принтера. Завтра буду пробовать.

P.P.S. нашел программную петлю (маловероятных событий ~ 1 событие в год). Время сократил до 1 секунды. Если все это не поможет вышлю макрос, или попрошу октлючить сетевой диск на котором находиться CMD.exe. На локальном компьтере время составления общего отчета меньше 15 минут. прога будет успевать обработать все листы прежде чем измениться активность принтера
Юнлинг вне форума
Старый 16.01.2009, 16:10   #6
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Что-то тут не то... особенно удивляет значение 4 секунды на одну строку
Отключили адиминстраторы на сервере сетевой диск с cmd.exe
Общее время расчета сократилось почти в 8 раз. Но ваше
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Делается примерно так:
Код:
Sub Макрос1()
    Application.ActivePrinter = "Microsoft Office Document Image Writer (Ne00:)"
    ' здесь пишем код
    Application.ActivePrinter = "Kyocera Mita DP-2800Plus (LPT1:)"
End Sub
очень помогло в другом макросе

Тема закрыта.
Юнлинг вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнить 2 отрицательных значения в "Условном Форматировании" olimpus Microsoft Office Excel 2 28.10.2008 07:09
Макрос для сохранения листов в отдельных файлах Neo007 Microsoft Office Excel 2 22.10.2008 18:16
Cравнения 2 листов anju Microsoft Office Excel 8 08.09.2008 14:46
выделение листов по условию Bronyk Microsoft Office Excel 5 11.03.2008 19:40
печать нескольких листов checkbox Microsoft Office Excel 2 16.01.2008 00:50