Страница: 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 | 
 
		
			Поиск по форуму