2

これは、F#Excelで開始された議論の続きです。UsedRangeis 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へのダウンキャストでは、VisualStudioは次のように警告します。「このタイプのテストまたはダウンキャストは常に保持されます」。

範囲は動作します。UsedRangeはRangeとして認識されます。したがって、UsedRangeは機能するはずです。しかし、そうではありません。矛盾が残っています。

Visual Studio 2010 Premium、F#2.0。

提供された洞察に感謝します。ありがとう。

4

1 に答える 1

4

F# プロジェクトが、必要なすべての相互運用アセンブリの正しいバージョンを参照していることは確かですか? F# スクリプト ファイルでコードを試してみたところUsedRange、次の行を追加した後に罰金のメンバーが表示されます。

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

EntireColumnandのようなメンバーが表示されますが、スニペットの 1 行が文字列と整数でSort使用しようとしていることに不満を言うだけです。+

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

これを Visual Studio 2010 でスクリプト ファイルとして、また新しいプロジェクトでも試しました (2 つの参照を追加した後、問題なく動作しているようです)。dllVisual Studio インストール ディレクトリの "Visual Studio Tools for Office\PIA" の下にインストールされているへの参照を追加しました。

于 2012-10-23T21:32:37.980 に答える