我用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
| _ -> ()
答案 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
类型的位置?