Страница: 1 | 2 |
Вопрос: Корректный доступ к файлу
Добавлено: 18.06.08 16:38
Автор вопроса: Дмитрий | ICQ: 421607787
Ответы
Всего ответов: 28
Номер ответа: 16
Автор ответа:
Дмитрий
ICQ: 421607787
Вопросов: 1
Ответов: 13
Профиль | | #16
Добавлено: 20.06.08 14:23
Application.SendKeys добавляет мне в код "2" (значение соответствующее константе vbCancel
А если перед строкой с открытием файла добавить
SendKeys vbCancel, False
то по прежнему выдается окно с запросом "Ок" "Отмена"
Номер ответа: 17
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #17
Добавлено: 23.06.08 11:53
Это как ?
А если так попробовать
Номер ответа: 18
Автор ответа:
Дмитрий
ICQ: 421607787
Вопросов: 1
Ответов: 13
Профиль | | #18
Добавлено: 24.06.08 09:35
Вот, прямо в редакторе VB, в программу, перед следующей строчкой и добавляет Я первый раз такое вижу...
SendKeys "{ESC}", False
? Еще мне кажется нужно после открытия файла ставить. Ты же в нем хочешь отмену нажимать.
Пробовал и "до" и "после" - неполучается, хотя в книжке написано, что должно быть "до", что бы в буфере уже было, когда поступит запрос.
Да я бы уже и так согласен, но тут выяснилось, что если файл на момент обращения уже кем-то открыт, и потом он закрывается без изменения(без сохранения), то все нормально, выдается эапрос, нажимаем отмена пока файл не закроется... А если файл закрывается(тоже макросом) с изменениями(с сохранением), то к нему добавляется несколько символов и расширение становится ТМР... И это без всяких запросов!!!
И еще, как бы сделать, что бы во время работы макроса, при нажатии на клавишу "ESC", он не останавливался
Номер ответа: 19
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #19
Добавлено: 24.06.08 10:38
1.
False - не сохранять изменения, True - сохранять. Может это поможет ?
2. Попробуй DoEvents. Он вроде опрашивает, кому что в данный момент нужно.
Номер ответа: 20
Автор ответа:
Дмитрий
ICQ: 421607787
Вопросов: 1
Ответов: 13
Профиль | | #20
Добавлено: 24.06.08 14:01
DoEvents Передает управление операционной системе для обработки других событий. http://www.vbnet.ru/vbguide/showfunction.asp?id=82
Вобщем это несколько про другое
SendKeys посылает один или несколько кодов символов в текущее активное окно
Получается, что сначала активного окна нет, символы непонятно куда посылаются... а потом открывается диалоговое окно...
Блин, и в книжках примеров нет
Поясню общую задачу
Есть несколько различных программ в Еxcel. В каждой программе, после внесения данных в форму, запускается макрос, который выполняет необходимые операции и в конце отчет об этих операциях заносит в общий лог-файл. Лог этот тоже Еxcel'евский. Если бы файл был txt, было бы проще, но мне нужен Еxcel, потому что я использую этот файл не только как для лога(визуально), но и для обработки и анализа данных(тоже макросами). В файле Еxcel это очень удобно делать.
Т. е. в каждой программе идет вызов подпрограммы "ОткрытиеЛога"целиком она в 14м посте) и если управление вернулось в основную программу, то лог открылся нормально. После заносятся данные в лог и файл сохраняется ActiveWindow.Close (True)
Вобщем пока постарался сделать что-бы как можно быстрее происходило открытие-запись-закрытие лога... но все равно это не выход, хотелось бы по нормальному сделать
Номер ответа: 21
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #21
Добавлено: 24.06.08 15:22
Еще такое нашла. Можно попробовать.
Workbooks.Open Filename:=":\New Microsoft Excel Worksheet.xls"
If Application.ActiveWorkbook.ReadOnly Then
a = 1 'файл занят
Else
a = 0 'файл свободен
End If
Debug.Print a
ActiveWorkbook.Close SaveChanges:=False
Loop While a = 1
Повторять Если занят подождать N времени и попробовать записать. Если файл свободен, то записать.
Номер ответа: 22
Автор ответа:
Дмитрий
ICQ: 421607787
Вопросов: 1
Ответов: 13
Профиль | | #22
Добавлено: 24.06.08 17:29
Еще раз Ура!
Sub ОткрытиеЛога()
 o
Workbooks.Open "\\Zed\str\Лог.xls"
If Application.ActiveWorkbook.ReadOnly Then
ActiveWindow.Close (False)
Else
Exit Sub
End If
Loop
End Sub
Вот в таком виде чудесно работает, проверил и так и так...
Jasmin, спасибо еще раз
Ну и для полного счастья, как бы сделать, что бы во время работы макроса он при нажатии на клавишу "ЕSC" не останавливался?
А то получается, что файл закрыт паролем, а в тот момент когда он открылся макросом и в него заносятся данные, можно прервать выполнение макроса, подредактировать лог... и дальше продолжить выполнение...
Номер ответа: 23
Автор ответа:
Дмитрий
ICQ: 421607787
Вопросов: 1
Ответов: 13
Профиль | | #23
Добавлено: 24.06.08 18:24
p.s. Что интересно, LonerWanderer, еще в начале предложил именно этот четкий и правильный алгоритм
Открываешь книгу, делаешь ее visible=false, проверяешь в каком режиме открыта и если read-only, то закрываешь ее, а если в полном доступе, то делаешь ее видимой.
а код дал совсем другой...
Номер ответа: 24
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #24
Добавлено: 25.06.08 07:08
Сорри, видимо сначала до меня не дошло, что нужно.
Можно отловить нажатие клавиши ESC или CTRL + BREAK:
Application.EnableCancelKey = xlErrorHandler
'Здесь должен быть код Вашей программы.
CancelHandler:
Application.EnableCancelKey = xlInterrupt
If Err.Number = 18 Then _
MsgBox "Вы нажали кнопку ESC или CTRL + BREAK"
Можно заблокировать вообще клаву и мышку, сохранив при этом возможность использования диалоговых окон:
'Здесь должен быть код Вашей программы.
Application.Interactive = True
Номер ответа: 25
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #25
Добавлено: 25.06.08 07:10
Еще можно запретить прерывание выполнения макроса:
'Здесь должен быть код Вашей программы.
Application.EnableCancelKey = xlInterrupt
Номер ответа: 26
Автор ответа:
LonerWanderer
Вопросов: 18
Ответов: 66
Профиль | | #26
Добавлено: 25.06.08 09:05
Я сначала предложил алгоритм, а потом вспомнил, что нечто подобное делал у себя.
Вот свой код и выложил.
Там идет проверка не на рид-онли, а на ошибку при сохранении файла, т.к. может быть недоступен сетевой ресурс, в котором должна сохраняться книга.
Так что код 100% рабочий.
Ну алгоритму, правда, не очень соответствует.
Номер ответа: 27
Автор ответа:
Дмитрий
ICQ: 421607787
Вопросов: 1
Ответов: 13
Профиль | | #27
Добавлено: 25.06.08 10:22
Да, вот это то что нужно!
Всем Спасибо!
Номер ответа: 28
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #28
Добавлено: 25.06.08 10:38
Удачи!