Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 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


Теперь вопрос.
Как проверить конфикурацию периферии?
Есть дискета или нет?
Есть флэш накопитель или нет?
И если есть, то какая буква ему присвоена?
Как всё это сделать ДО создания копии документа, а не обрабатывать как я в обработчике ошибок?

Спасибо за внимание!

Ответить

  Ответы Всего ответов: 14  

Номер ответа: 1
Автор ответа:
 fAndOrIn



Вопросов: 5
Ответов: 344
 Профиль | | #1 Добавлено: 01.02.09 15:45
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

Ответить

Номер ответа: 2
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #2 Добавлено: 01.02.09 15:57
А как это будет в коде процедуры?
Вот так?
  1.  
  2. Sub print()
  3. 'всё что было и в конце
  4. ActiveWorkbook.SaveAs Filename:="A:\" & год & "_" & nf1, FileFormat:=xlNormal, _
  5.         Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
  6.         CreateBackup:=False
  7. on error resume next
  8. chdrive "A:"
  9. if err then err.clear:chdrive "F:"
  10. if err then err.clear:chdrive "G:":if err then msgbox"Хотел бы сохранить, да некуда!":exit sub
  11. End sub


Или как то по другому...

Ответить

Номер ответа: 3
Автор ответа:
 fAndOrIn



Вопросов: 5
Ответов: 344
 Профиль | | #3 Добавлено: 01.02.09 16:03
Наверно как то так -
  1. Sub print()
  2. on error resume next
  3. chdrive "A:"
  4. if err then err.clear:chdrive "F:"
  5. if err then err.clear:chdrive "G:":if err then msgbox"Хотел бы сохранить, да некуда!":exit sub
  6. ActiveWorkbook.SaveAs "год & "_" & nf1 <br>
  7. 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 'чтобы не спрашивал сохранение


Спасибо за помощь!

Ответить

Номер ответа: 6
Автор ответа:
 fAndOrIn



Вопросов: 5
Ответов: 344
 Профиль | | #6 Добавлено: 02.02.09 06:55
И еще, если ничего не напутал, то к mydrive при сохранении стоит добавить "\", чтобы сохранить в корень диска, а не в какой-то там CurDir, который потом полдня проищешь!

Ответить

Номер ответа: 7
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #7 Добавлено: 02.02.09 14:24
  1.  
  2. ActiveWorkbook.SaveAs Filename:=mydrive & "\"  & год & "_" & nf1,


Вот так?

Ответить

Номер ответа: 8
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #8 Добавлено: 02.02.09 14:50
Теперь возник второй вопрос...
При открытии файла базы данных появляется форма с ListBox - в которой предлагается выбрать год отчёта.
Я изменил макрос в файле за определённый год. (например за 2006)
Естественно, при создании файла за 2009 год - макрос остаётся прежним...
Я понимаю, что надо найти шаблон, в котором переписать макрос, но не знаю как это сделать.
Вообще - существуют два файла: БАЗА.XLT и НАШАБАЗА.XLS
Я так понимаю - БАЗА.XLT - это шаблон. Но внём только шаблон таблиц отчёта, и никаких макросов...
НАШАБАЗА.XLS - запускает форму с выбором года отчёта. В нём 3 модуля с макросами. Один из них - тот, что подвергался переделке. Изменения макроса в этом файле не влияют на вновь создаваемые книги.
Если не найду, где переписать макрос, придётся каждый год копировать макрос из прежних книг, а это по меньшей мере - глупо.
Помогите, чем можете... Может разберусь...

Ответить

Номер ответа: 9
Автор ответа:
 fAndOrIn



Вопросов: 5
Ответов: 344
 Профиль | | #9 Добавлено: 02.02.09 17:58
Не совсем въезжаю в суть проблемы...
Этот програмный "комплекс" предназначен для того, чтобы выдать пустые бланки отчета за указанный год? Или есть формы для заполнения этих бланков? Или в "НАШАБАЗА.XLS" (или еще где-то) в течении года ведутся какие-то таблицы с данными, на основании которых строится отчет? Или что-то еще упустил???

Ответить

Номер ответа: 10
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #10 Добавлено: 03.02.09 00:26
Спасибо за участие!
С проблемой разобрался совершенно неожиданным способом.... Прочитал "руководство пользователя".
там написано:
Начало работы с программой.
При каждом запуске программы появляется окно Microsoft Excel с вопросом – отключать или нет макросы. При первом запуске нажмите кнопку «Отключить макросы». В этом случае Вы войдете в шаблон не привязанный к году отчета.( Это полезно сделать для того, чтобы занести в таблицы редко изменяемые данные.)

Я так и сделал. (сначала перенёс файлы в другое место). Только изменил не таблицы, а макрос...
И всё сработало как надо!
Но я так и не понял, как работает этот "комплекс". Я его не писал...
Всётаки отвечу на Ваш вопрос.
Этот програмный "комплекс" предназначен для того, чтобы заполнить таблицы данными за конкретный год.
Затем надо эти заполненные таблицы отправить начальству в виде файла на дискете.
Для этого есть кнопка - кликаешь, и нужный файл пишется на дискету.
На следующий год при открытии файла в ListBox выбираешь следующий год - и заполняешь таблицы, а затем кликаешь по кнопке и отправляешь файл на дискете высокому начальству.

Не судите строго. Проблема решена. Спасибо за помощь!

Дмитрий

Ответить

Номер ответа: 11
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #11 Добавлено: 03.02.09 00:38
Писать программу, которая будет раз в год запускаться - жесть

Ответить

Номер ответа: 12
Автор ответа:
 fAndOrIn



Вопросов: 5
Ответов: 344
 Профиль | | #12 Добавлено: 03.02.09 06:30
Оказывается, иногда полезно читать "руководство пользователя".

Ответить

Номер ответа: 13
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #13
Добавлено: 03.02.09 13:08
Steel Brand, а ты разве не знал, что в vba свыше 90% макросов одноразовые? иногда простой макрос с циклом и парой условий заменяет день-два рутинной работы какого-нибудь бухгалтера, нифига не понимающего в excel. это не прикол - это грустная реальность.

Ответить

Номер ответа: 14
Автор ответа:
 VβÐ



Вопросов: 15
Ответов: 194
 Web-сайт: www.homacosoft.com
 Профиль | | #14
Добавлено: 09.02.09 16:19
Steel Brand, а ты разве не знал...

:)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам