在访问Excel文件时,在R中出现“<checkErrorInfo> 80020009 Error in .COM(x, name, ...) :”错误

10

我已经使用OpenxlsxRDCOMClient包自动化了从R访问VBA宏的过程。以下是代码:

功能:

OpenExcel_5param <- function(directory,filename, MacroName, param1, param2, 
param3,param4, param5)
{

 # Open a specific workbook in Excel:
   data <- paste(c(directory,'/',filename,'.xlsm'), collapse = '')
   xlApp <- COMCreate("Excel.Application")
   xlWbk <- xlApp$Workbooks()$Open(data)

 # this line of code might be necessary if you want to see your spreadsheet:
   xlApp[['Visible']] <- TRUE 
   xlApp$Run(MacroName,param1,param2, param3, param4, param5)

 # Close the workbook and quit the app:
   xlWbk$Close(FALSE)
   xlApp$Quit()

 # Release resources:
   rm(xlWbk, xlApp)
   gc()
}

访问此功能的代码:

OpenExcel_5param(Common_folder,VBA_CodeFileName,"ConsumptionValidation.MARM",r_extracts,"1. UniqueUPC_Nielsen",10000,original_files,"MARM")

当我运行代码时,出现以下错误:

80020009
.COM(x, name, ...) 中的错误 :

第一次运行代码时,它可以正常工作。从第二次开始,它就开始给我这个错误。同样的代码在另一台电脑上完全正常。在第三台电脑上,如果我保持Excel文件处于打开状态,则可以正常工作,但在我的电脑上根本无法工作。我尝试了不同版本的R,但没有帮助。


请发布宏的功能,因为它可能会启动其他进程。 - Parfait
你是在同一个R会话中运行了代码两次,还是在重新启动R会话后第二次运行了代码? - Emmanuel Hamel
1个回答

0
如果您的代码仅在一个R会话中运行一次(即在同一R会话中不起作用两次,但如果重新启动R,则会再次起作用),则可以考虑以下方法:
library(callr)

OpenExcel_5param <- function(directory,
                             filename, 
                             MacroName,
                             param1,
                             param2, 
                             param3,
                             param4,
                             param5)
{
  library(RDCOMClient)
  
  # Open a specific workbook in Excel:
  data <- paste(c(directory,'/',filename,'.xlsm'), collapse = '')
  xlApp <- COMCreate("Excel.Application")
  xlWbk <- xlApp$Workbooks()$Open(data)
  
  # this line of code might be necessary if you want to see your spreadsheet:
  xlApp[['Visible']] <- TRUE 
  xlApp$Run(MacroName,param1,param2, param3, param4, param5)
  
  # Close the workbook and quit the app:
  xlWbk$Close(FALSE)
  xlApp$Quit()
  
  # Release resources:
  rm(xlWbk, xlApp)
  gc()
}

callr::r(func = OpenExcel_5param, args = list(directory, filename, MacroName, param1, param2, param3, param4, param5))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接