Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#excel数据验证下拉列表throwserror_C#_.net_Excel - Fatal编程技术网

C#excel数据验证下拉列表throwserror

C#excel数据验证下拉列表throwserror,c#,.net,excel,C#,.net,Excel,我正在尝试使用c#将下拉列表添加到一个范围中 这就是我到目前为止所做的 Worksheet ws = PPTAddIn.thisAddin2Obj.Application.ActiveWorkbook.ActiveSheet; ws.get_Range("a1").Validation.Delete(); ws.get_Range("a1").Validation.InCellDropdown = true

我正在尝试使用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

这是堆栈跟踪

   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)
尝试将“.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部分-限制列表中预定义项的输入)


命令顺序不正确。将
Add
语句移动到
Delete
语句之后。如果验证不存在,则不能在
验证
对象上设置其他值

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的转换器将生成您可以清理和使用的代码。唯一的问题是宏记录器广泛使用
选择
对象,您应该将其转换为
选择
对象表示的任何内容(很可能是
Excel.Range
)。您还需要将VB的索引属性更正为等效的方法调用(即:
Range(“a1”)
->
get\u Range(“a1”)

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

从:

以及您的
添加
状态:

Add(XlDVType.xlValidateList, 
    XlDVAlertStyle.xlValidAlertWarning, 
    "opt1,opt2,opt3", 
    Missing.Value)
您似乎缺少
运算符
参数。使用宏记录器时,默认值似乎是
XlFormatConditionOperator.xlBetween


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

多亏了公认的答案,让我在大部分情况下都做到了这一点,但遗憾的是,它首先没有起作用。正如Jayakrishnan在该答案下的评论中正确指出的那样,缺少一个paramater。因为像我这样的未来访问者可能会有一段时间看不到这些评论,所以我将在这里发布我的代码。我的代码显示了使用命名参数跳过可选运算符参数的情况。它还展示了如何将数据验证作为一个函数添加到任何字符串列表中(我只是事先做了一个.join!)。享受

笔记
  • 此函数是在类的上下文中编写的,其中
    RawRange
    Range
    类型的成员变量
  • 这段代码可以调整/变得更灵活,以处理像IgnoreBlank这样的东西,但基本思想在上面

它不起作用,然后异常在ignoreblank行抛出,我尝试将ignoreblank行移到末尾,然后它在add方法抛出。它继续抛出相同的异常。嗨,罗兰,有没有其他方法将下拉列表添加到单元格中?任何想法都将不胜感激…我现在无法检查这是否正确,但是+1提供了有关如何获得VBA代码作为指南的建议。很多VBA开发人员这样做是为了我们已经忘记的对象模型。这是一个不错的修改起点…@TnTinMn,您没有传递运算符参数的值。在我的情况下,它丢失了。还有一件事需要注意:工作表必须不受保护才能添加数据验证(即使保护是UserInterfaceOnly)。这是我的问题
Add(XlDVType.xlValidateList, 
    XlDVAlertStyle.xlValidAlertWarning, 
    "opt1,opt2,opt3", 
    Missing.Value)
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;
}