Alterar .xla arquivo com MSBuild
Pergunta
Eu estou tentando criar um script de construção para o meu projeto atual, que inclui um Excel Add-in. O Add-in contém uma VBProject com um arquivo modGlobal com uma variável VERSION_NUMBER. Este número precisa ser mudado para cada compilação. As etapas exatas:
- Abrir documento XLA com Excel.
- Mudar para o modo VBEditor. (Alt + F11)
- Open VBProject, digitar uma senha.
- Abrir arquivo modGlobal.
- valor padrão de mudança de variável para a data atual.
- Fechar e salvar o projeto.
Eu estou em uma perda para saber como automatizar o processo. O melhor que eu posso vir acima com é uma macro excel ou script Auto-IT. Eu também poderia escrever uma tarefa MSBuild personalizado, mas que pode ter ... complicado. Alguém tem alguma outra sugestão?
Solução
Uma forma alternativa de lidar com versões de um arquivo de XLA é usar uma propriedade personalizada em Propriedades do documento. Você pode acessar e manipular usando COM, conforme descrito aqui: http://support.microsoft.com/?kbid = 224351 .
As vantagens desta são:
-
Você pode examinar o número da versão sem abrir o arquivo XLA
-
Você não precisa de Excel em sua máquina de construção - apenas o componente DsoFile.dll
Outra alternativa seria armazenar o número da versão (possivelmente outros dados de configuração também) em uma planilha no arquivo XLA. A planilha não seria visível para os usuários do XLA. Uma técnica que tenho usado no passado é para armazenar o add-in como um arquivo XLS no controle de origem, em seguida, como parte do processo de construção (por exemplo, em um evento pós-compilação) executar o script abaixo para convertê-lo em um XLA em o diretório de saída. Este script pode ser facilmente estendido para atualizar um número de versão em uma planilha antes de salvar. No meu caso eu fiz isso porque meu Excel Add-in VSTO usado, e não Visual Studio não suporta XLA arquivos diretamente.
'
' 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
Outras dicas
Eu não estou 100% de certeza de como fazer exatamente o que você pediu. Mas supondo que o objetivo que você tem em mente há algumas possibilidades.
1) Faça parte (ou a totalidade) dos seus Globals um arquivo de texto separado que é distribuído com o .XLA eu usaria isso para referências externas, como a versão do resto do seu aplicativo. Escreve isto em tempo de compilação e distribuir, e ler sobre a carga da XLA.
2) eu estou supondo que a sua escrita a versão do componente principal (ou seja: a parte não XLA) de sua aplicação. Se esta é tru por armazenar isso em seu XLA? Por que não ter a parte principal do aplicativo permitir que certa versão do XLA ao trabalho. A versão 1.1 do aplicativo principal pode aceitar chamadas a partir da Versão 7.1 -. 8.9 do XLA
3) Se você está olhando apenas para atualizar o XLA por isso é incluído em seu sistema de controle de versão ou similar (i estou supondo aqui) talvez apenas tocar o arquivo de modo que parece que mudou .
Se for a versão do resto do aplicativo que você está controlando eu tinha acabado de colocá-lo em um arquivo de texto e distribuir que, juntamente com o XLA.
Você pode modificar o código no xla programática a partir do Excel. Você vai precisar de uma referência para o 'Microsoft Visual Basic for Applications Extensibility ..' componente.
Os exemplos de Chip Pearson local excelente deve você começar.