C# Excel数据验证下拉列表抛出错误

3
我正在尝试使用c#向范围添加下拉列表。 目前为止,我已经完成了以下工作。
 Worksheet ws = PPTAddIn.thisAddin2Obj.Application.ActiveWorkbook.ActiveSheet;
            ws.get_Range("a1").Validation.Delete();
            ws.get_Range("a1").Validation.InCellDropdown = true;
            ws.get_Range("a1").Validation.IgnoreBlank = true;
            ws.get_Range("a1").Validation.Add(XlDVType.xlValidateList, XlDVAlertStyle.xlValidAlertWarning, "opt1,opt2,opt3", Missing.Value);

代码的第三行抛出以下异常:
HRESULT: 0x800A03EC异常

ErrorImage

以下是堆栈跟踪:

   at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)    at Microsoft.Office.Interop.Excel.Validation.set_InCellDropdown(Boolean ) at MS.ProductionPlanningTool.Excel.Ribbon_PPT.ribbon_signin_Click(Object sender, RibbonControlEventArgs e) in D:\MidasCloud\CloudTFS\ProductionPlanning\MSP2\MS.ProductionPlanningTool.Excel\UI\Ribbon_PPT.cs:line 1328    at Microsoft.Office.Tools.Ribbon.RibbonPropertyStorage.ControlActionRaise(IRibbonControl control)    at Microsoft.Office.Tools.Ribbon.RibbonPropertyStorage.ButtonClickCallback(RibbonComponentImpl component, Object[] args)    at Microsoft.Office.Tools.Ribbon.RibbonManagerImpl.Invoke(RibbonComponentCallback callback, Object[] args)    at Microsoft.Office.Tools.Ribbon.RibbonMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)    at Microsoft.Office.Tools.Ribbon.RibbonManagerImpl.System.Reflection.IReflect.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters)
4个回答

5
命令的顺序不正确。将Add语句移动到Delete语句之后。如果不存在验证,则无法在Validation对象上设置其他值。
Worksheet ws = PPTAddIn.thisAddin2Obj.Application.ActiveWorkbook.ActiveSheet;
ws.get_Range("a1").Validation.Delete();
ws.get_Range("a1").Validation.Add(XlDVType.xlValidateList, XlDVAlertStyle.xlValidAlertWarning, "opt1,opt2,opt3", Missing.Value);
ws.get_Range("a1").Validation.InCellDropdown = true;
ws.get_Range("a1").Validation.IgnoreBlank = true;

附注:

在Excel中使用宏录制器获取操作的语法。虽然输出是VBA,但语法并不那么不同,你可以理解命令并将其转换为C#。VBA与VB.Net非常接近,因此VB到C#转换器将生成代码,您可以清理并使用。唯一的问题是宏记录器广泛使用Selection对象,您应将其转换为Selection对象表示的内容(最可能是Excel.Range)。您还需要进行VB索引属性的更正,以等效的方法调用替换(例如:Range("a1") -> get_Range("a1"))。

编辑:我最初没有检查您的Add语句的语法,但似乎缺少一个参数。

来自文档

void Add(
    XlDVType Type,
    Object AlertStyle,
    Object Operator,
    Object Formula1,
    Object Formula2
)

还有你的Add语句:

Add(XlDVType.xlValidateList, 
    XlDVAlertStyle.xlValidAlertWarning, 
    "opt1,opt2,opt3", 
    Missing.Value)

看起来你缺少了Operator参数。使用宏录制器,可以看出默认值为XlFormatConditionOperator.xlBetween

你还应该定义一个Validation对象,并使用它来设置/调用每个属性/方法,而不是使用ws.get_Range("a1").Validation


我现在无法确认这是否正确,但感谢提供如何将VBA代码作为指南的建议。许多VBA开发人员会为我们忘记的对象模型部分这样做。这是一个不错的修改起点... - MacroMarc
1
@TnTinMn,你忘记传递操作符参数的值了。在我的情况下,它是Missing.Value。在我弄清楚之前,我一直遇到异常。 - Jayakrishnan
另外需要注意的是:工作表必须取消保护才能添加数据验证(即使保护是仅限用户界面)。这就是我的问题所在。 - Jacob Andrews

1

尝试将您的".InCellDropDown = true"移动到代码末尾。

我的意思是:

 Worksheet ws = PPTAddIn.thisAddin2Obj.Application.ActiveWorkbook.ActiveSheet;
            ws.get_Range("a1").Validation.Delete();
            ws.get_Range("a1").Validation.IgnoreBlank = true;
            ws.get_Range("a1").Validation.Add(XlDVType.xlValidateList, XlDVAlertStyle.xlValidAlertWarning, "opt1,opt2,opt3", Missing.Value);
            ws.get_Range("a1").Validation.InCellDropdown = true;

希望这可以帮到你。


它在 ignoreblank 行不起作用,然后抛出异常, 我尝试将 ignoreblank 行移动到最后,然后它在 add 方法处抛出。它继续抛出相同的异常。 - Charith Lankathilake
你好,Roland, 有没有其他方法可以将下拉列表添加到单元格中? 任何想法都将不胜感激... - Charith Lankathilake

1

感谢被接受的答案帮我解决了大部分问题,但不幸的是一开始它并没有起作用。正如Jayakrishnan在那个答案下的评论中正确指出的那样,有一个缺少的参数。因为像我这样的未来访问者可能会很长时间不查看这些评论,所以我将在此发布我的代码。我的代码展示了使用命名参数跳过可选运算符参数的用法。它还展示了如何添加数据验证作为一个函数,该函数接受任何字符串列表(我只是事先进行.join操作!)。享受。

public void SetDropdownValidation(params string[] values)
{
    string valuesJoined = string.Join(",", values);
    Validation validation = RawRange.Validation;
    validation.Delete();
    validation.Add(XlDVType.xlValidateList, XlDVAlertStyle.xlValidAlertWarning, Formula1: valuesJoined, Formula2: Missing.Value);
    validation.InCellDropdown = true;
}

注意事项

  • 此函数是在一个类的上下文中编写的,其中RawRange是类型为Range的成员变量。
  • 这段代码可以进行微调/更加灵活地处理诸如IgnoreBlank之类的东西,但基本思路就在上面了。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接