excel.link R包强制Excel自动进行计算

时间:2018-07-06 17:41:21

标签: r excel-vba vba excel

我有一个R脚本,除其他外,该脚本循环遍历一系列Excel二进制文件(* .xlsb,其中包含许多预定义的内容,计算设置为 Manual )并粘贴数据.frame在特定范围内,然后更改其他工作表中其他一些单元格的值。

由于文件是* .xlsb,所以我已经使用excel.link包实现了一个解决方案。 程序包本身可以很好地工作,但是存在一个主要问题:一旦将其写入打开的工作簿中,它就会将该工作簿的计算结果更改为 Automatic

这是一个很大的问题,因为电子表格本身很大,并且发生了许多计算和工作表。重新计算工作簿需要15到45秒。更糟的是,每次R(通过excel.link)向其中写入数据时,工作簿都会重新计算。就我而言,我为每个工作簿在3个不同的位置打印数据。所以这让我很慢。

理想情况下,我希望能够控制这一方面,即,仅在保存文件之前将计算设置为自动,以便工作簿仅计算一次。 -与XLConnect软件包 setForceFormulaRecalculation 类似,但是不支持* .xlsb。

否则,将欢迎任何解决方法。

我要粘贴几行代码,但是我认为这不是很重要。

xl.workbook.open(paste0(bs_path,"\\UAT Results Summary_Wave1.xlsb"))
xl.sheet.activate("Input - Subtotals Liab")
xls = xl.get.excel()
rng1 = xls[["Activesheet"]]$Cells(free_cell,11)
wrt=xl.write(Smmry,rng1,row.names = FALSE,col.names = FALSE)
xl.sheet.activate("Instructions")
xlrc[a13]=as.numeric(jobstep)
xlrc[b13]=as.numeric(jobstep)
xl.workbook.save(paste0(dest_path,"\\UAT Results Summary_",fund_short,"_",jobstep), file.format=xl.constants$xlExcel12)
xl.workbook.close()

如果您想查看更多代码,请告诉我。

请注意,我暂时不考虑转换为xlsx并返回到xlsb。速度对于此脚本至关重要。 另外请注意,至少目前,我无法使用RExcel或任何其他Excel加载项。 预先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

对于速度excel.link,请在每次输出到Excel之前禁用自动重新计算,并在输出之后将计算设置为自动。我在下一版本中修复了此行为。重新计算状态将恢复到之前的状态,而不是自动重新计算。 现在,您可以尝试在每次数据交换后设置手动重新计算,如以下示例所示:

app = xl() 
xl[a1] = 42
app[["Calculation"]] = xl.constants$xlCalculationManual

更新2018.07.09: 另一种方法是实时修补程序包代码。试试下面的代码片段。它对我有用。

library(excel.link)
set_excel_state = function(app){
    app[["Statusbar"]] = ""
    app[["Screenupdating"]] = TRUE
    app[["Calculation"]] = xl.constants$xlCalculationManual
    invisible(NULL)    
}

assignInNamespace("make.me.slow", set_excel_state, ns = "excel.link")