我正在尝试使用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);
在第3行代码中抛出异常
来自HRESULT的异常:0x800A03EC
https://nodejs.org/api/https.html
这是堆栈跟踪
at System.RuntimeType.ForwardCallToInvokeMember(String memberName,BindingFlags flags,Object target,Int32 [] aWrapperTypes,MessageData& msgData)
在Microsoft.Office.Interop.Excel.Validation.set_InCellDropdown(布尔)
在MS:.ProductionPlanningTool.Excel.Ribbon_PPT.ribbon_signin_Click(Object sender,RibbonControlEventArgs e)在D:\ MidasCloud \ CloudTFS \ ProductionPlanning \ MSP2 \ MS.ProductionPlanningTool.Excel \ UI \ Ribbon_PPT.cs:第1328行
在Microsoft.Office.Tools.Ribbon.RibbonPropertyStorage.ControlActionRaise(IRibbonControl控件)
在Microsoft.Office.Tools.Ribbon.RibbonPropertyStorage.ButtonClickCallback(RibbonComponentImpl组件,Object [] args)
在Microsoft.Office.Tools.Ribbon.RibbonManagerImpl.Invoke(RibbonComponentCallback回调,对象[] args)
在Microsoft.Office.Tools.Ribbon.RibbonMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化)
在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)< / p>
答案 0 :(得分:1)
尝试移动你的&#34; .InCellDropDown = true&#34;到代码的末尾。
我的意思是:
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;
希望有所帮助。
答案 1 :(得分: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
对象,您应该将其转换为Selection
对象所代表的任何内容(很可能是Excel.Range
)。您还需要对VB的索引属性进行等效方法调用的修正(即:Range("a1")
- &gt; 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
来设置/调用每个属性/方法。
答案 2 :(得分:0)
试着看看这个,它可能对你有帮助:
(重点关注第2部分 - 限制列表中预定义项目的输入)
https://www.codeproject.com/Tips/1089368/Apply-Data-Validation-to-Excel-Cells-in-Csharp
答案 3 :(得分:0)
感谢大家普遍接受我的回答,但可惜它并没有首先起作用。由于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
的成员变量的类的上下文中编写的。