F#Excel UsedRange没有属性或方法

时间:2012-10-23 21:00:27

标签: excel f# vsto office-interop

这是在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。

我感谢所提供的任何见解。感谢。

1 个答案:

答案 0 :(得分:4)

您确定您的F#项目引用了所有必要互操作程序集的正确版本吗?我刚刚在F#脚本文件中尝试了您的代码,在添加以下行后我可以看到UsedRange的成员很好:

#r "office.dll"
#r "Microsoft.Office.Interop.Excel.dll"

我可以看到EntireColumnSort等成员,并且只会抱怨代码段中的一行尝试对字符串和整数使用+

xl.Range("A2").AutoFill(xl.Range("A2:A" + (string ws.UsedRange.Rows.Count)), 
                        XlAutoFillType.xlFillSeries) |> ignore 

我在Visual Studio 2010中尝试将其作为脚本文件,并在新项目中添加(在添加两个引用之后,它似乎正常工作)。我添加了对Visual Studio安装目录中“Visual Studio Tools for Office \ PIA”下安装的dll的引用。