Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
excel.link R程序包强制excel自动计算_R_Excel_Vba - Fatal编程技术网

excel.link R程序包强制excel自动计算

excel.link R程序包强制excel自动计算,r,excel,vba,R,Excel,Vba,我有一个R脚本,它循环遍历Excel二进制文件列表(*.xlsb,其中包含大量预定义内容,计算设置为手动),并在特定范围内粘贴data.frame,然后更改其他工作表中某些其他单元格的值 由于文件是*.xlsb,我使用excel.link包实现了一个解决方案。 该包本身工作正常,但有一个主要问题:一旦它将某些内容写入打开的工作簿,它就会将该工作簿的计算更改为自动 这是一个很大的问题,因为电子表格本身很大,有很多计算和工作表。重新计算工作簿需要15到45秒。更糟糕的是,每次R(通过excel.li

我有一个R脚本,它循环遍历Excel二进制文件列表(*.xlsb,其中包含大量预定义内容,计算设置为手动),并在特定范围内粘贴data.frame,然后更改其他工作表中某些其他单元格的值

由于文件是*.xlsb,我使用excel.link包实现了一个解决方案。 该包本身工作正常,但有一个主要问题:一旦它将某些内容写入打开的工作簿,它就会将该工作簿的计算更改为自动

这是一个很大的问题,因为电子表格本身很大,有很多计算和工作表。重新计算工作簿需要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加载项。
提前感谢您的帮助。

有关speed
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")

非常感谢您的回复。然而,这似乎不起作用。我认为计算会立即设置为自动,因此在粘贴数据时,它会立即重新计算电子表格,然后才将计算设置为手动。这对第二次或第三次数据交换也没有帮助,因为同样的事情正在发生。我正在使用以下代码:
xls=xl.get.excel()
rng1=xls[[“活动表”]]$Cells(2,11)wrt=xl.write(Smmry,rng1,row.names=FALSE,col.names=FALSE)xls[[“计算”]=xl.常量$xlCalculationManual更准确地说:电子表格从设置为Manual的计算开始,到设置为Manual的计算结束;但是在每次数据交换时,它仍然会重新计算电子表格,因此不会获得时间/速度方面的好处。Re:更新工作起来很有魅力!非常感谢你。