2017-07-27 79 views
0

我想将下拉列表添加到使用c#的范围。C#excel数据验证下拉列表throwserror

这是我迄今为止所做的。

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

这是堆栈跟踪
在System.RuntimeType.ForwardCallToInvokeMember(字符串成员名称,的BindingFlags标记,对象目标,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,对象[] 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 invokeAtt r,Binder binder,Object target,Object [] args,ParameterModifier []修饰符,CultureInfo culture,String [] namedParameters)

回答

1

命令序列是不正确的。将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对象,并且应该将其转换为对象所代表的任何对象(很可能是Excel.Range)。您还需要对VB的索引属性进行等效方法调用的校正。:Range("a1")get_Range("a1"))。

编辑:我原来没有检查您的Add语句的语法,但看起来您缺少一个参数。

documentation

和你Add staterment:

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

看样子你缺少的Operator参数。使用宏记录器,看起来默认值是XlFormatConditionOperator.xlBetween

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

+0

我不能现在检查,如果这是正确的,但对如何获得VBA代码作为指导建议+1。 OP,许多VBA开发人员为我们已经忘记的对象模型的一部分做了这些工作。这是一个体面的起点修正... – MacroMarc

+0

我试过......但它仍然是相同的...... –

+0

@CharithLankathilake,看到我编辑的信息。 – TnTinMn

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; 

希望有所帮助。

+0

它不起作用,然后在ignoreblank行异常抛出, 我试着将ignoreblank行移动到最后,然后它抛出添加方法。它继续抛出相同的异常。 –

+0

嗨罗兰, 有没有其他的方式来添加下拉列表到单元格? 任何想法将不胜感激... –