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

R/vba - Open and save several workbooks (+500) and discarding formulas ie. keeping only dataframe

我想打开多个包含多个电子表格的工作簿文件 (xlsx),丢弃每个单元格中的公式,只保留其中的数据。我会手动完成,但至少有 500 个工作簿,我想将任务自动化。

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

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

到目前为止,我采用的解决方案是在循环内打开文件,然后使用 XLConnect 再次保存它们。我搜索了一个 write-without-formula,知道 open-without-formula 存在,但我没有找到选项......这些包有一个简单的解决方案还是我应该更多地研究 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 interface to the Excel object library where you can use R to loop through needed files and corresponding worksheets and use Excel's own methods (not third-party package methods), Range.Copy and 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 运行。