iT邦幫忙

0

如何用 c# 在excel 加入 function?

我有一支程式,要計算加班時數的樞鈕分析。原始資料是分鐘數,呈現結果是要 日:時:分。時:分的部份好做,難在於日的計算。不同的人會有不同的工作時數的定義。比如說甲上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?

16
protech
iT邦新手 2 級 ‧ 2009-10-02 19:20:57
最佳解答

微軟本身就有答案,不過這是VB的版本,你可能要自己改寫成C#。

12
jamesjan
iT邦高手 1 級 ‧ 2009-10-02 16:20:39

就您的需求來看,要透過程式產生 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 到

Brandon iT邦新手 4 級 ‧ 2009-10-02 17:01:35 檢舉

謝謝你的回答。不過就我的CASE,我不想用範本檔,因為這表示還要COPY 檔案到 USER的電腦,這就會牽涉到一堆問題(沒有寫入權限等之類的)。還是希望能直接在程式碼裡就做到 AddFunction 之類的動作。

jamesjan iT邦高手 1 級 ‧ 2009-10-05 08:27:18 檢舉

並不需要 Copy 檔案到 User 的電腦,只是將 Template Load 到 Excel 而已(Template 檔可以放在可以存取的到的地方),不過如果您不想透過這種方式,protech 大提的方式應該可以 work.

18
daweiliu
iT邦新手 5 級 ‧ 2009-10-02 17:55:16

你要的是用C#呼叫VBA Function 嗎? 首先巨集安全性不能設高
可以嘗試呼叫WScript 的方法 啟動帶引數的Excel,並執行巨集,
當然
你也可以用C#先將值塞到Excel模板, 當呼叫啟動Excel時,在Excel的VBA 的ThisWorkbook那一頁裡寫程式,讓啟動Excel時,自動呼叫VBA function.
這Template模板 有最後的的動作就是將Excel, SaveAS出來,並將有VBA程式碼的那頁Worksheets砍掉 所得到的最後結果不會有VBA 巨集開啟的問題,保留樞紐分析在儲存格的功能.所以執行時,巨集安全性設定是一個很大的問題.因為要執行VBA一定不能將巨集安全性設為高

我要發表回答

立即登入回答