我使用F#和Excel将数据输出到Excel电子表格。我的第一种方法是分别设置每个单元:
worksheet.Range(range1).Value2 <- "=sum(a1:a10)"
worksheet.Range(range2).Value2 <- "=min(a1:a10)"
worksheet.Range(range3).Value2 <- "=max(a1:a10)"
(* etc *)
但是,当有大量的公式时,这太慢了,所以我切换到了一个数组:
worksheet.Range(range).Value2 <- [| "=sum(a1:a10)"
"=min(a1:a10)"
"=max(a1:a10)" |]
或
worksheet.Range(range).Formula <- [| "=sum(a1:a10)"
"=min(a1:a10)"
"=max(a1:a10)" |]
但是,现在Excel只在单元格中显示这些字符串,而不是计算公式的值。我也试过:
worksheet.Range(range).FormulaArray <- [| "=sum(a1:a10)"
"=min(a1:a10)"
"=max(a1:a10)" |]
但这搅乱了每个公式的目标范围。我不知道那是怎么回事。( Excel没有将其保留为"a1:a10"
,而是根据公式的位置转换目标范围。)
有更好的方法吗?
Update:我也尝试使用"=MIN($G$2:$G$5)",但这产生了同样的效果,其中Excel只是显示字符串,而不是计算公式。
至于它的价值,当我输入单元格时,擦除,然后重新添加公式中的任何字符,当我点击" enter“时,Excel将对其进行评估。
更新2:我还尝试了以下操作:
worksheet.Range(range).FormulaR1C1 <- [| "=sum(R2C[0]:R4C[0])"
"=average(R2C[0]:R4C[0])"
"=min(R2C[0]:R4C[0])"
"=max(R2C[0]:R4C[0])" |]
但我也遇到了同样的问题: Excel将它们呈现为字符串,而不是计算公式。
发布于 2012-09-18 12:42:11
丹尼尔的答案应该是可行的,但我发现使用R1C1格式的公式更容易。您的代码应该如下所示:
ws.Range(range).FormulaR1C1 <- [| "=sum(R1C1:R10C1)";
"=min(R1C1:R10C1)";
"=max(R1C1:R10C1)" |]
这将生成具有绝对地址的公式。可以使用Rvertical_offsetChorizontal_offset构建相对地址。选择整行或列也很容易: R1是完整的第一行,C4是完整的"D“列。
在纯R1C1中使用String.Format或sprintf可以轻松构建F#嵌入器。
编辑:--我在vba中做了一个快速检查,它不起作用。Excel在每个单元格中放置第一个数组元素。无论如何,R1C1寻址点仍然有效。对于头公式来说,它就像一种魅力。ws.Range(headerRange).FormulaR1C1 <- "=sum(R2C:R10C"),所以我将保留答案。
EDIT2:,我认为ArrayFormula是给阵列公式的,所以它也不起作用。
EDIT3:,我做了一些研究,找到了我认为不可能的答案:)。
首先,将这些字符串作为公式,将它们向上转换为反对:
let formulas : obj[] = [| "=sum(R1C1:R10C1)";
"=min(R1C1:R10C1)";
"=max(R1C1:R10C1)" |]
然后把它放到FormulaR1C1中:
ws.Range(range).FormulaR1C1 <- formulas
第二,重要部分:上面的例子假设范围是三个单元格的水平范围(即。F3:H3)。如果你想把它放在垂直范围内。F3:F5)你会注意到,这个和公式在范围内的每个单元格中重复。我打赌,在这种情况下,公式应该是二维对象数组,第一行外部数组是公式数组,但是我在尝试将其放入range.FormulaR1C1时得到了range.FormulaR1C1。看看这个msdn文档
如果范围是一维或二维范围,则可以将公式设置为相同维度的Visual数组。同样,您可以将公式放入Visual数组中。
我稍后再看这个例外情况。
发布于 2012-09-18 13:17:48
假设您的第一种方法是有效的,而且慢的意思是输入太慢(而不是执行),那么更新一堆这样的单元格可能会更快/更容易
[
range1, "=sum(a1:a10)"
range2, "=min(a1:a10)"
range3, "=max(a1:a10)"
...
]
|> List.iter (fun (range, value) -> worksheet.Range(range).Value2 <- value)
发布于 2012-09-18 13:26:35
或者,您可以从fsnip.net http://fssnip.net/aV上的这个片段中获得一些想法,它为Excel实现了一些更高级的函数。(与使用电子表格设备相比,这是一种更长的性能选择,因为代码片段实际上并不是关于性能的。)
https://stackoverflow.com/questions/12483798
复制