Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Перехват диалоговых окон кодом - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Перехват диалоговых окон кодом (Макросы/Sub)
Перехват диалоговых окон кодом
AlexMen Дата: Пятница, 11.03.2016, 23:16 | Сообщение № 21
Группа: Заблокированные
Ранг: Участник
Сообщений: 66
Репутация: 4 ±
Замечаний: 100% ±

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


lebensvoll отпишите на почту, а то меня _Boroda_ забанил, я Вам функцию сброшу
 
Ответить
Сообщениея хочу не просто закрыть окно и использовать это в если.... принципе можно в код вписать переключатель, один макрос его при появление включает другой выключает
но как то все это безумно громоздко
-постоянно работающий макрос вносит свои неудобства. а выключить его не закрывая файл пока не получается. хотя можно попробовать тот же выключатель для этого нарисовать.

Автор - AlexMen
Дата добавления - 11.03.2016 в 23:16
Gustav Дата: Пятница, 11.03.2016, 23:25 | Сообщение № 22
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2697
Репутация: 1123 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
AlexMen, а ваш макрос нельзя запускать, скажем, по ночам, когда больше с рабочей книгой никто не работает?

но как то все это безумно громоздко

Я больше скажу: все эти манипуляции с AppActivate и SendKeys еще и недостаточно надёжны и, строго говоря, не совсем безопасны. То, что во время такой обработки лучше не работать вручную с клавиатуры и не держать других открытых приложений, кроме двух необходимых - это к гадалке не ходи!


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеAlexMen, а ваш макрос нельзя запускать, скажем, по ночам, когда больше с рабочей книгой никто не работает?

но как то все это безумно громоздко

Я больше скажу: все эти манипуляции с AppActivate и SendKeys еще и недостаточно надёжны и, строго говоря, не совсем безопасны. То, что во время такой обработки лучше не работать вручную с клавиатуры и не держать других открытых приложений, кроме двух необходимых - это к гадалке не ходи!

Автор - Gustav
Дата добавления - 11.03.2016 в 23:25
StoTisteg Дата: Суббота, 12.03.2016, 00:17 | Сообщение № 23
Группа: Авторы
Ранг: Старожил
Сообщений: 1161
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
не держать других открытых приложений

yes Куда при таких условиях передаст управление ВНЕЗАПНО созданный новый экземпляр Excel.Application — только чертям ведомо...


Интуитивно понятный код - это когда интуитивно понятно, что это код.
 
Ответить
Сообщение
не держать других открытых приложений

yes Куда при таких условиях передаст управление ВНЕЗАПНО созданный новый экземпляр Excel.Application — только чертям ведомо...

Автор - StoTisteg
Дата добавления - 12.03.2016 в 00:17
AlexMen Дата: Суббота, 12.03.2016, 00:37 | Сообщение № 24
Группа: Заблокированные
Ранг: Участник
Сообщений: 66
Репутация: 4 ±
Замечаний: 100% ±

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


lebensvoll отпишите на почту, а то меня _Boroda_ забанил, я Вам функцию сброшу
 
Ответить
Сообщениевот поэтому и хочу эту процедуру воткнуть в модуль что бы вызывался ток когда есть шанс возникновения.... после внесения данных, запускается, сохраняет данные если окно , то его отрубает, заново заносит массив, если удачно процесс убивается.
Вопрос уже не критичный, чисто для себя хочу докопаться до истинны.

Автор - AlexMen
Дата добавления - 12.03.2016 в 00:37
Manyasha Дата: Суббота, 12.03.2016, 17:12 | Сообщение № 25
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
вписать переключатель

Просто код из workbook open и before close в разные макросы вынести.
Больше ничего не требуется.
достаточно = Nothing

Не внимательно читали, Set objExl = Nothing просто память освобождает. Можно добавить в код, т.к. переменная objExl - глобальная и не убивается после завершения макроса, но само приложение Экселя от этого не закроется.
Смотрите пример.
К сообщению приложен файл: 6861300.rar (27.2 Kb)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
Сообщение
вписать переключатель

Просто код из workbook open и before close в разные макросы вынести.
Больше ничего не требуется.
достаточно = Nothing

Не внимательно читали, Set objExl = Nothing просто память освобождает. Можно добавить в код, т.к. переменная objExl - глобальная и не убивается после завершения макроса, но само приложение Экселя от этого не закроется.
Смотрите пример.

Автор - Manyasha
Дата добавления - 12.03.2016 в 17:12
Gustav Дата: Воскресенье, 13.03.2016, 01:00 | Сообщение № 26
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2697
Репутация: 1123 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
Уф! По мотивам всех идей данного обсуждения родилась процедура, которая, возможно, порадует AlexMen

[vba]
Код
Sub saveCommonBook()
    
    Dim xlApp As Excel.Application
    Dim vb As String
    Dim status As String
        
    vb = vb & vbCrLf & "Sub checkWindows()"
    vb = vb & vbCrLf & "On Error Resume Next"
    vb = vb & vbCrLf & ""
    vb = vb & vbCrLf & "'ищется окно о конфликте доступа"
    vb = vb & vbCrLf & "AppActivate ""Возник конфликт доступа"""
    vb = vb & vbCrLf & "If Err Then"
    vb = vb & vbCrLf & "Err.Clear"
    vb = vb & vbCrLf & "Else"
    vb = vb & vbCrLf & "Worksheets(1).Range(""A1"").Value = ""Конфликт обработан"""
    vb = vb & vbCrLf & "SendKeys ""{TAB 3}{ENTER}"" 'нажимается Enter после 3-х Tab'ов в диалоговом окне"
    vb = vb & vbCrLf & "End If"
    vb = vb & vbCrLf & ""
    vb = vb & vbCrLf & "'ищется окно с сообщением ""Книга обновлена с учетом изменений, внесенных другими пользователями"""
    vb = vb & vbCrLf & "AppActivate ""Microsoft Excel"""
    vb = vb & vbCrLf & "If Err Then"
    vb = vb & vbCrLf & "Err.Clear"
    vb = vb & vbCrLf & "Else"
    vb = vb & vbCrLf & "SendKeys ""{ENTER}"" 'нажимается ОК"
    vb = vb & vbCrLf & "End If"
    vb = vb & vbCrLf & ""
    vb = vb & vbCrLf & "If Worksheets(1).Range(""A3"").Value = ""stop"" Then"
    vb = vb & vbCrLf & "Application.OnTime Worksheets(1).Range(""A2"").Value, ""checkWindows"", , False 'останавливаем"
    vb = vb & vbCrLf & "Else"
    vb = vb & vbCrLf & "Worksheets(1).Range(""A2"").Value = Now + TimeSerial(0, 0, 2) 'задаем новое время запуска"
    vb = vb & vbCrLf & "Application.OnTime Worksheets(1).Range(""A2"").Value, ""checkWindows"", , True 'продлеваем"
    vb = vb & vbCrLf & "End If"
    vb = vb & vbCrLf & "End Sub"
    
    Set xlApp = CreateObject("Excel.Application") 'временный служебный невидимый процесс Excel
    
    xlApp.Workbooks.Add.VBProject.VBComponents.Add(1).CodeModule.AddFromString vb
    xlApp.Run "checkWindows"
        
    Workbooks("CommonTest.xlsx").Save 'здесь имя своей книги с общим доступом
        
    status = xlApp.Workbooks(1).Worksheets(1).Range("A1").Value
    xlApp.Workbooks(1).Worksheets(1).Range("A3").Value = "stop"
         
    MsgBox "Подождём-с..." 'закроется само благодаря последнему пинку от OnTime, либо надо вставить иную задержку на пару секунд
    xlApp.Workbooks(1).Close False
    xlApp.Quit
    Set xlApp = Nothing
        
    If status = "Конфликт обработан" Then
        MsgBox "Вы опоздали! :-("
    Else
        MsgBox "Вы успели! :-)"
    End If
            
End Sub
[/vba]


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Воскресенье, 13.03.2016, 03:22
 
Ответить
СообщениеУф! По мотивам всех идей данного обсуждения родилась процедура, которая, возможно, порадует AlexMen

[vba]
Код
Sub saveCommonBook()
    
    Dim xlApp As Excel.Application
    Dim vb As String
    Dim status As String
        
    vb = vb & vbCrLf & "Sub checkWindows()"
    vb = vb & vbCrLf & "On Error Resume Next"
    vb = vb & vbCrLf & ""
    vb = vb & vbCrLf & "'ищется окно о конфликте доступа"
    vb = vb & vbCrLf & "AppActivate ""Возник конфликт доступа"""
    vb = vb & vbCrLf & "If Err Then"
    vb = vb & vbCrLf & "Err.Clear"
    vb = vb & vbCrLf & "Else"
    vb = vb & vbCrLf & "Worksheets(1).Range(""A1"").Value = ""Конфликт обработан"""
    vb = vb & vbCrLf & "SendKeys ""{TAB 3}{ENTER}"" 'нажимается Enter после 3-х Tab'ов в диалоговом окне"
    vb = vb & vbCrLf & "End If"
    vb = vb & vbCrLf & ""
    vb = vb & vbCrLf & "'ищется окно с сообщением ""Книга обновлена с учетом изменений, внесенных другими пользователями"""
    vb = vb & vbCrLf & "AppActivate ""Microsoft Excel"""
    vb = vb & vbCrLf & "If Err Then"
    vb = vb & vbCrLf & "Err.Clear"
    vb = vb & vbCrLf & "Else"
    vb = vb & vbCrLf & "SendKeys ""{ENTER}"" 'нажимается ОК"
    vb = vb & vbCrLf & "End If"
    vb = vb & vbCrLf & ""
    vb = vb & vbCrLf & "If Worksheets(1).Range(""A3"").Value = ""stop"" Then"
    vb = vb & vbCrLf & "Application.OnTime Worksheets(1).Range(""A2"").Value, ""checkWindows"", , False 'останавливаем"
    vb = vb & vbCrLf & "Else"
    vb = vb & vbCrLf & "Worksheets(1).Range(""A2"").Value = Now + TimeSerial(0, 0, 2) 'задаем новое время запуска"
    vb = vb & vbCrLf & "Application.OnTime Worksheets(1).Range(""A2"").Value, ""checkWindows"", , True 'продлеваем"
    vb = vb & vbCrLf & "End If"
    vb = vb & vbCrLf & "End Sub"
    
    Set xlApp = CreateObject("Excel.Application") 'временный служебный невидимый процесс Excel
    
    xlApp.Workbooks.Add.VBProject.VBComponents.Add(1).CodeModule.AddFromString vb
    xlApp.Run "checkWindows"
        
    Workbooks("CommonTest.xlsx").Save 'здесь имя своей книги с общим доступом
        
    status = xlApp.Workbooks(1).Worksheets(1).Range("A1").Value
    xlApp.Workbooks(1).Worksheets(1).Range("A3").Value = "stop"
         
    MsgBox "Подождём-с..." 'закроется само благодаря последнему пинку от OnTime, либо надо вставить иную задержку на пару секунд
    xlApp.Workbooks(1).Close False
    xlApp.Quit
    Set xlApp = Nothing
        
    If status = "Конфликт обработан" Then
        MsgBox "Вы опоздали! :-("
    Else
        MsgBox "Вы успели! :-)"
    End If
            
End Sub
[/vba]

Автор - Gustav
Дата добавления - 13.03.2016 в 01:00
al-Ex Дата: Воскресенье, 13.03.2016, 09:27 | Сообщение № 27
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 190
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
родилась процедура,
Густав спасибо за познавательный пример, как создать модуль "на лету", запустить процедуру из него и после отработки уничтожить.
Прям ракета двухступенчатая получилась. ))))


Сообщение отредактировал al-Ex - Воскресенье, 13.03.2016, 09:43
 
Ответить
Сообщение
родилась процедура,
Густав спасибо за познавательный пример, как создать модуль "на лету", запустить процедуру из него и после отработки уничтожить.
Прям ракета двухступенчатая получилась. ))))

Автор - al-Ex
Дата добавления - 13.03.2016 в 09:27
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Перехват диалоговых окон кодом (Макросы/Sub)
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!