R/vba-打开并保存多个工作簿(+500)并丢弃公式,即只保留数据帧



我想打开几个带有多个电子表格的工作簿文件(xlsx),放弃每个单元格中的公式,只保留其中的数据。我会手动完成,但至少有500本练习册,我想自动完成这项任务。

我发现自己有多个部分解决方案。也许最简单的方法是通过vba实现,但我不知道如何编写这些指令。我可以管理的其他解决方案是通过R.

我测试了几个软件包,最有用的是xlsx,不幸的是,我一次只能保存1个电子表格,每个工作簿有15个以上,而且我不知道如何将每个电子表格组合在一个文件(一个工作簿)中。

到目前为止,我得到的解决方案是在循环中打开文件,然后用XLConnect再次保存它们。我搜索了一个没有公式的写作,知道没有公式的开放是存在的,但我没能找到这个选项。。。这些软件包有一个简单的解决方案吗?还是我应该更多地了解VBA?

暂定于r:

library("XLConnect")
wbdir <- setwd("C:/Users/blabla/Desktop/wbfiles")
wblist <- list.files(wbdir)
i <- 0L
for (i in 1:length(wblist)) {
wb_formulas <- loadWorkbook(wblist[[i]])
# something to overwriteformulas : opening witout formulas like xlsx/openxlsx package 
# writing without ...
wb_df <- saveWorkbook(wb_formulas, paste(c("wb_", i,".xlsx"),collapse = ""))
}

考虑R的RDComclient,它可以COM接口到Excel对象库,在Excel对象库中,您可以使用R循环遍历所需的文件和相应的工作表,并使用Excel自己的方法(而不是第三方包方法)Range.Copy和Range.PasteSpecial来复制单元格值,忽略公式。

下面的过程被封装在tryCatch中,即使有简单的错误也可以干净地退出处理。请注意:一些COMExceptions没有被捕获,您需要从任务管理器中退出EXCEL.EXE进程。

library(RDCOMClient)
wbdir <- setwd("C:/Users/blabla/Desktop/wbfiles")
wblist <- list.files(wbdir, full.names = TRUE)
xlPasteValues <- -4163
for (wb in wblist) {    
tryCatch({
# Create COM Connection to Excel
xlApp <- COMCreate("Excel.Application")
xlApp[['Visible']] <- FALSE
xlApp[['DisplayAlerts']] <- FALSE
# Open workbook
xlWB <- xlApp[["Workbooks"]]$Open(wb)
# Iterate through each worksheet
for (s in seq(xlWB$Worksheets()$Count())) {
xlSheet <- xlWB$Worksheets(s)
# Copy and paste values
xlSheet$Cells()$Copy() 
xlSheet$Cells()$PasteSpecial(xlPasteValues)
xlApp[['CutCopyMode']] <- FALSE
xlSheet$Activate()
xlSheet$Range("A1")$Select()        
}
}, error=function(e) {
print(e)  
},
finally={
xlApp[['DisplayAlerts']] <- TRUE
# Save Changes
xlWB$Close(TRUE)        # THIS WILL OVERWRITE (BACKUP IN TEST MODE)
xlApp$Quit()
# Release resources
xlSheet <- NULL
xlWB <- NULL
xlApp <- NULL
rm(list=ls()) 
gc()
}
)    
}

由于COM是一种Windows技术,上述解决方案仅适用于在Windows环境中运行的R

最新更新