C# で記述された自動テスト アプリケーションに含まれる Excel スプレッドシートがあります。テスト アプリはシートに最終的な統計情報を入力し、スプレッドシートを使用して指標を生成します。その手順の一部として、ドロップダウンをスプレッドシートの L 列に配置し、関連する VBA 変更イベントをアプリからシートに書き込みます。
ドロップダウンをスプレッドシート Excel.DropDown xlDropDown に書き込むコードを次に示します。
//set range for insert cell
range = wrkSheet.get_Range("L" + (x + 9).ToString() + ":L" + (x + 9).ToString());
//insert the dropdown into the cell
xlDropDown = xlDropDowns.Add((double)range.Left, (double)range.Top, (double)range.Width, (double)range.Height, true);
//set the nbame of the new dropdown
xlDropDown.Name = "expFail" + (x + 1).ToString();
//assign dropdown name to cmbName
cmbName = xlDropDown.Name;
//call function to write change macro for this box
cmbWriteMacro(cmbName, xlApp, xlBook, wrkSheet);
cmbWrite 関数:
StringBuilder sb;
VBA.VBComponent xlModule;
VBA.VBProject prj;
string modName;
int modExists;
prj = wrkBook.VBProject;
modExists = 0;
sb = new StringBuilder();
//build string with module code
sb.Append("Sub " + cmbName + "_Change()" + "\n");
sb.Append("\t" + "Call lstBox_Update(" + cmbName + ")" + "\n");
sb.Append("End Sub");
foreach (VBA.VBComponent comp in prj.VBComponents)
{
modName = comp.Name;
if (modName == "Module2")
{
modExists = 1;
break;
}
}
//check to see if module already exists
if (modExists != 1)
{
//set an object for the new module to create
xlModule = wrkBook.VBProject.VBComponents.Add(VBA.vbext_ComponentType.vbext_ct_StdModule);
}
else
{
xlModule = wrkBook.VBProject.VBComponents.Item("Module2");
}
//add the cmbbox macro to the spreadsheet
xlModule.CodeModule.AddFromString(sb.ToString());
これにより、次の VBA イベントがスプレッドシートに書き込まれ、エラーが記録されたときにシートでアクションが実行されます。
Sub expFail1_Change(ByVal Target As Range)
Call lstBox_Update("expFail1")
End Sub
すべてのドロップダウンは、選択内容に基づいて同じ関数 (lstBox_Update) を呼び出します。
すべて正常に動作しています。ドロップダウンは必要な場所に表示され、マクロはスプレッドシートに正しく書き込まれています。問題は、選択が変更されたときに関連する変更イベントが発生するようです。解決策はおそらく簡単ですが、私はすべてを見てきましたが、答えが見つからないようです