2015-11-16 2 views
2

я столкнулся с проблемой в макросе нижеНе удается запустить макрос

Sub RefreshAction() 
    Range("b7").Select 
    Application.Run "RefreshCurrentSelection" 
    Application.OnTime (Now() + TimeValue("00:00:05")), "thisworkbook.Action" 
End Sub 

Клетка освежающим, когда я запустить макрос в первый раз, но я получаю сообщение об ошибке сразу после

сообщение: Не удается запустить макрос «C \ Desktop \ XYZ.xlsm»! thisworkbook.Action. Макрос может быть недоступен в этой книге или все макросы могут быть отключены.

Я уже прошел через «Центр доверия-> Настройки центра доверия -> Настройки макроса-> Включить все макросы, и это не сработало.

Объект «Доверять доступ к объектной модели проекта VBA» также можно щелкнуть.

+1

Просто убедитесь, что «Действие» - это суб, без параметров, определенных в модуле кода ** ThisWorkbook **, а не в каком-либо другом модуле кода? –

+0

Вы пробовали просто «Действовать»? – findwindow

+0

Я избавился от ThisWorkbook, но у меня все еще такая же проблема – fdt6243

ответ

1

Смотрите абсолютную ссылку для получения более подробной информации: CPearson OnTime

Первый вопрос, вам нужно сохранить время, которое вы будете ввода в методе OnTime, чтобы быть в состоянии остановить его. (Здесь я объявлен Public TimeToRun As Date)

Вторая точка Чтобы использовать метод OnTime непрерывно, вам нужно сбросить таймер в конце вашей таймерной процедуры (здесь RefreshAllStaticData).

Так весь ваш код должен выглядеть следующим образом:

Public TimeToRun As Date 'so that TimeToRun can be used in both the functions 

Sub RefreshAction() 
    Range("b7").Select 
    Application.Run "RefreshCurrentSelection" 
    DoEvents 
    'Store the next date of execution in TimeToRun 
    TimeToRun = Now() + TimeValue("00:00:05") 
    'Launch the next OnTime 
    Application.OnTime TimeToRun, "RefreshAllStaticData" 
End Sub 


Sub RefreshAllStaticData() 

'--++-- Place your code here, as it is now --++-- 

'----Call RefreshAction to reset the OnTime method 
'---------to another 5 seconds and keep "looping" 
RefreshAction 

End Sub 


Sub Kill_OnTime() 
'Launch this to stop the OnTime method 
Application.OnTime _ 
    earliesttime:=TimeToRun, _ 
    procedure:="RefreshAllStaticData", _ 
    schedule:=False 
End Sub 
3

Прежде всего, вот снимок ошибки вы получаете, когда вы попытаетесь запустить OnTime из листа (не модуль), как я буду объяснить. Я тоже получал эту ошибку и пытался понять, почему. cannot run macro

Это похоже на ошибку безопасности, но в данном случае это не совсем обычная ошибка безопасности.

Чтобы запустить код по таймеру, вы должны добавить его в модуль VBA. Перейдите в редактор VisualBasic и щелкните правой кнопкой мыши VBAProject (книга). В Excel это выглядит так:

add module После добавления модуля вы добавляете там свой код таймера.

Поскольку вы хотите позвонить RefreshAction каждые 5 секунд, вы могли бы сделать что-то вроде следующего:

Sub StartProcess() 
    Debug.Print Now() 
    Application.OnTime Now() + TimeValue("00:00:05"), "RefreshAction", Schedule = True 
End Sub 

Sub RefreshAction() 
    Application.EnableEvents = True 
    Debug.Print Now() + TimeValue("00:00:05") 
    Application.OnTime Now() + TimeValue("00:00:05"), "RefreshAction", Schedule = True 
End Sub 

Я дам вам добавить код, который вы хотите, чтобы это сделать, каждый раз, когда в подпрограмме RefreshAction.

Вот как он будет выглядеть в модуле. Убедитесь, что ваш показывает, что он находится в модуле, как на картинке: module in vba

Кроме того, я нашел его довольно шелушащимся. Если в вызове OnTime у вас есть что-то даже немного неправильное, он будет терпеть неудачу. Скопируйте мой код (я его протестировал) и попробую сначала. После этого просто добавьте свой код в подраздел RefreshAction.

StartProcess()

Запустите StartProcess, чтобы начать дело идет.

Кроме Странный

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

Смежные вопросы