Cambia il file .xla con MSBuild
Domanda
Sto cercando di creare uno script di compilazione per il mio progetto attuale, che include un componente aggiuntivo di Excel.Il componente aggiuntivo contiene un VBProject con un file modGlobal con una variabile version_Number.Questo numero deve essere modificato per ogni build.I passaggi esatti:
- Apri il documento XLA con Excel.
- Passa alla modalità VEditor.(Alt+F11)
- Apri VBProject, inserendo una password.
- Apri il file modGlobal.
- Cambia il valore predefinito della variabile nella data corrente.
- Chiudi e salva il progetto.
Non so come automatizzare il processo.Il meglio che riesco a trovare è una macro Excel o uno script Auto-IT.Potrei anche scrivere un'attività MSBuild personalizzata, ma ciò potrebbe ottenere...scaltro.Qualcun altro ha altri suggerimenti?
Soluzione
Un modo alternativo per gestire il controllo delle versioni di un file XLA consiste nell'utilizzare una proprietà personalizzata in Proprietà del documento.È possibile accedere e manipolare utilizzando COM come descritto qui: http://support.microsoft.com/?kbid=224351.
I vantaggi di questo sono:
È possibile esaminare il numero di versione senza aprire il file XLA
Non è necessario Excel sul computer di compilazione: solo il componente DsoFile.dll
Un'altra alternativa potrebbe essere quella di memorizzare il numero di versione (eventualmente anche altri dati di configurazione) su un foglio di lavoro nel file XLA.Il foglio di lavoro non sarebbe visibile agli utenti di XLA.Una tecnica che ho utilizzato in passato è stata quella di archiviare il componente aggiuntivo come file XLS nel controllo del codice sorgente, quindi come parte del processo di compilazione (ad es.in un evento post-compilazione) esegui lo script seguente per convertirlo in un XLA nella directory di output.Questo script può essere facilmente esteso per aggiornare un numero di versione in un foglio di lavoro prima di salvarlo.Nel mio caso l'ho fatto perché il mio componente aggiuntivo di Excel utilizzava VSTO e Visual Studio non supporta direttamente i file 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
Altri suggerimenti
Non sono sicuro al 100% di come fare esattamente ciò che hai richiesto.Ma indovinando l'obiettivo che hai in mente ci sono alcune possibilità.
1) Rendi parte (o tutti) dei tuoi Globals un file di testo separato distribuito con .XLA. Lo userei per riferimenti esterni come la versione del resto della tua app.Scrivilo al momento della compilazione, distribuiscilo e leggi il caricamento di XLA.
2) Immagino che tu stia scrivendo la versione del componente principale (ovvero:la parte non XLA) della tua domanda.Se questo è vero, perché memorizzarlo nel tuo XLA?Perché la parte principale dell'app non consente il funzionamento di determinate versioni di XLA.La versione 1.1 dell'app principale potrebbe accettare chiamate dalla versione 7.1 - 8.9 dell'XLA.
3) Se stai solo cercando di aggiornare XLA in modo che venga incluso nel tuo sistema di controllo della versione o simile (immagino qui) forse basta toccare il file in modo che sembri cambiato.
Se è la versione del resto dell'app che stai controllando, la inserirei semplicemente in un file di testo e lo distribuirò insieme a XLA.
È possibile modificare il codice in xla a livello di codice da Excel.Sarà necessario un riferimento al componente "Microsoft Visual Basic for Applications Extensibility...".
Gli esempi su L'eccellente sito di Chip Pearson dovrebbe farti iniziare.