Измените файл .xla с помощью MSBuild
Вопрос
Я пытаюсь создать сценарий сборки для моего текущего проекта, который включает в себя надстройку Excel.Надстройка содержит VBProject с файлом modGlobal с переменной version_Number.Этот номер необходимо изменять для каждой сборки.Точные шаги:
- Откройте документ XLA с помощью Excel.
- Переключитесь в режим VBEditor.(Alt+F11)
- Откройте VBProject, введя пароль.
- Откройте файл modGlobal.
- Измените значение переменной по умолчанию на текущую дату.
- Закройте и сохраните проект.
Я в растерянности, не зная, как автоматизировать этот процесс.Лучшее, что я могу придумать, - это макрос Excel или скрипт Auto-IT.Я мог бы также написать пользовательскую задачу MSBuild, но это может привести к сбою...хитро.У кого-нибудь еще есть какие-нибудь другие предложения?
Решение
Альтернативным способом управления версиями XLA-файла является использование пользовательского свойства в свойствах документа.Вы можете получить доступ к COM и манипулировать им, как описано здесь: http://support.microsoft.com/?kbid=224351.
Преимуществами этого являются:
Вы можете просмотреть номер версии, не открывая файл XLA
Вам не нужен Excel на вашем компьютере сборки - только DsoFile.компонент dll
Другой альтернативой было бы сохранить номер версии (возможно, и другие данные конфигурации) на рабочем листе в файле XLA.Рабочий лист не был бы виден пользователям XLA.Один из методов, который я использовал в прошлом, заключается в сохранении надстройки в виде XLS-файла в системе управления версиями, а затем как части процесса сборки (напримерв событии после сборки) запустите приведенный ниже скрипт, чтобы преобразовать его в XLA в выходном каталоге.Этот скрипт можно было бы легко расширить, чтобы обновить номер версии на листе перед сохранением.В моем случае я сделал это, потому что моя надстройка Excel использовала VSTO, а Visual Studio напрямую не поддерживает файлы XLA.
'
' ConvertToXla.vbs
'
' VBScript to convert an Excel spreadsheet (.xls) into an Excel Add-In (.xla)
'
' The script takes two arguments:
'
' - the name of the input XLS file.
'
' - the name of the output XLA file.
'
Option Explicit
Dim nResult
On Error Resume Next
nResult = DoAction
If Err.Number <> 0 Then
Wscript.Echo Err.Description
Wscript.Quit 1
End If
Wscript.Quit nResult
Private Function DoAction()
Dim sInputFile, sOutputFile
Dim argNum, argCount: argCount = Wscript.Arguments.Count
If argCount < 2 Then
Err.Raise 1, "ConvertToXla.vbs", "Missing argument"
End If
sInputFile = WScript.Arguments(0)
sOutputFile = WScript.Arguments(1)
Dim xlApplication
Set xlApplication = WScript.CreateObject("Excel.Application")
On Error Resume Next
ConvertFileToXla xlApplication, sInputFile, sOutputFile
If Err.Number <> 0 Then
Dim nErrNumber
Dim sErrSource
Dim sErrDescription
nErrNumber = Err.Number
sErrSource = Err.Source
sErrDescription = Err.Description
xlApplication.Quit
Err.Raise nErrNumber, sErrSource, sErrDescription
Else
xlApplication.Quit
End If
End Function
Public Sub ConvertFileToXla(xlApplication, sInputFile, sOutputFile)
Dim xlAddIn
xlAddIn = 18 ' XlFileFormat.xlAddIn
Dim w
Set w = xlApplication.Workbooks.Open(sInputFile,,,,,,,,,True)
w.IsAddIn = True
w.SaveAs sOutputFile, xlAddIn
w.Close False
End Sub
Другие советы
Я не уверен на 100%, как сделать именно то, что вы просили.Но, угадывая цель, которую вы имеете в виду, есть несколько возможностей.
1) Сделайте часть (или все) ваших глобальных файлов отдельным текстовым файлом, который распространяется вместе с .XLA Я бы использовал это для внешних ссылок, таких как версия остальной части вашего приложения.Запишите это во время сборки и распространения, а также прочитайте при загрузке XLA.
2) Я предполагаю, что вы пишете версию основного компонента (т.е.:часть, не относящаяся к XLA) вашего приложения.Если это правда, зачем хранить это в вашем XLA?Почему бы не сделать так, чтобы основная часть приложения позволяла работать определенной версии XLA?Версия 1.1 основного приложения могла принимать вызовы из версий 7.1 - 8.9 XLA.
3) Если вы просто хотите обновить XLA, чтобы он был включен в вашу систему контроля версий или аналогичную (я предполагаю здесь), возможно, просто коснитесь файла, чтобы он выглядел так, как будто он изменился.
Если это версия остальной части приложения, которой вы управляете, я бы просто поместил ее в текстовый файл и распространил вместе с XLA.
Вы можете изменить код в xla программно из Excel.Вам понадобится ссылка на компонент "Microsoft Visual Basic for Applications Extensibility..".
Примеры на Отличный сайт Чипа Пирсона это должно помочь вам начать.