Cambiar archivo .xla con MSBuild
Pregunta
Estoy intentando crear un script de compilación para mi proyecto actual, que incluye un complemento de Excel.El complemento contiene un VBProject con un archivo modGlobal con una variable version_Number.Este número debe cambiarse para cada compilación.Los pasos exactos:
- Abra el documento XLA con Excel.
- Cambie al modo VBEditor.(Alt+F11)
- Abra VBProject, ingresando una contraseña.
- Abra el archivo modGlobal.
- Cambie el valor predeterminado de la variable a la fecha actual.
- Cierra y guarda el proyecto.
No sé cómo automatizar el proceso.Lo mejor que se me ocurre es una macro de Excel o un script Auto-IT.También podría escribir una tarea personalizada de MSBuild, pero eso podría resultar...complicado.¿Alguien más tiene alguna otra sugerencia?
Solución
Una forma alternativa de manejar el control de versiones de un archivo XLA es utilizar una propiedad personalizada en Propiedades del documento.Puede acceder y manipular usando COM como se describe aquí: http://support.microsoft.com/?kbid=224351.
Las ventajas de esto son:
Puede examinar el número de versión sin abrir el archivo XLA
No necesita Excel en su máquina de compilación, solo el componente DsoFile.dll
Otra alternativa sería almacenar el número de versión (posiblemente también otros datos de configuración) en una hoja de trabajo en el archivo XLA.La hoja de trabajo no sería visible para los usuarios de XLA.Una técnica que he usado en el pasado es almacenar el complemento como un archivo XLS en el control de código fuente y luego como parte del proceso de compilación (p. ej.en un evento posterior a la compilación) ejecute el siguiente script para convertirlo a XLA en el directorio de salida.Este script podría ampliarse fácilmente para actualizar un número de versión en una hoja de trabajo antes de guardarla.En mi caso, hice esto porque mi complemento de Excel usaba VSTO y Visual Studio no admite archivos XLA directamente.
'
' 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
Otros consejos
No estoy 100% seguro de cómo hacer exactamente lo que has solicitado.Pero acertando el objetivo que tienes en mente hay unas cuantas posibilidades.
1) Haga que parte (o la totalidad) de sus Globals sea un archivo de texto separado que se distribuya con .XLA. Lo usaría para referencias externas, como la versión del resto de su aplicación.Escriba esto en el momento de la compilación, distribúyalo y léalo durante la carga del XLA.
2) Supongo que estás escribiendo la versión del componente principal (es decir:la parte no XLA) de su aplicación.Si esto es cierto, ¿por qué guardarlo en su XLA?¿Por qué no hacer que la parte principal de la aplicación permita que funcione cierta versión de XLA?La versión 1.1 de la aplicación principal podría aceptar llamadas de la versión 7.1 - 8.9 de XLA.
3) Si solo está buscando actualizar el XLA para que se incluya en su sistema de control de versiones o similar (supongo que aquí), tal vez simplemente toque el archivo para que parezca que ha cambiado.
Si es la versión del resto de la aplicación la que estás controlando, simplemente la pegaría en un archivo de texto y lo distribuiría junto con el XLA.
Puede modificar el código en xla mediante programación desde Excel.Necesitará una referencia al componente 'Microsoft Visual Basic para extensibilidad de aplicaciones...'.
Los ejemplos en Excelente sitio de Chip Pearson debería ayudarte a empezar.