| 分類:[C#]
Microsoft.Office.Interop.Excelを使用してC#からExcelのFunctionを呼んでその戻り値を取得したいと思っています。
VBAは以下のものを「標準モジュール」の場所に作り、Excel上で実行した時は正常に動作することを確認しています。 (JsonConverterも標準モジュールにインポートしてあります)
Public Function ToDotNet() As String Dim json As Object Set json = CreateObject("Scripting.Dictionary") Dim sheet As Worksheet Dim arinashi As Boolean If Sheets(1).rbtnAri.Value Then arinashi = True Else arinashi = False End If json.Add "AriNashi", arinashi json.Add "Check1", Sheets(1).chk1.Value json.Add "Check2", Sheets(1).chk2.Value json.Add "Check3", Sheets(1).chk3.Value
ToDotNet = JsonConverter.ConvertToJson(json)
End Function
これをC#から実行してjsonを受け取るために以下のコードを書きました。
Microsoft.Office.Interop.Excel.Application app = null; try { app = new Microsoft.Office.Interop.Excel.Application(); app.Visible = true; var fi = new FileInfo("Template\\template.xlsm"); var book = app.Workbooks.Open(fi.FullName); var ret = app.Run("ToDotNet"); book.Close(); Marshal.ReleaseComObject(book); richTextBox1.Text = ret; } catch (Exception ex) { MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { if (app != null) { app.Quit(); } app = null; }
結果は 「マクロ'ToDotNet'を実行できません。このブックでマクロが使用できないか、またはすべてのマクロが無効になっている可能性があります。」 となります。
Excelのセキュリティ設定(マクロとActiveXコントロール)をすべて有効(セキュリティなし)にしてみたり、 app.Run("ToDotNet"); の引数を "'ブック名'!ToDotNet にしたり、 "'Excelファイルのフルパス'!ToDotNet" にしたりしてみましたがすべて同じでした。
どうすれば実行できますか? |