来自HRESULT的exception:0x800A03EC INDIRECT

我想从c#运行excel间接函数。 我使用了下面的代码,但得到了exception

“在System.Dynamic.dll中发生types'System.Runtime.InteropServices.COMException'的第一次机会exception”

附加信息:来自HRESULT的exception:0x800A03EC

Excel.Range vehicle_makes_dropdown = xlWorkSheet1.get_Range("B2", "B101"); vehicle_makes_dropdown.Formula = "=indirect(A2)"; vehicle_makes_dropdown.Validation.Add(Excel.XlDVType.xlValidateList, XlDVAlertStyle.xlValidAlertInformation, XlFormatConditionOperator.xlEqual, vehicle_makes_dropdown.Formula, misValue); vehicle_makes_dropdown.Validation.IgnoreBlank = true; vehicle_makes_dropdown.Validation.InCellDropdown = true; 

更新的代码是

 Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbook wlb = app.Workbooks.Open(@"D:\Templates2.xlsx"); Microsoft.Office.Interop.Excel.Worksheet MySheet = (Microsoft.Office.Interop.Excel.Worksheet)wlb.Sheets[1]; Microsoft.Office.Interop.Excel.Range oRange; // Get Subject // string subjetcs = string.Empty; //List<Topics> lstsubject = PickSubject(out subjetcs); AdminQuestionCommonModel objAdminQuestioncommonModel = new AdminQuestionCommonModel(); // _Question.BindQuestionDropDowns(objAdminQuestioncommonModel); objAdminQuestioncommonModel.ExcelTopics = _Question.GetTopics(subjectId); List<SubjectBO> lstTopics = GlobalService.GetAllTopicsandSubtopics(5, subjectId, 0); // get all topics of Subjects //if (lstsubject.Count > 0) if (lstTopics.Count > 0) { Microsoft.Office.Interop.Excel.Worksheet IDSheet = (Microsoft.Office.Interop.Excel.Worksheet)wlb.Sheets[2]; int rows = 1; int subrows = 1; IDSheet.Unprotect("123#"); //foreach (var item in lstsubject) foreach (var Topic in lstTopics) { var TopicName = Topic.Topic_SubTopic.Trim(); TopicName = TopicName.Replace(".", "_").Replace("&", "_").Replace(" ", "_").Replace("__", "_"); // Add the header the first time through IDSheet.Cells[rows, 1] = Topic.SubjectTopicId.ToString(); IDSheet.Cells[rows, 2] = TopicName; // List<SubTopics> lst = PickSubTopic(item.TopicName, item.TopicID); List<SubjectBO> lstsubtopics = _Question.GetSubTopics(subjectId, Topic.SubjectTopicId); int startindex = subrows; foreach (var subtopics in lstsubtopics) { IDSheet.Cells[subrows, 4] = subtopics.Topic_SubTopic; IDSheet.Cells[subrows, 5] = subtopics.SubjectTopicId.ToString(); IDSheet.Cells[subrows, 6] = TopicName; IDSheet.Cells[subrows, 7] = Topic.SubjectTopicId.ToString(); subrows++; } if (lstTopics.Count > 0) { wlb.Names.Add(TopicName, IDSheet.get_Range("D" + startindex + ":D" + (subrows - 1))); } subrows++; rows++; } wlb.Names.Add("Topics", IDSheet.get_Range("B1:B" + (rows - 1))); Microsoft.Office.Interop.Excel.Range Range = MySheet.get_Range("B2", "B800"); Range.Validation.Delete(); Range.NumberFormat = "Text"; //Range.Cells.Value = lstsubject[0].TopicName.ToString(); Range.Cells.Value = "Text"; Range.Validation.Add(Microsoft.Office.Interop.Excel.XlDVType.xlValidateList, Microsoft.Office.Interop.Excel.XlDVAlertStyle.xlValidAlertStop , Microsoft.Office.Interop.Excel.XlFormatConditionOperator.xlBetween , Formula1: "=Topics" ); Range.Validation.InCellDropdown = true; Range.Validation.IgnoreBlank = true; oRange = MySheet.get_Range("c2","c3"); oRange.Validation.Delete(); oRange.NumberFormat = "Text"; oRange.Validation.Add(Microsoft.Office.Interop.Excel.XlDVType.xlValidateList, Microsoft.Office.Interop.Excel.XlDVAlertStyle.xlValidAlertStop , Microsoft.Office.Interop.Excel.XlFormatConditionOperator.xlBetween , Formula1: "=INDIRECT(B2)" ); oRange.Validation.InCellDropdown = true; oRange.Validation.IgnoreBlank = true; IDSheet.Protect("123#"); //Range.Validation.InCellDropdown = true; //Range.Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.FromArgb(255, 217, 217, 0)); app.Visible = true; } 

你需要在你的单元格引用里面加上双引号: vehicle_makes_dropdown.Formula = "=indirect(""A2"")";

 oRange.Validation.Add(Microsoft.Office.Interop.Excel.XlDVType.xlValidateList, Microsoft.Office.Interop.Excel.XlDVAlertStyle.xlValidAlertStop, Microsoft.Office.Interop.Excel.XlFormatConditionOperator.xlBetween, Formula1: "=INDIRECT(if(B2=\"\",A5000,B2))" 

//另请参阅http://user.qzone.qq.com/26149705/blog/1474296940