C#excel数据验证下拉列表throwserror
我正在尝试使用c#将下拉列表添加到一个范围中 这就是我到目前为止所做的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
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;
}