我有一支程式,要計算加班時數的樞鈕分析。原始資料是分鐘數,呈現結果是要 日:時:分。時:分的部份好做,難在於日的計算。不同的人會有不同的工作時數的定義。比如說甲上8 小時就算一天,乙是9小時才算一天,那麼同樣加班10小時,甲的呈現結果是 1日2時,乙是1日1時。
如果要在 c#中處理,其實也不是問題。但因為我要做的是樞鈕分析,必須「教」excel怎麼算,而不能把結果算好再丟給excel,這樣加總會出問題。所以基本想法是,用vba寫一個function(e.g. MyDDHHMM), 然後儲存格下公式( B1=MyDDHHMM(A1) 這樣的寫法)就好啦。但是這種做法,必須將 function MyDDHHMM 存在 excel中,而我的程式所產生的樞鈕,都是臨時產生的,是暫存檔,不能用上面的做法。
所以我問題是:該如何在我的c#程式中,加入一個excel function, 然後儲存格所下的公式,可以用到這個function?
就您的需求來看,要透過程式產生 Excel 的 VBA 程式碼,不曉得做不做得到
我是不會寫(來亂的嗎?)
但我會將我的 VBA 程式碼寫在一個範本檔中
由範本檔去產生我的 Excel 檔,這樣這個 Excel 檔就會有該 VBA 程式了
因為我比較熟 VB.Net 的語法,所以用 VB.Net 的方式來解說
當然您必須先將 Excel 的 Office Object Library reference 進來
VB.Net
Imports Microsoft.Office.Interop.Excel
C#
using Microsoft.Office.Interop.Excel;
<pre class="c" name="code">
Dim oExcel As Excel.Application = Nothing
Dim oWorkBook As Excel.Workbook = Nothing
Dim oSheet As Excel.Worksheet = Nothing
oExcel = New Excel.Application()
oExcel.Interactive = False
oExcel.DisplayAlerts = False
oExcel.Visible = False
oWorkBook = oExcel.Workbooks.Open(MyTemplate)
oSheet = oWorkBook.Worksheets(1)
'指定 cell(1,1) 的 Formula
oSheet.Range(oSheet.Cells(1,1),oSheet.Cells(1,1)).Formula="=MyDDHHMM(A1)"
註:Excel 的自訂函數要寫在 Module 裡面,才可以 Reference 到
你要的是用C#呼叫VBA Function 嗎? 首先巨集安全性不能設高
可以嘗試呼叫WScript 的方法 啟動帶引數的Excel,並執行巨集,
當然
你也可以用C#先將值塞到Excel模板, 當呼叫啟動Excel時,在Excel的VBA 的ThisWorkbook那一頁裡寫程式,讓啟動Excel時,自動呼叫VBA function.
這Template模板 有最後的的動作就是將Excel, SaveAS出來,並將有VBA程式碼的那頁Worksheets砍掉 所得到的最後結果不會有VBA 巨集開啟的問題,保留樞紐分析在儲存格的功能.所以執行時,巨集安全性設定是一個很大的問題.因為要執行VBA一定不能將巨集安全性設為高