功能编程Excel代码

时间:2013-10-30 01:31:08

标签: excel f# add-in excel-dna

我用F#和Excel-DNA重写我的Excel VBA加载项。下面的Formula1有效。它遍历当前选定的单元格并对每个单元格值应用修剪。

Formula2是我在应用Functional和F#概念时失败的尝试。我不确定如何将范围返回到Excel。公式必须返回一个单位。

有人可以帮助我吗?

Formula1(Works):

let Trim (rng:Range) = 
    for cell in rng.Cells do
        let cel = cell :?> Range       
        if not (cel :? ExcelEmpty) then
            cel.Formula <- cel.Formula.ToString().Trim()

Formula2(不起作用):

let Trim2 (values:obj[,]) =  
    values
    |> Seq.cast<obj>
    |> Seq.map( fun x -> x.ToString().Trim() )

有些人询问返回单位或通话功能的原因。那是在下面。

type public MyRibbon() =
    inherit ExcelRibbon()
    override this.GetCustomUI(ribbonId) =
    "bunch of xml here"

member this.OnButtonPressed (control:IRibbonControl) =
        let app = ExcelDnaUtil.Application :?> Application
        let rng =  app.Selection :?> Range
        let rng2 =  app.Selection :?> obj
        match control.Id with
            | "AddIfError" ->  RibFuncs.RangeFuncs.AddIfError app rng
            | "Trim" ->  RibFuncs.RangeFuncs.Trim rng
                         |> ignore
            | _ ->  ()

2 个答案:

答案 0 :(得分:1)

不确定你想要在那里完成什么。为什么公式需要修剪,而不是例如值?

另一个障碍是我一直在做后期绑定,以避免Interop库依赖。 Here's an implementation用于后期绑定的动态运算符。

let usedRange = workSheet?UsedRange
usedRange?Formula
|> box |> function
| :? (obj[,]) as a -> a
| o -> Array2D.createBased 1 1 1 1 o    // Single cell sheet
|> Array2D.iteri (fun i j formula ->
    let cell = usedRange?Cells(i, j)
    cell?Formula <- (string formula).Trim() )

答案 1 :(得分:1)

尝试

let Trim2 (values:obj[,]) =  
    values
    |> Array2D.map(fun x-> box(x.ToString().Trim()))

你在“公式1”中获得Range类型的位置?