我必须管理涉及R脚本和VBA-code
的工作流程。
我想在R中运行该过程(我的大部分代码都是),然后调用VBA-code
进行特定计算。
我会为R中的VBA准备输入,在某处写入结果(.csv,数据库),然后在R脚本的其余部分中使用结果。
当然最好将整个代码移到R中,但现在这是不可能的。 VBA-code
相当复杂。将其转化为R将是一项具有挑战性的长期任务。
是否有可能在R中管理这样的工作流程?
答案 0 :(得分:13)
编写一个调用VBA的VBscript包装器。请参阅Way to run Excel macros from command line or batch file?
答案 1 :(得分:10)
这是一个不需要VBscript包装器的方法。您需要安装RDCOMClient
包
library(RDCOMClient)
# Open a specific workbook in Excel:
xlApp <- COMCreate("Excel.Application")
xlWbk <- xlApp$Workbooks()$Open("C:\\Temp\\macro_template.xlsm")
# this line of code might be necessary if you want to see your spreadsheet:
xlApp[['Visible']] <- TRUE
# Run the macro called "MyMacro":
xlApp$Run("MyMacro")
# Close the workbook and quit the app:
xlWbk$Close(FALSE)
xlApp$Quit()
# Release resources:
rm(xlWbk, xlApp)
gc()
答案 2 :(得分:1)
我使用 RDCOM 运行 Excel 宏数月以从 SAP 中提取数据,今天尝试退出程序时它开始抛出错误。不知道为什么。这是我的解决方案,如果无法实现和平退出,则终止任务。
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#~~ Define hard coded variables
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Define paths to VBA workbooks and macro name
path_xlsb <- "I:/EXAMPLE_WORKBOOK.xlsb"
xlsb_macro_name <- "launch_SAP"
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#~~ Load or install packages
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# librarian
if(require(librarian) == FALSE){
install.packages("librarian")
if(require(librarian)== FALSE){stop("Unable to install and load librarian")}
}
librarian::shelf(tidyverse, readxl, RODBC, odbc,lubridate, pivottabler, xlsx, openxlsx, htmlTable)
# Load or install RDCOM Client
if(require(RDCOMClient) == FALSE){
install.packages("RDCOMClient", repos = "http://www.omegahat.net/R")
if(require(RDCOMClient)== FALSE){stop("Unable to install and load RDCOMClient")}
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#~~ Run VBA Macro in Excel
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Kill any existing Excel processes
try(system("Taskkill /IM Excel.exe /F"),silent = TRUE)
# Kill any existing SAP processes (only relevant if you're working with SAP)
try(system("Taskkill /IM saplogon.EXE /F"),silent = TRUE)
# Open a specific workbook in Excel:
xlApp <- COMCreate("Excel.Application")
xlWbk <- xlApp$Workbooks()$Open(path_xlsb_reconnect)
# Set to true if you want to see your spreadsheet:
xlApp[['Visible']] <- TRUE
# Run the macro
Sys.sleep(2) # Wait for the workbook to load
xlApp$Run(xlsb_macro_name)
# Attempt to close the workbook peacefully
Sys.sleep(2) # Wait for 2 seconds
try(xlApp$Quit())
try(rm(xlWbk, xlApp))
try(gc())
# Kill any Excel processes
try(system("Taskkill /IM Excel.exe /F"),silent = TRUE)
# Kill any existing SAP processes (only relevant if you're working with SAP)
try(system("Taskkill /IM saplogon.EXE /F"),silent = TRUE)