2

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

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

有人可以帮助我吗?

一级方程式(作品):

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()

公式 2(不起作用):

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
            | _ ->  ()
4

2 回答 2

1

尝试

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

您从哪里获得Range“一级方程式”中的类型?

于 2013-10-30T23:35:20.663 回答
1

不确定您要在那里完成什么。为什么一个公式需要修整,而不是一个值?

另一个问题是我一直在专门进行后期绑定以避免互操作库依赖。这是用于后期绑定的动态运算符的实现。

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() )
于 2013-10-30T08:35:53.343 回答