【问题标题】:R/vba - Open and save several workbooks (+500) and discarding formulas ie. keeping only dataframeR/vba - 打开并保存几个工作簿 (+500) 并丢弃公式,即。只保留数据框
【发布时间】:2017-10-24 15:38:58
【问题描述】:

我想打开几个带有多个电子表格的工作簿文件 (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 = ""))
}

【问题讨论】:

  • VBA 可以轻松做到这一点,您也可以在不打开文档的情况下做到这一点。 Excel 可以将它们作为“只读”文件读取...我进行了快速搜索,这是一个很好的资源,可以帮助您入门encodedna.com/excel/…
  • 我会使用 vba。分解任务。遍历书籍,然后运行一个打开、复制信息、粘贴到其他书籍的函数,然后关闭示例书籍。不过你可以很好地使用 r。
  • 请发布您已经尝试过的代码
  • edited 编辑 @Maldred 检查链接,如果无法避免这部分,我也会尝试检查一些简单的 VBA 代码

标签: r excel xlconnect vba


【解决方案1】:

考虑 R 的 RDComclient 可以 COM 与 Excel 对象库的接口,您可以在其中使用 R 循环所需的文件和相应的工作表并使用 Excel 自己的方法(不是第三方包方法),Range.CopyRange.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。

【讨论】:

  • 抱歉,不需要的刷新...感谢此代码 Parfait,我将尝试赶上 RDComclient 包。它工作得很好,但我有一个错误,我不明白它为什么有时会出现:剪贴板消息复制/粘贴的东西。我进行了搜索,它不应该与 xlApp[['cutcopymode']] 则不会
  • 这不是错误,而是来自 Excel 的用户警告关于放置在剪贴板上的数量。它会随着每个文件弹出还是只弹出一次? R 控制台是否显示任何错误?
  • 确实弹出每个文件,似乎也中断了复制。 R 控制台显示:“
  • 查看使用 Excel 的 DisplayAlerts 属性更新禁用/启用警报。并确保您已分配 xlPasteValues(外部循环),因为此解决方案具有它。
  • 谢谢冻糕。它现在正在工作。我仍然有一个错误提示,但你的最后一条消息给了我一个纠正它的提示。我将xlPasteValues &lt;- -4163 放在第一个循环中。我注意到变量在第一次迭代后被删除了。也许这就是我从一开始就遇到的问题。无论如何,代码现在(如果有人也需要):library(RDCOMClient) wbdir &lt;- setwd("C:/Users/blabla/Desktop/wbfiles") wblist &lt;- list.files(wbdir, full.names = TRUE) wblist xlPasteValues &lt;- (-4163) for (wb in wblist) { xlPasteValues &lt;- (-4163)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多