|
分類:[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"
にしたりしてみましたがすべて同じでした。
どうすれば実行できますか?
|