这是从F# Excel UsedRange is not Defined开始的讨论的继续,已通过将ActiveSheet对象下放到工作表来解决。但是,这样做之后,我遇到了一个新问题:UsedRange除了标准对象方法外,不公开任何属性或方法。
我的解决方案引用了Microsoft.Office.Interop.Excel和Microsoft.Office.Tools.Excel.v4.0.Utilities。
open Microsoft.Office.Interop.Excel
open Microsoft.Office.Tools.Excel
let xl = ApplicationClass()
xl.Workbooks.OpenText(fileName)
let wb = xl.Workbooks.Item(1)
let ws = wb.ActiveSheet :?> Worksheet
ws.UsedRange.EntireColumn.AutoFit()
// "The field, constructor or member 'EntireColumn' is not defined".
ws.UsedRange.Sort(xl.Range(sortKey1), XlSortOrder.xlAscending)
// "The field, constructor or member 'Sort' is not defined".
xl.Range("A2").Value <- 1
xl.Range("A2").AutoFill(xl.Range("A2:A" + ws.UsedRange.Rows.Count),
XlAutoFillType.xlFillSeries) |> ignore
// "The field, constructor or member 'Rows' is not defined".
ws.UsedRange.
// Intellisense shows only default object members, e.g. Equals, GetEnumerator, etc.
我可以毫无问题地使用Range:
xl.Range("A1").EntireColumn.Insert() |> ignore
UsedRange被识别为范围。向下转换到Range时,Visual Studio警告我:“此类型测试或向下转换将始终有效”。
范围工程。
UsedRange被识别为Range。
因此,UsedRange应该可以工作。
但事实并非如此。我充满矛盾。
Visual Studio 2010 Premium,F#2.0。
我感谢提供的任何见解。谢谢。
最佳答案
您确定您的F#项目引用了所有必需的互操作程序集的正确版本吗?我只是在F#脚本文件中尝试了您的代码,添加以下行后可以看到UsedRange
的成员:
#r "office.dll"
#r "Microsoft.Office.Interop.Excel.dll"
我可以看到像
EntireColumn
和Sort
这样的成员,它只抱怨代码片段中的一行试图对字符串和整数使用+
:xl.Range("A2").AutoFill(xl.Range("A2:A" + (string ws.UsedRange.Rows.Count)),
XlAutoFillType.xlFillSeries) |> ignore
我在Visual Studio 2010中将其作为脚本文件以及在新项目中进行了尝试(添加两个引用之后,它似乎可以正常工作)。我添加了对在Visual Studio安装目录中的“ Office \ PIA的Visual Studio工具”下安装的
dll
的引用。