C#excel数据validation下拉列表throwserror

我试图添加下拉列表使用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); 

在第三行的代码它抛出exception
来自HRESULT的exception:0x800A03EC

ErrorImage

这是堆栈跟踪
在Microsoft.Office.Interop.Excel.Validation.set_InCellDropdown(布尔)在MS.ProductionPlanningTool.Excel.Ribbon_PPT.ribbon_signin_Click(在System.RuntimeType.ForwardCallToInvokeMember(stringmemberName,BindingFlags标志,对象目标,Int32 [] aWrapperTypes,MessageData和msgData) D:\ MidasCloud \ CloudTFS \ ProductionPlanning \ MSP2 \ MS.ProductionPlanningTool.Excel \ UI \ Ribbon_PPT.cs中的对象发件人,RibbonControlEventArgs e):位于Microsoft.Office.Tools.Ribbon.RibbonPropertyStorage.ControlActionRaise(IRibbonControl控件)的1328行.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 []参数,CultureInfo culture)在Microsoft.Office.Tools.Ribbon.RibbonManagerImpl.System.Reflection.IReflect.InvokeMe mber(String name,BindingFlags invokeAttr,Binder binder,Object target,Object [] args,ParameterModifier []修饰符,CultureInfo culture,String [] namedParameters)

命令的顺序不正确。 将Add语句移到Delete语句之后。 如果validation不存在,则不能在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中的macroslogging器获取操作的语法。 虽然输出是在VBA中,但语法却没有什么不同,您无法解密命令并转换为C#。 VBA足够接近VB.Net,VB到C#转换器将产生可以清理和使用的代码。 唯一的问题是macroslogging器大量使用Selection对象,并且应该将其转换为Selection对象表示的任何对象(很可能是Excel.Range )。 您还需要将VB的索引属性更正为等效的方法调用(即: Range("a1") – > get_Range("a1") )。

编辑:我原来没有检查您的Add语句的语法,但它似乎是缺less一个参数。

从文档 :

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

和你的Add staterment:

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

看起来你缺lessOperator参数。 使用macroslogging器,看起来默认值是XlFormatConditionOperator.xlBetween

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

尝试将“.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; 

希望有所帮助。

试着看看这个,它可能会帮助你:

(关注第2部分 – 限制列表中的预定义项目)

https://www.codeproject.com/Tips/1089368/Apply-Data-Validation-to-Excel-Cells-in-Csharp