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

Вход

Регистрация

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

 

= Мир MS Excel/Application.OnTime (Run). Запуск макроса в форме. - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Application.OnTime (Run). Запуск макроса в форме. (Макросы/Sub)
Application.OnTime (Run). Запуск макроса в форме.
RAN Дата: Суббота, 15.04.2017, 11:43 | Сообщение № 1
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Мяв!
Началось все с Application.OnTime, но выяснилось, что и Application.Run ведет себя так-же, с той небольшой разницей, что OnTime молчит, а Run ругается на отсутствие макроса. Судя по тому, что код не работает только в модуле формы (в книге и на листе все в порядке), проблема в определении места расположения макроса. В чем причина, и можно-ли как-то прописать запуск?
Через доп. код в стандартном модуле работает, вариант не интересен
[vba]
Код
Const TimePause = 20 * (1 / 86400 / 10)
Private Sub qq()
    MsgBox "QQ"
End Sub
Private Sub TextBox1_Change()
    Application.Run "UserForm1.qq"
    '    Application.OnTime Now + TimePause, "UserForm1.qq"
End Sub
[/vba]
Планета


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеМяв!
Началось все с Application.OnTime, но выяснилось, что и Application.Run ведет себя так-же, с той небольшой разницей, что OnTime молчит, а Run ругается на отсутствие макроса. Судя по тому, что код не работает только в модуле формы (в книге и на листе все в порядке), проблема в определении места расположения макроса. В чем причина, и можно-ли как-то прописать запуск?
Через доп. код в стандартном модуле работает, вариант не интересен
[vba]
Код
Const TimePause = 20 * (1 / 86400 / 10)
Private Sub qq()
    MsgBox "QQ"
End Sub
Private Sub TextBox1_Change()
    Application.Run "UserForm1.qq"
    '    Application.OnTime Now + TimePause, "UserForm1.qq"
End Sub
[/vba]
Планета

Автор - RAN
Дата добавления - 15.04.2017 в 11:43
nilem Дата: Суббота, 15.04.2017, 13:17 | Сообщение № 2
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
а так не подходит?
[vba]
Код
Private Sub TextBox1_Change()
qq
End Sub
[/vba]


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениеа так не подходит?
[vba]
Код
Private Sub TextBox1_Change()
qq
End Sub
[/vba]

Автор - nilem
Дата добавления - 15.04.2017 в 13:17
RAN Дата: Суббота, 15.04.2017, 13:26 | Сообщение № 3
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Нет, нужен OnTime


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеНет, нужен OnTime

Автор - RAN
Дата добавления - 15.04.2017 в 13:26
_Boroda_ Дата: Суббота, 15.04.2017, 13:26 | Сообщение № 4
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Мур!
Вот так у меня Мсжбокс QQ вылезает
[vba]
Код
Private Sub qq()
    MsgBox "QQ"
End Sub
Private Sub TextBox1_Change()
    qq
End Sub
[/vba]

Добавлено
Тьфу, пока ходил, уже ответили.
А что значит
нужен OnTime

Добавлено
все, понял, торможу


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеМур!
Вот так у меня Мсжбокс QQ вылезает
[vba]
Код
Private Sub qq()
    MsgBox "QQ"
End Sub
Private Sub TextBox1_Change()
    qq
End Sub
[/vba]

Добавлено
Тьфу, пока ходил, уже ответили.
А что значит
нужен OnTime

Добавлено
все, понял, торможу

Автор - _Boroda_
Дата добавления - 15.04.2017 в 13:26
nilem Дата: Суббота, 15.04.2017, 13:26 | Сообщение № 5
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
а так?
[vba]
Код
Private Sub TextBox1_Change()
Application.Wait Now + TimeSerial(0, 0, 1)
qq
End Sub
[/vba]


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениеа так?
[vba]
Код
Private Sub TextBox1_Change()
Application.Wait Now + TimeSerial(0, 0, 1)
qq
End Sub
[/vba]

Автор - nilem
Дата добавления - 15.04.2017 в 13:26
Gustav Дата: Суббота, 15.04.2017, 14:21 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2738
Репутация: 1136 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
Через доп. код в стандартном модуле работает, вариант не интересен
Не интересен, потому что хочется ограничиться рамками формы как контейнера кода? Если да, то можно вот так попробовать "почесать ухо другой рукой":
[vba]
Код
Option Explicit
Const TimePause = 20 * (1 / 86400 / 10)
        
Dim vbmdl As Object 'VBComponent
Dim subName As String
         
Private Sub TextBox1_Change()
    Application.OnTime Now + TimePause, subName
End Sub
         
Public Sub qq()
    MsgBox "QQ"
End Sub
         
Private Sub UserForm_Initialize()
    Dim bSaved As Boolean
    bSaved = ThisWorkbook.Saved
         
    subName = "temp_" & Format(Now, "YYMMDD_hhmmss")
    Set vbmdl = ThisWorkbook.VBProject.VBComponents.Add(1)
         
    vbmdl.CodeModule.InsertLines 10, _
    vbCrLf & "Sub " & subName & "()" & _
    vbCrLf & "    UserForm1.qq" & _
    vbCrLf & "End Sub"
         
    ThisWorkbook.Saved = bSaved
End Sub
         
Private Sub UserForm_Terminate()
    Dim bSaved As Boolean
    bSaved = ThisWorkbook.Saved
     
    vbmdl.Collection.Remove vbmdl
            
    ThisWorkbook.Saved = bSaved
End Sub
[/vba]

При данном подходе существуют некоторые предварительные шаги, о которых здесь в комментариях к макросу.


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

Сообщение отредактировал Gustav - Суббота, 15.04.2017, 17:40
 
Ответить
Сообщение
Через доп. код в стандартном модуле работает, вариант не интересен
Не интересен, потому что хочется ограничиться рамками формы как контейнера кода? Если да, то можно вот так попробовать "почесать ухо другой рукой":
[vba]
Код
Option Explicit
Const TimePause = 20 * (1 / 86400 / 10)
        
Dim vbmdl As Object 'VBComponent
Dim subName As String
         
Private Sub TextBox1_Change()
    Application.OnTime Now + TimePause, subName
End Sub
         
Public Sub qq()
    MsgBox "QQ"
End Sub
         
Private Sub UserForm_Initialize()
    Dim bSaved As Boolean
    bSaved = ThisWorkbook.Saved
         
    subName = "temp_" & Format(Now, "YYMMDD_hhmmss")
    Set vbmdl = ThisWorkbook.VBProject.VBComponents.Add(1)
         
    vbmdl.CodeModule.InsertLines 10, _
    vbCrLf & "Sub " & subName & "()" & _
    vbCrLf & "    UserForm1.qq" & _
    vbCrLf & "End Sub"
         
    ThisWorkbook.Saved = bSaved
End Sub
         
Private Sub UserForm_Terminate()
    Dim bSaved As Boolean
    bSaved = ThisWorkbook.Saved
     
    vbmdl.Collection.Remove vbmdl
            
    ThisWorkbook.Saved = bSaved
End Sub
[/vba]

При данном подходе существуют некоторые предварительные шаги, о которых здесь в комментариях к макросу.

Автор - Gustav
Дата добавления - 15.04.2017 в 14:21
RAN Дата: Суббота, 15.04.2017, 14:59 | Сообщение № 7
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Не интересен, потому что хочется ограничиться рамками формы как контейнера кода?

Именно.
"почесать ухо другой рукой"

"-Приезжайте к нам на Колыму.
-Нет уж, лучше вы к нам." (С) :)

Вариант
[vba]
Код
'форма
Const TimePause = 20 * (1 / 86400 / 10)
Sub qq()
    MsgBox "QQ"
End Sub
Private Sub TextBox1_Change()
'    Application.Run "ww"
        Application.OnTime Now + TimePause, "ww"
End Sub
'стандартный модуль
Sub ww()
    UserForm1.qq
End Sub
[/vba]
вполне рабочий
равно как и
[vba]
Код
Const TimePause1 = 20 * (1 / 86400 / 10)
Private Sub qqq()
    MsgBox "QQ"
End Sub
Private Sub TextBo()
Application.Run "ThisWorkbook.qqq"
'    Application.OnTime Now + TimePause1, "ThisWorkbook.qqq"
End Sub
[/vba]
в модуле книги


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Суббота, 15.04.2017, 15:09
 
Ответить
Сообщение
Не интересен, потому что хочется ограничиться рамками формы как контейнера кода?

Именно.
"почесать ухо другой рукой"

"-Приезжайте к нам на Колыму.
-Нет уж, лучше вы к нам." (С) :)

Вариант
[vba]
Код
'форма
Const TimePause = 20 * (1 / 86400 / 10)
Sub qq()
    MsgBox "QQ"
End Sub
Private Sub TextBox1_Change()
'    Application.Run "ww"
        Application.OnTime Now + TimePause, "ww"
End Sub
'стандартный модуль
Sub ww()
    UserForm1.qq
End Sub
[/vba]
вполне рабочий
равно как и
[vba]
Код
Const TimePause1 = 20 * (1 / 86400 / 10)
Private Sub qqq()
    MsgBox "QQ"
End Sub
Private Sub TextBo()
Application.Run "ThisWorkbook.qqq"
'    Application.OnTime Now + TimePause1, "ThisWorkbook.qqq"
End Sub
[/vba]
в модуле книги

Автор - RAN
Дата добавления - 15.04.2017 в 14:59
Gustav Дата: Суббота, 15.04.2017, 15:36 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2738
Репутация: 1136 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
Именно.

И? В моем варианте код, вроде как, содержится ТОЛЬКО в форме. Да, незаметно создается временный стандартный модуль, да, незаметно удаляется при закрытии формы, никому не мешает... Тож не годится?

P.S. Добавил булевские переменные bSaved, чтобы манипуляции с временным модулем не заставляли только из-за них сохранять книгу. Также добавил генерацию нового имени временной процедуры subName при каждом новом запуске формы - на случай, если выполнение кода формы вдруг аварийно прервется при предыдущем запуске.


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

Сообщение отредактировал Gustav - Суббота, 15.04.2017, 17:46
 
Ответить
Сообщение
Именно.

И? В моем варианте код, вроде как, содержится ТОЛЬКО в форме. Да, незаметно создается временный стандартный модуль, да, незаметно удаляется при закрытии формы, никому не мешает... Тож не годится?

P.S. Добавил булевские переменные bSaved, чтобы манипуляции с временным модулем не заставляли только из-за них сохранять книгу. Также добавил генерацию нового имени временной процедуры subName при каждом новом запуске формы - на случай, если выполнение кода формы вдруг аварийно прервется при предыдущем запуске.

Автор - Gustav
Дата добавления - 15.04.2017 в 15:36
RAN Дата: Суббота, 15.04.2017, 19:42 | Сообщение № 9
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Костя, все хорошо, один минус, но очень БОЛЬШОЙ
[vba]
Код
'ВАЖНО: для успешности всего процесса следует включить "галочку" в меню Excel:
'Разработчик / Безопасность макросов/ Параметры макросов / опция "Доверять доступ к объкетной модели VBA" - устанавливаем!
[/vba]
И на фоне этого минуса дополнительный код в стандарном модуле вообще сладкая печенька.


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Суббота, 15.04.2017, 19:46
 
Ответить
СообщениеКостя, все хорошо, один минус, но очень БОЛЬШОЙ
[vba]
Код
'ВАЖНО: для успешности всего процесса следует включить "галочку" в меню Excel:
'Разработчик / Безопасность макросов/ Параметры макросов / опция "Доверять доступ к объкетной модели VBA" - устанавливаем!
[/vba]
И на фоне этого минуса дополнительный код в стандарном модуле вообще сладкая печенька.

Автор - RAN
Дата добавления - 15.04.2017 в 19:42
Саня Дата: Суббота, 15.04.2017, 21:29 | Сообщение № 10
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
ну так это не проблема :D

по теме:
думаю, так (как в 1-м сообщении) сделать невозможно:
код относится к классу формы и вызван может быть как метод конкретной реализации "класс -> объект"
а объекта пока нет. yes
К сообщению приложен файл: VBOM-API_for_Re.xlsm (44.0 Kb)
 
Ответить
Сообщениену так это не проблема :D

по теме:
думаю, так (как в 1-м сообщении) сделать невозможно:
код относится к классу формы и вызван может быть как метод конкретной реализации "класс -> объект"
а объекта пока нет. yes

Автор - Саня
Дата добавления - 15.04.2017 в 21:29
RAN Дата: Суббота, 15.04.2017, 22:59 | Сообщение № 11
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Саня, моя тупит
Как нет, когда код запускается из открытой формы?


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеСаня, моя тупит
Как нет, когда код запускается из открытой формы?

Автор - RAN
Дата добавления - 15.04.2017 в 22:59
Саня Дата: Суббота, 15.04.2017, 23:27 | Сообщение № 12
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
если бы

[vba]
Код
' модуль
public gfrmForm as Userform1

sub Launch()
   set gfrmForm = New Userform1
   gfrmForm.show
end sub

' форма
public Sub qq()
    MsgBox "QQ"
End Sub
[/vba]

то можно было бы ожидать, что это сработает:
[vba]
Код
Application.Run "gfrmForm.qq"
[/vba]

но нет.

подозрение:
класс формы не статичен (static/global), т.е., не предоставляет доступ к членам интерфейса без создания объекта

видимо, доказательство в пользу:

попробуй создать публичный тип в модуле формы, напр:
[vba]
Код
Public Type ffff
    ff As Boolean
    dd As Integer    
End Type
[/vba]

и Debug/Compile deal :p
 
Ответить
Сообщениеесли бы

[vba]
Код
' модуль
public gfrmForm as Userform1

sub Launch()
   set gfrmForm = New Userform1
   gfrmForm.show
end sub

' форма
public Sub qq()
    MsgBox "QQ"
End Sub
[/vba]

то можно было бы ожидать, что это сработает:
[vba]
Код
Application.Run "gfrmForm.qq"
[/vba]

но нет.

подозрение:
класс формы не статичен (static/global), т.е., не предоставляет доступ к членам интерфейса без создания объекта

видимо, доказательство в пользу:

попробуй создать публичный тип в модуле формы, напр:
[vba]
Код
Public Type ffff
    ff As Boolean
    dd As Integer    
End Type
[/vba]

и Debug/Compile deal :p

Автор - Саня
Дата добавления - 15.04.2017 в 23:27
doober Дата: Воскресенье, 16.04.2017, 11:50 | Сообщение № 13
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
Андрей, зачем все так усложнил?[vba]
Код
Private Sub TextBox1_Change()
    Starts = Timer
    Do While Timer < Starts + 2
        DoEvents
    Loop
    MsgBox (TextBox1.Text)
End Sub
[/vba]




Сообщение отредактировал doober - Воскресенье, 16.04.2017, 15:56
 
Ответить
СообщениеАндрей, зачем все так усложнил?[vba]
Код
Private Sub TextBox1_Change()
    Starts = Timer
    Do While Timer < Starts + 2
        DoEvents
    Loop
    MsgBox (TextBox1.Text)
End Sub
[/vba]

Автор - doober
Дата добавления - 16.04.2017 в 11:50
Gustav Дата: Воскресенье, 16.04.2017, 21:54 | Сообщение № 14
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2738
Репутация: 1136 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
все хорошо, один минус, но очень БОЛЬШОЙ
'ВАЖНО: для успешности всего процесса следует включить "галочку" в меню Excel:
'Разработчик / Безопасность макросов/ Параметры макросов / опция "Доверять доступ к объкетной модели VBA"

Уже больше из принципа и нездорового задора, нежели из здравого смысла и практической необходимости, запилил еще вариант - с автоматическим включением (если она перманентно выключена) галки "Доверять доступ" на время работы формы. Вчера и сегодня перекопал довольно много ссылок, в итоге пазл сложился из достаточно разнородных элементов - ну уж сложился как сложился:
[vba]
Код
Option Explicit
Const TimePause = 20 * (1 / 86400 / 10)
        
Dim vbmdl As Object 'VBComponent
Dim subName As String
Dim regKey As String
Dim regVal As Integer
             
Private Sub TextBox1_Change()
    Application.OnTime Now + TimePause, subName
End Sub
             
Public Sub qq()
    MsgBox "QQ"
End Sub
             
Private Sub UserForm_Initialize()
    Dim bSaved As Boolean
    bSaved = ThisWorkbook.Saved
        
    'проверяем чекбокс "Доверять доступ к объкетной модели VBA"
    On Error Resume Next
    regVal = ThisWorkbook.VBProject.VBComponents.Count
    If Err Then
        Err.Clear
        regVal = 0 'чекбокс изначально сброшен
    Else
        regVal = 1 'чекбокс изначально установлен
    End If
    On Error GoTo 0
        
    'ветка Реестра, отвечающая за чекбокс "Доверять доступ"
    regKey = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & _
                Application.Version & "\Excel\Security\AccessVBOM"
            
    'если чекбокс "Доверять" при открытии формы изначально сброшен,
    'то устанавливаем его
    If regVal = 0 Then
        CreateObject("WScript.Shell").RegWrite regKey, 1, "REG_DWORD"
        'т.е. изменяем значение в Реестре,
        'но это изменение Excel почему-то немедленно не видит,
        'как бы нуждаясь в рефреше, поэтому -
        'принудительно жмем кнопку ОК в "Центре управления безопасности",
        'причем галка там уже стоит (за счёт операции с Реестром),
        'но как бы еще не имеет эффекта - поможем ей! Энтером по кнопке OK
        SendKeys "{ENTER}" 'посылая упреждающий Энтер в открывающееся следом окно
        Application.CommandBars.ExecuteMso "MacroSecurity"
    End If
        
    subName = "temp_" & Format(Now, "YYMMDD_hhmmss")
    Set vbmdl = ThisWorkbook.VBProject.VBComponents.Add(1)
             
    vbmdl.CodeModule.InsertLines 10, _
    vbCrLf & "Sub " & subName & "()" & _
    vbCrLf & "    UserForm1.qq" & _
    vbCrLf & "End Sub"
             
    ThisWorkbook.Saved = bSaved
End Sub
             
Private Sub UserForm_Terminate()
    Dim bSaved As Boolean
    bSaved = ThisWorkbook.Saved
         
    vbmdl.Collection.Remove vbmdl
        
    'снимаем галку "Доверять", если она была снята в начале
    'т.е. подчищаем за собой, восстанавливая начальное состояние
    If regVal = 0 Then
        CreateObject("WScript.Shell").RegWrite regKey, 0, "REG_DWORD"
        SendKeys "{ENTER}"
        Application.CommandBars.ExecuteMso "MacroSecurity"
    End If
                
    ThisWorkbook.Saved = bSaved
End Sub
[/vba]
Самое узкое место - оператор SendKeys "{ENTER}" и следующий за ним оператор открытия диалога "Безопасность макросов", но 99% успешного срабатывания этой парочки, наверное, дам:
[vba]
Код
    If regVal = 0 Then
        CreateObject("WScript.Shell").RegWrite regKey, 0, "REG_DWORD"
        SendKeys "{ENTER}"
        Application.CommandBars.ExecuteMso "MacroSecurity"
    End If
[/vba]Впрочем, можно увеличить успех до 100%, если закомментировать SendKeys "{ENTER}", делегировав пользователю почетную обязанность самому явно кликнуть на OK при загрузке и при выгрузке формы.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
все хорошо, один минус, но очень БОЛЬШОЙ
'ВАЖНО: для успешности всего процесса следует включить "галочку" в меню Excel:
'Разработчик / Безопасность макросов/ Параметры макросов / опция "Доверять доступ к объкетной модели VBA"

Уже больше из принципа и нездорового задора, нежели из здравого смысла и практической необходимости, запилил еще вариант - с автоматическим включением (если она перманентно выключена) галки "Доверять доступ" на время работы формы. Вчера и сегодня перекопал довольно много ссылок, в итоге пазл сложился из достаточно разнородных элементов - ну уж сложился как сложился:
[vba]
Код
Option Explicit
Const TimePause = 20 * (1 / 86400 / 10)
        
Dim vbmdl As Object 'VBComponent
Dim subName As String
Dim regKey As String
Dim regVal As Integer
             
Private Sub TextBox1_Change()
    Application.OnTime Now + TimePause, subName
End Sub
             
Public Sub qq()
    MsgBox "QQ"
End Sub
             
Private Sub UserForm_Initialize()
    Dim bSaved As Boolean
    bSaved = ThisWorkbook.Saved
        
    'проверяем чекбокс "Доверять доступ к объкетной модели VBA"
    On Error Resume Next
    regVal = ThisWorkbook.VBProject.VBComponents.Count
    If Err Then
        Err.Clear
        regVal = 0 'чекбокс изначально сброшен
    Else
        regVal = 1 'чекбокс изначально установлен
    End If
    On Error GoTo 0
        
    'ветка Реестра, отвечающая за чекбокс "Доверять доступ"
    regKey = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & _
                Application.Version & "\Excel\Security\AccessVBOM"
            
    'если чекбокс "Доверять" при открытии формы изначально сброшен,
    'то устанавливаем его
    If regVal = 0 Then
        CreateObject("WScript.Shell").RegWrite regKey, 1, "REG_DWORD"
        'т.е. изменяем значение в Реестре,
        'но это изменение Excel почему-то немедленно не видит,
        'как бы нуждаясь в рефреше, поэтому -
        'принудительно жмем кнопку ОК в "Центре управления безопасности",
        'причем галка там уже стоит (за счёт операции с Реестром),
        'но как бы еще не имеет эффекта - поможем ей! Энтером по кнопке OK
        SendKeys "{ENTER}" 'посылая упреждающий Энтер в открывающееся следом окно
        Application.CommandBars.ExecuteMso "MacroSecurity"
    End If
        
    subName = "temp_" & Format(Now, "YYMMDD_hhmmss")
    Set vbmdl = ThisWorkbook.VBProject.VBComponents.Add(1)
             
    vbmdl.CodeModule.InsertLines 10, _
    vbCrLf & "Sub " & subName & "()" & _
    vbCrLf & "    UserForm1.qq" & _
    vbCrLf & "End Sub"
             
    ThisWorkbook.Saved = bSaved
End Sub
             
Private Sub UserForm_Terminate()
    Dim bSaved As Boolean
    bSaved = ThisWorkbook.Saved
         
    vbmdl.Collection.Remove vbmdl
        
    'снимаем галку "Доверять", если она была снята в начале
    'т.е. подчищаем за собой, восстанавливая начальное состояние
    If regVal = 0 Then
        CreateObject("WScript.Shell").RegWrite regKey, 0, "REG_DWORD"
        SendKeys "{ENTER}"
        Application.CommandBars.ExecuteMso "MacroSecurity"
    End If
                
    ThisWorkbook.Saved = bSaved
End Sub
[/vba]
Самое узкое место - оператор SendKeys "{ENTER}" и следующий за ним оператор открытия диалога "Безопасность макросов", но 99% успешного срабатывания этой парочки, наверное, дам:
[vba]
Код
    If regVal = 0 Then
        CreateObject("WScript.Shell").RegWrite regKey, 0, "REG_DWORD"
        SendKeys "{ENTER}"
        Application.CommandBars.ExecuteMso "MacroSecurity"
    End If
[/vba]Впрочем, можно увеличить успех до 100%, если закомментировать SendKeys "{ENTER}", делегировав пользователю почетную обязанность самому явно кликнуть на OK при загрузке и при выгрузке формы.

Автор - Gustav
Дата добавления - 16.04.2017 в 21:54
RAN Дата: Понедельник, 17.04.2017, 19:27 | Сообщение № 15
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

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

:D
Не смотря на то, что для моей задачи идеально подошло решение doober, ибо он знал, какую задачу я пытаюсь решить, а не только то, как я ее пытаюсь решить, тема получилась интересной и содержательной.
а конкретно это
SendKeys "{ENTER}" 'посылая упреждающий Энтер в открывающееся следом окно

помогло решить вопрос тут Планета
Всем мУрси.


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение
больше из принципа и нездорового задора, нежели из здравого смысла и практической необходимости

:D
Не смотря на то, что для моей задачи идеально подошло решение doober, ибо он знал, какую задачу я пытаюсь решить, а не только то, как я ее пытаюсь решить, тема получилась интересной и содержательной.
а конкретно это
SendKeys "{ENTER}" 'посылая упреждающий Энтер в открывающееся следом окно

помогло решить вопрос тут Планета
Всем мУрси.

Автор - RAN
Дата добавления - 17.04.2017 в 19:27
Gustav Дата: Понедельник, 17.04.2017, 20:38 | Сообщение № 16
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2738
Репутация: 1136 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
Не смотря на то, что для моей задачи идеально подошло решение doober

Хорошо, что уточнил! А то я, было, хотел пожурить, что хоть у doober кратко и гармонично всё получилось, но RAN-то надо, чтобы QQ после каждого символа через 2 сек появлялось, а не после начала набора текста. yes


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

Хорошо, что уточнил! А то я, было, хотел пожурить, что хоть у doober кратко и гармонично всё получилось, но RAN-то надо, чтобы QQ после каждого символа через 2 сек появлялось, а не после начала набора текста. yes

Автор - Gustav
Дата добавления - 17.04.2017 в 20:38
RAN Дата: Понедельник, 17.04.2017, 20:57 | Сообщение № 17
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
В процессе поиска решения вопрос как решить конкретную задачу плавно трансформировался в вопрос почему именно в форме не работает абстрактный макрос, и как это победить. :D


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

Автор - RAN
Дата добавления - 17.04.2017 в 20:57
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Application.OnTime (Run). Запуск макроса в форме. (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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