Страница: 1 |
|
Вопрос: проверить наличие дискеты или флэш перед печатью
|
Добавлено: 01.02.09 15:17
|
|
Автор вопроса: DimDoc
|
Доброго Всем Времени суток!
Департамент прислал шаблон Excel для заполнения годового отчёта о работе. После окончания работы с документом требуется нажать на кнопку "Запись данных для .... ".
Выполняется макрос, в процедуре которого создаётся копия документа и затем файл копируется на дискету. Мой начальник доволен, Но...
постоянно забывает вставить дискету, или у него дискеты просто нет.
На днях пытался записать файл на флэшку. Жмёт на кнопку, а ему аварийное сообщение и завершение работы приложения. Тогда он скопировал ЯРЛЫК, запускающий файл... И был очень доволен.
Я решил переписать макрос так, чтобы при отсутствии дискеты в дисководе А:\ файл перенаправлялся на F:\.
Но позже сильно удивился, что при наличии флэшки - запись файла не произошла. Оказалось, что флэшка определилась системой в G:\ порту (при отсутствии чего либо в F:\).
Тогда переписал так:
нет дискеты в A:\ - писать в F:\
нет флэшки в F:\ - писать в G:\
нет в G:\ - предупредить и остановить запись.
Вот как было:
sub запись ()
'тело макроса. и в конце:
ActiveWorkbook.SaveAs Filename:="A:\" & год & "_" & nf1, FileFormat:=xlNormal, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False
End sub
Вот так стало:
Sub Запись()
On Error GoTo err_disc
Dim no_disc_A As Boolean
Dim no_flash_f As Boolean
'тело макроса
'здесь изенения
ActiveWorkbook.SaveAs Filename:="A:\" & год & "_" & nf1, FileFormat:=xlNormal, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False
flash_F:
ActiveWorkbook.SaveAs Filename:="F:\" & год & "_" & nf1, FileFormat:=xlNormal, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False
Exit Sub
flash_G:
ActiveWorkbook.SaveAs Filename:="G:\" & год & "_" & nf1, FileFormat:=xlNormal, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False
Exit Sub
err_disc:
Dim info As String
Select Case Err.Number
Case 1004
If no_disc_A = False Then
no_disc_A = True
info = "Нет дискеты в дисководе A:\" & vbCrLf
info = info & vbCrLf & "Пробую записать на Флэш карту..."
MsgBox info, vbInformation, "Внимание!"
Resume flash_F
Else
If no_flash_f = False Then
no_flash_f = True
Resume flash_G
Else
info = "Флэш карта не обнаружена! Запись файла будет прервана." & vbCrLf
info = info & vbCrLf & "вставьте дискету или флэш карту..." & vbCrLf
info = info & vbCrLf & " ...и повторите попытку!"
MsgBox info, vbInformation, "Внимание!"
Resume err_end_sub
End If
End If
End Select
MsgBox Err.Description
Resume err_end_sub
err_end_sub:
Exit Sub
End Sub
Теперь вопрос.
Как проверить конфикурацию периферии?
Есть дискета или нет?
Есть флэш накопитель или нет?
И если есть, то какая буква ему присвоена?
Как всё это сделать ДО создания копии документа, а не обрабатывать как я в обработчике ошибок?
Спасибо за внимание!
Ответить
|
Номер ответа: 2 Автор ответа: DimDoc
Вопросов: 21 Ответов: 104
|
Профиль | | #2
|
Добавлено: 01.02.09 15:57
|
А как это будет в коде процедуры?
Вот так?
-
- Sub print()
- ActiveWorkbook.SaveAs Filename:="A:\" & год & "_" & nf1, FileFormat:=xlNormal, _
- Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
- CreateBackup:=False
- on error resume next
- chdrive "A:"
- if err then err.clear:chdrive "F:"
- if err then err.clear:chdrive "G:":if err then msgbox"Хотел бы сохранить, да некуда!":exit sub
- End sub
Или как то по другому...
Ответить
|
Номер ответа: 4 Автор ответа: DimDoc
Вопросов: 21 Ответов: 104
|
Профиль | | #4
|
Добавлено: 01.02.09 16:06
|
Спасибо. Вечером попробую...
Ответить
|
Номер ответа: 5 Автор ответа: DimDoc
Вопросов: 21 Ответов: 104
|
Профиль | | #5
|
Добавлено: 02.02.09 01:53
|
окончательно получилось так:
Sub print()
Dim mydrive As String
mydrive = "A:"
On Error Resume Next
ChDrive mydrive
If Err Then Err.Clear: ChDrive "F:": mydrive = "F:"
If Err Then Err.Clear: ChDrive "G:": mydrive = "G:": If Err Then MsgBox "Хотел бы сохранить, да некуда!", vbInformation: mydrive = "": Exit Sub
'здесь тело макроса
'
ActiveWorkbook.SaveAs Filename:=mydrive & год & "_" & nf1, FileFormat:=xlNormal, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False
ActiveWorkbook.Close savechanges:=False 'чтобы не спрашивал сохранение
Спасибо за помощь!
Ответить
|
Номер ответа: 7 Автор ответа: DimDoc
Вопросов: 21 Ответов: 104
|
Профиль | | #7
|
Добавлено: 02.02.09 14:24
|
-
- ActiveWorkbook.SaveAs Filename:=mydrive & "\" & год & "_" & nf1,
Вот так?
Ответить
|
Номер ответа: 8 Автор ответа: DimDoc
Вопросов: 21 Ответов: 104
|
Профиль | | #8
|
Добавлено: 02.02.09 14:50
|
Теперь возник второй вопрос...
При открытии файла базы данных появляется форма с ListBox - в которой предлагается выбрать год отчёта.
Я изменил макрос в файле за определённый год. (например за 2006)
Естественно, при создании файла за 2009 год - макрос остаётся прежним...
Я понимаю, что надо найти шаблон, в котором переписать макрос, но не знаю как это сделать.
Вообще - существуют два файла: БАЗА.XLT и НАШАБАЗА.XLS
Я так понимаю - БАЗА.XLT - это шаблон. Но внём только шаблон таблиц отчёта, и никаких макросов...
НАШАБАЗА.XLS - запускает форму с выбором года отчёта. В нём 3 модуля с макросами. Один из них - тот, что подвергался переделке. Изменения макроса в этом файле не влияют на вновь создаваемые книги.
Если не найду, где переписать макрос, придётся каждый год копировать макрос из прежних книг, а это по меньшей мере - глупо.
Помогите, чем можете... Может разберусь...
Ответить
|
Номер ответа: 10 Автор ответа: DimDoc
Вопросов: 21 Ответов: 104
|
Профиль | | #10
|
Добавлено: 03.02.09 00:26
|
Спасибо за участие!
С проблемой разобрался совершенно неожиданным способом.... Прочитал "руководство пользователя".
там написано:
Начало работы с программой.
При каждом запуске программы появляется окно Microsoft Excel с вопросом – отключать или нет макросы. При первом запуске нажмите кнопку «Отключить макросы». В этом случае Вы войдете в шаблон не привязанный к году отчета.( Это полезно сделать для того, чтобы занести в таблицы редко изменяемые данные.)
Я так и сделал. (сначала перенёс файлы в другое место). Только изменил не таблицы, а макрос...
И всё сработало как надо!
Но я так и не понял, как работает этот "комплекс". Я его не писал...
Всётаки отвечу на Ваш вопрос.
Этот програмный "комплекс" предназначен для того, чтобы заполнить таблицы данными за конкретный год.
Затем надо эти заполненные таблицы отправить начальству в виде файла на дискете.
Для этого есть кнопка - кликаешь, и нужный файл пишется на дискету.
На следующий год при открытии файла в ListBox выбираешь следующий год - и заполняешь таблицы, а затем кликаешь по кнопке и отправляешь файл на дискете высокому начальству.
Не судите строго. Проблема решена. Спасибо за помощь!
Дмитрий
Ответить
|
Страница: 1 |
Поиск по форуму