1

F# ベースのアドインで Excel の名前付き範囲のデータを取得しようとしています。特定のワークシートだけでなく、ブック内のどこでも名前付き範囲を使用できるようにしたいと考えています。

let xlRange (xl:Microsoft.Office.Interop.Excel.Application, name:string) =
    let name_list = xl.ThisWorkbook.Names:Microsoft.Office.Interop.Excel.Names
    let mutable result=null
    for n in name_list do
        let nn = n :?> Microsoft.Office.Interop.Excel.Name
        if nn.Name = name then
            let range=nn.RefersToRange
            result <- range.Value2 :?> obj[,]
    result

上記のコードは機能しますが、可変で命令型のスタイルを使用する必要があったため、私は好きではありません。問題は、Excel.Names コレクションがうまく動作しないことです。例えば

let name_seq = Seq.toList name_list

与える

タイプ 'Names' はタイプ 'seq<'a>' と互換性がありません

これを行うためのより F# 慣用的な方法はありますか?

4

2 に答える 2

0

Seqを使用できませんでした。互換性のないタイプのために直接物事。コレクションをF#リストに変換し、上記のように処理できるようにすることを目的としたこの関数を作成しました。正常にコンパイルされましたが、テストしませんでした...

let xlNamesToList names =
    let rec xlNameList_r (names:Microsoft.Office.Interop.Excel.Names) idx =
        if idx>names.Count then // should this be >= ?
            []
        else
            names.Item(idx)::xlNameList_r names (idx+1)
    xlNameList_r names 0

...それから私はそれを直接行うためのより簡単な方法を見つけました:

let xlRange (xl:Microsoft.Office.Interop.Excel.Application, name:string) =
    try
        let r=xl.ThisWorkbook.Names.Item(name :> obj).RefersToRange
        Some(r.Value2 :?> obj[,])
    with
        | _ -> None

助けてくれてありがとう!

于 2012-07-09T11:19:24.727 に答える