/ / Funcionalmente programa código Excel - excel, f #, suplemento, excel-dna

Código do Excel de programa funcional - excel, f #, add-in, excel-dna

Estou reescrevendo meu suplemento do Excel VBA com F # e Excel-DNA. Fórmula 1 abaixo funciona. Ele itera pelas células atualmente selecionadas e aplica o corte ao valor de cada célula.

Formula2 é minha tentativa fracassada de aplicar os conceitos Functional e F #. Não tenho certeza de como retornar o intervalo ao Excel. A fórmula deve retornar uma unidade.

Alguém poderia me ajudar?

Formula1 (Trabalhos):

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 (Não funciona):

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

Alguns perguntaram sobre o motivo do retorno de uma unidade ou a função de chamada. Isso está abaixo.

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

Respostas:

1 para resposta № 1

Não tenho certeza do que você está tentando realizar lá. Por que uma fórmula precisaria ser cortada, em vez de, por exemplo, um valor?

O outro problema é que eu tenho feito ligação tardia exclusivamente para evitar dependências da biblioteca de interoperabilidade. Aqui está uma implementação dos operadores dinâmicos para ligação tardia.

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 para resposta № 2

Experimentar

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

De onde você está conseguindo Range digite sua "Fórmula 1"?