3

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) を呼び出します。

すべて正常に動作しています。ドロップダウンは必要な場所に表示され、マクロはスプレッドシートに正しく書き込まれています。問題は、選択が変更されたときに関連する変更イベントが発生するようです。解決策はおそらく簡単ですが、私はすべてを見てきましたが、答えが見つからないようです

4

3 に答える 3

1

あなたのコードに基づいて小さな例を作成しました。グーグルでいくつかのソースコードをテストした後、1行のコードにたどり着きます

xlDropDown.Name = "expFail" + (x + 1).ToString(); // your code
xlDropDown.OnAction = xlDropDown.Name + "_Change"; // new code: IMPORTANT

このコードは、Microsoft KB 記事 How To Create an Excel Macro by Using Automation from Visual C# .NETで見つかりました。

カスタム vba コードを指すある種のデリゲートを設定するには、このコード行が必要なようです。

私の完全なソースが必要な場合はお知らせください。メールでお送りします。

于 2013-02-13T21:05:31.807 に答える
0

この記事に基づいて、Worksheet_Changeイベントではなくイベントにコードを記述する必要がありますComboBox_Change

Sub Worksheet_Change(ByVal Target As Range)
    Call lstBoxUpdate("expFail1")
End Sub
于 2013-02-13T16:20:37.637 に答える