2016-10-23 1 views
0

Мне немного сложно объяснить, поэтому, пожалуйста, со мной, если хотите.Есть ли способ для временного файла Excel Add-on, чтобы узнать, обновлен ли он общедоступный файл только для чтения, так как конечный пользователь открыл Excel?

У меня есть надстройка Excel (.xlam) Я создал для своего отдела на работе. Я его настроить так:

  1. Существует общественный (Read-Only) версия Add-On на общем сетевом диске компании. Это файл, который все сотрудники отдела установили на своих компьютерах.

  2. Для обеспечения правильной установки открытой версии на компьютерах сотрудников (не сохраняемых локально в папке Add-On пользователя) я создал vbscript, который автоматически устанавливает его для всех пользователей правильным способом, что позволяет мне должным образом и без усилий обновить дополнение в будущем.

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

  4. Когда я готов развернуть обновление, у меня есть Sub, который отключает атрибут «Только для чтения» общедоступного файла, перезаписывает файл с копией версии разработки (сам), затем включает Read- Возвращается только атрибут для вновь обновленного общедоступного файла.

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

Единственная ошибка для этого метода для меня - это когда мне нужно установить исправление в середине дня. Если у пользователя уже открыт Excel при развертывании исправления, им необходимо перезагрузить Excel, чтобы обновить версию. Это означает, что нужно отправить сообщение электронной почты и зависит от пользователей, которые видят электронное письмо, чтобы знать, что они должны перезапустить Excel, чтобы изменения вступили в силу. Я бы предпочел, чтобы проверка надстройки была обновлена, и предупредил пользователя через MsgBox, в котором будет указано, что они должны перезапустить Excel. У меня есть идея, как это сделать, но я не уверен, что он будет работать по назначению.

Теперь по моему вопросу.

Есть ли способ для меня, чтобы иметь чек Add-On, чтобы увидеть, если это самая последняя версия, сравнив дата последнего изменения этого пользователя TEMP Копировать и общественности надстройку-х Дата последнего изменения или будет у них обоих одинаковая дата?

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

Если это не сработает, как еще я могу проверить, использует ли пользователь обновленную версию?

+0

Это (сравнение даты последнего изменения), кажется, как-то можно было довольно легко проверить? –

+0

Да, вы правы. Я смог выполнить это, сохранив исходную последнюю обновленную дату до общедоступной переменной, когда экземпляр Excel открывается первым. Затем я использовал метод OnTime, чтобы проверять эту дату на текущее значение Last Date Modified для публичного добавления каждую минуту. Если доступно обновление, я просто отключу все кнопки на ленте и изменим изображение фиктивной кнопки с отметки на восклицательный знак с текстом «Пожалуйста, обновите». Это заставляет пользователей перезагружаться только в том случае, если они хотят использовать кнопки, входящие в состав надстройки. Я полагаю, что это меньше – CaffeinatedCoder

+0

Intrusive и не заставляет их перезапускаться. – CaffeinatedCoder

ответ

2

Я бы добавил дополнительный лист для вашего добавления и использовал ExecuteExcel4Macro для проверки обновлений версий.

enter image description here


Public Sub CheckForUpdates() 
    Const MasterPath As String = "C:\stackoverflow" 
    Const MasterFileName As String = "MasterFile.xlam" 
    Const WorkSheetName As String = "Settings" 

    Dim Msg As String, Version As String 
    Dim ButtonNumber As Long 

    Version = getVersion(MasterPath, MasterFileName, WorkSheetName, 2, 2) 

    With ThisWorkbook.Worksheets("Settings").Range("B2") 
     If .Value <> Version Then 
      Msg = getVersion(MasterPath, MasterFileName, WorkSheetName, 4, 2) 
      ButtonNumber = IIf(getVersion(MasterPath, MasterFileName, WorkSheetName, 3, 2), vbCritical, vbInformation) 
      MsgBox Msg, ButtonNumber, "Update Available" 
     Else 
      Application.OnTime Now + 4/24, "CheckForUpdates" 
     End If 

    End With 

End Sub 

Function getVersion(MasterPath As String, MasterFileName As String, WorkSheetName As String, RowNumber As Long, ColumnNumber As Long) 
    If Right(MasterPath, 1) <> "\" Then MasterPath = MasterPath & "\" 
    getVersion = ExecuteExcel4Macro("'" & MasterPath & "[" & MasterFileName & "]" & _ 
            WorkSheetName & "'!R" & RowNumber & "C" & ColumnNumber) 
End Function 
+0

Хотя я не использовал этот метод (см. Мои комментарии выше для решения, которое я выбрал), я ценю время и усилия, которые вы вкладываете в предоставление этого хорошо изложенного примера для меня. Поэтому я выбираю это как ответ. Спасибо :) – CaffeinatedCoder

+0

Спасибо, я ценю это, но вы должны опубликовать и принять свой собственный ответ. Было бы более полезно людям, ищущим ответ на подобные вопросы. –

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