Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 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
Application.SendKeys добавляет мне в код "2"

Это как ?

А если так попробовать
SendKeys "{ESC}", False
? Еще мне кажется нужно после открытия файла ставить. Ты же в нем хочешь отмену нажимать.

Ответить

Номер ответа: 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.
Workbooks("BOOK1.XLS";).Close SaveChanges:=False


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 посылает один или несколько кодов символов в текущее активное окно
Получается, что сначала активного окна нет, символы непонятно куда посылаются... а потом открывается диалоговое окно...
Блин, и в книжках примеров нет



False - не сохранять изменения, True - сохранять. Может это поможет ?

Поясню общую задачу
Есть несколько различных программ в Еxcel. В каждой программе, после внесения данных в форму, запускается макрос, который выполняет необходимые операции и в конце отчет об этих операциях заносит в общий лог-файл. Лог этот тоже Еxcel'евский. Если бы файл был txt, было бы проще, но мне нужен Еxcel, потому что я использую этот файл не только как для лога(визуально), но и для обработки и анализа данных(тоже макросами). В файле Еxcel это очень удобно делать.
Т. е. в каждой программе идет вызов подпрограммы "ОткрытиеЛога";(целиком она в 14м посте) и если управление вернулось в основную программу, то лог открылся нормально. После заносятся данные в лог и файл сохраняется ActiveWindow.Close (True)

Вобщем пока постарался сделать что-бы как можно быстрее происходило открытие-запись-закрытие лога... но все равно это не выход, хотелось бы по нормальному сделать

Ответить

Номер ответа: 21
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #21 Добавлено: 24.06.08 15:22
Еще такое нашла. Можно попробовать.
Do
  Workbooks.Open Filename:=";D:\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 ОткрытиеЛога()
    ;Do
        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:
On Error GoTo CancelHandler
Application.EnableCancelKey = xlErrorHandler
'Здесь должен быть код Вашей программы.
CancelHandler:
Application.EnableCancelKey = xlInterrupt
If Err.Number = 18 Then _
   MsgBox "Вы нажали кнопку ESC или CTRL + BREAK"

Можно заблокировать вообще клаву и мышку, сохранив при этом возможность использования диалоговых окон:
Application.Interactive = False
'Здесь должен быть код Вашей программы.
Application.Interactive = True

Ответить

Номер ответа: 25
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #25 Добавлено: 25.06.08 07:10
Еще можно запретить прерывание выполнения макроса:
Application.EnableCancelKey = xlDisabled
'Здесь должен быть код Вашей программы.
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
Удачи!

Ответить

Страница: 1 | 2 |

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



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