C# + Excel-DNA で実行中のワークシート関数コード内で現在のセルを取得する方法は?
VBAとVBAエディタが好きになれず、どうにかC#でワークシート関数が作れないものだろうかと探していると数日前に"Excel-DNA"に出会いました。
Visual Studio 2017 + NuGet 環境であまりにも簡単にワークシート関数やアドインが作れることにびっくりしております。
分からない所が2点あります。
1、実行中のワークシート関数コード内で現在のセルを取得する方法がわかりません。
※ワークシート関数コード内での現在セル取得にあたりシートやセルがアクティブになるかならないかは不定です。
2、ワークシート関数コード内で "SetValue" でセルに値を書き込んでも反映されません。
※アドインコード内で使用すると反映される。
解決につながるヒントや参考になるサイトでも構いませんのでご教授をお願いいたします。
.
1、でのコードイメージ(正しいコードがわからないので)
using ExcelDna.Integration;
public static class MyFunctions
{
[ExcelFunction(Description = "Testコード")]
public static string Test() // Test() ワークシート関数定義
{
var myCell = なんらかのコード; // Test()ワークシート関数内のコード(正にここ)で関数実行中のセル(特に位置)を取得したい。
return myCell.ToString();
}
}
.
2、で使用した実験コードです。
using ExcelDna.Integration;
public static class MyFunctions
{
[ExcelFunction(Description = "My first .NET function")]
public static string HelloDna(string name) // HelloDna(string) ワークシート関数定義
{
new ExcelReference(0, 0).SetValue("Hello " + name); // セルA1に反映されない
return "Hello " + name; // A2セルに =HelloDna("hoge") と書くとA2セルに "Hello hoge" と表示される
}
}
.
【その後調べて分かったこと】
1、の問題の根本的解決ではありませんが、引数の頭に
Test([ExcelArgument(AllowReference = true)] object myCell)
を加えて、A1セルに =Test(A1) とすると、(ExcelReference)myCell で位置情報が取得できました。
1、を解決するコードがわかりました。
var myCell = (ExcelReference)XlCall.Excel(XlCall.xlfCaller);
.
2、の問題は仕様でワークシート関数内から他のセルを変更できないようになっているようです。
実現する方法のヒントは書かれていましたが私には理解不能で諦めました orz
https://groups.google.com/forum/#!searchin/exceldna/udf$20setvalue|sort:date/exceldna/pvoeKZS9GO0/txWV1Jrx7Q4J
.
環境
Windows 10
Microsoft Excel 2016
Visual Studio 2017
Excel-DNA 0.34.6
参考リンク
Excel-DNA 公式 : https://excel-dna.net/
CodePlex : https://exceldna.codeplex.com/
NuGet : https://www.nuget.org/packages/Excel-DNA/
GitHub : https://github.com/Excel-DNA/ExcelDna
GoogleGroups : https://groups.google.com/forum/#!forum/exceldna
日本語Wiki : http://wiki.clockahead.com/index.php?cmd=read&page=Coding%2F.NET%2FOffice%2FExcelDNA