2015-08-28 4 views
2

Я создал пользовательскую надстройку Excel, и в настоящее время я пытаюсь выяснить способ запроса пользователей через VBA, когда доступны новые версии надстройки.Application.OnTime in Add-In Workbook_Open

Я попытался просто использовать событие workbook_open, чтобы проверить последнюю версию, а затем запросить у пользователя пользовательскую форму, но я обнаружил, что когда Excel загружает надстройку, которая запускает пользовательскую форму, Excel перестает загружать книгу, на самом деле пользователь пытался открыть и перезагрузить надстройку. Поэтому, пока пользовательская форма работает так, как я хотел, пользователь получает пустое (без чтения) оболочку Excel с загруженной надстройкой.

Таким образом, я рассмотрел возможность использования Application.OnTime для отсрочки VBA до тех пор, пока файлы надстройки и цели не будут открыты. У меня сложилось впечатление, что и here, и here, что это возможно, но я могу сделать это только в файле .xlsm, а не в файле .xlam.

Вот код, я тестирую с:

Sub Workbook_Open() 
    Application.OnTime Now() + TimeValue("00:00:05"), "Test_Addin.xlam!Versioning.Notify_User" 
End Sub 

И в очередной код модуля:

Sub Notify_User() 
    MsgBox "Hello" 
End Sub 

Итак, мой вопрос: ли я делаю что-то здесь не так?

Мне интересно, есть ли что-то о том, как надстройка загружена/спроектирована, что не позволяет этому типу действий выполнять.

В качестве альтернативы, существует ли другой способ сделать это, о котором вы можете думать?

Я прочитал interesting blog post (и комментарии) от Dick Kusleika по этой теме, но это звучало так, как будто некоторые люди проверяли версию каждой процедуры. У меня много процедур, поэтому это не звучит как хорошая альтернатива, хотя мне, возможно, придется прибегнуть к ней.

+0

Вот несколько иной подход, который может представлять интерес: http://www.excelguru.ca/content.php?152-Deploying-Add-ins-in-a-Network-Environment –

+0

@DougGlancy Интригующая концепция. К сожалению, мои пользователи не всегда в сети, а некоторые из них имеют медленные сетевые подключения, поэтому это решение не совсем соответствует требованиям бизнеса. :/ – ARich

+0

@DougGlancy Я заметил ваш комментарий к сообщению в блоге Дика.Вы все еще используете FlyBar? Как вы загрузили новые версии добавления с сервера? – ARich

ответ

0

Ну, время имеет сущность, поэтому я прибегал к наименее желательному варианту: проверка в начале каждой процедуры.

Для заинтересованных сторон, вот как я это сделал:

Где-то к началу каждого подраздела процедуры я ставлю эту строку кода:

If Version_Check Then Call Notify_User 

И в моем Versioning модуле я ставлю эту функцию и порядок:

Function Version_Check() As Boolean 
    Installed = FileDateTime(ThisWorkbook.FullName) 
    Available = FileDateTime("\\NetworkDrive\Test_AddIn.xlam") 
    If Installed < Available Then Version_Check = True 
End Function 

Sub Notify_User() 
    Update_Check.Show 
End Sub 

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

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

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