MSBuild で .xla ファイルを変更する
質問
現在のプロジェクト用のビルド スクリプトを作成しようとしています。これには Excel アドインが含まれています。アドインには、変数 version_Number を持つファイル modGlobal を持つ VBProject が含まれています。この数値はビルドごとに変更する必要があります。正確な手順:
- XLA ドキュメントを Excel で開きます。
- VBEditor モードに切り替えます。(Alt+F11)
- VBProject を開き、パスワードを入力します。
- modGlobal ファイルを開きます。
- 変数のデフォルト値を現在の日付に変更します。
- プロジェクトを閉じて保存します。
プロセスを自動化する方法がわからず困っています。私が思いつく最善の方法は、Excel マクロまたは Auto-IT スクリプトです。カスタム MSBuild タスクを作成することもできますが、それは可能性があります...トリッキー。他に何か提案がある人はいますか?
解決
XLA ファイルのバージョン管理を処理する別の方法は、ドキュメント プロパティでカスタム プロパティを使用することです。ここで説明するように、COM を使用してアクセスして操作できます。 http://support.microsoft.com/?kbid=224351.
この利点は次のとおりです。
XLA ファイルを開かずにバージョン番号を確認できます。
ビルド マシンに Excel は必要ありません。DsoFile.dll コンポーネントのみが必要です。
もう 1 つの方法は、バージョン番号 (おそらく他の構成データも) を XLA ファイル内のワークシートに保存することです。ワークシートは XLA のユーザーには表示されません。私が過去に使用したテクニックの 1 つは、アドインをソース管理に 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 は、XLA のバージョン 7.1 ~ 8.9 からの呼び出しを受け入れることができました。
3) XLA をバージョン管理システムなどに含めるために更新したいだけの場合 (ここでは推測します)、ファイルをタッチするだけで、変更されたように見えるかもしれません。
それがあなたが制御しているアプリの残りのバージョンである場合は、それをテキストファイルに貼り付けて、XLAとともに配布します。
xla 内のコードは Excel 内からプログラムで変更できます。「Microsoft Visual Basic for Applications Extensibility..」コンポーネントへの参照が必要になります。
の例 チップ・ピアソンの素晴らしいサイト 始めましょう。