2016-09-01 4 views
3

"xlsx"패키지를 사용하여 R 및 Excel 프로젝트에서 작업하고 있는데 다음과 같은 문제가 있습니다.R 스크립트를 실행할 VBA 코드 : Excel에서 출력 이미지 문제

"Model.R"이라는 스크립트로 분석이 수행됩니다. "Output.R"이라는 두 번째 스크립트는 분석 결과 (일부 차트 포함)를 생성합니다.

source("Output.R") 

두 스크립트를 모두 R Studio에서 실행해도 아무런 문제가없고 출력이 정확합니다. ,

Sub Run_script() 
    Dim cmdLine As String 
    cmdLine="C:\\Program Files\\R\\R-3.3.1\\bin\\Rscript C:\\...\\Model.R" 
    shell cmdLine 
End Sub 

이제 모든 것이 잘 작동하고 출력이 올바르게 새 Excel 파일에 인쇄되어 있습니다 :

지금, 나는 매크로에 대해 다음 VBA 코드를 사용하여 스크립트를 실행하는 엑셀 "인터페이스"를 내장 이제는 모든 차트가 내부에 아무것도없는 빈 상자라는 사실에서 한 부분입니다.

이 문제를 해결하는 방법을 알고있는 사람이 있습니까? 예를 들어 Excel에서 스크립트를 실행하는 다른 방법이있을 수 있습니다.

감사합니다

편집 여기

예로서, 생산 및 차트 중 하나를 저장하는 R 코드 : 그래서 이미지가 PNG 파일로 저장됩니다

hist(P1,probability=FALSE,main = "",breaks = 20) 
title("CE Anno -1") 
dev.copy(png,filename="CE1.png"); 
dev.off() 

은 동일한 작업 디렉토리에 있습니다. 그럼,이 XLSX 패키지와 다음 코드를 사용하여 Excel에서 인쇄 :

outwb <- createWorkbook() 
SummaryCE <- createSheet(outwb, sheetName = "Summary CE") 
addPicture("CE1.png", SummaryCE, scale = 0.5, startRow = 11, startColumn = 1) 
saveWorkbook(outwb, "Risultati RO.xlsx") 

내가 말했듯이 나는 R 스튜디오에서 실행하는 경우,이 코드는 잘 작동합니다. 이전 VBA 코드를 사용하여 명령 줄에서 호출하면 Excel이 제대로 만들어 지지만 이미지는 빈 상자입니다.

EDIT 당신의 도움에 2 개

덕분에, 나는 성공적으로 문제를 해결했다. 내가 지금하고있는 일은 동일한 스크립트 모델을 기반으로하는 보고서 (Word 형식, 여기서 LaTex는 사용할 수 없음)를 자동으로 생성하는 것입니다.

이렇게하려면 Markdown 기능을 사용하고 R Markdown 파일 "Report.Rmd". 여기에 기본적으로 Model.R 실행 결과로 작업 공간을로드합니다.

load("Mywork.RData") 

다음 테이블, 차트 및 설명을 추가하십시오. 그 후, 나는 이전과 비슷한 문제를 가지고 다시 "Model.R"스크립트

render("Report.Rmd") 

에 다음 줄을 사용하여 Word 문서를 생성합니다. R Studio에서 실행하면 모든 것이 정상입니다. 이전 Excel 인터페이스를 사용하면 Word 출력이 해당 폴더에 나타나지 않습니다.

누구든지이 문제의 원인을 알고 있습니까?

감사합니다. 몇 가지 질문에 대해 죄송합니다. R과 편하지 만 VBA를 처음 사용합니다.

+3

당신은 당신은 * 이미지 *, * 차트 *와 * 출력 * 참조 유지하지만 우리는 어떤 코드를 실행 아무것도 단지 명령 행 호출을 볼 –

+0

VBA 또는 명령 줄에서 백 슬래시를 이스케이프 할 필요가 없습니다. 전체 프로세스를 볼 수 있도록 R 코드를 게시 할 수 있습니까? R 스크립트는 Excel에서 렌더링 할 차트 이미지를 생성합니까? – Parfait

+0

차트는 Excel에서 쉘이 캡처 할 수없는 별도의 창에 그려집니다. 차트를 디스크의 R 스크립트 내에서 png/jpg에 저장하고 vba 스크립트를 사용하여 Excel에서 이러한 이미지 파일을로드하십시오. –

답변

1

dev.copy가 비 대화식 모드 (쉘 명령)에서 제대로 작동하지 않습니다. 다음 스크립트 등의 코드를 수정 :

require(xlsx) 

    fname <- "CE1.png" 

    #add this device. you can use other device,e.g. jpg /bmp/tiff devices 
    png(fname) # you can define width /height as needed 

    hist(P1,probability=FALSE,main = "",breaks = 20) 
    title("CE Anno -1") 

    #dev.copy(png,filename="CE1.png"); #remove this line 

    dev.off() 

    # the following code used as is 
    outwb <- createWorkbook() 
    SummaryCE <- createSheet(outwb, sheetName = "Summary CE") 
    addPicture("CE1.png", SummaryCE, scale = 0.5, startRow = 11, startColumn = 1) 
    saveWorkbook(outwb, "Risultati RO.xlsx") 

코드가 예상 결과와 작동하는지 확인하기 위해, 예컨대 do.bat 배치 파일을 생성하고 콘솔 창에서 실행합니다.

배치 파일 일 수 있습니다

"I:\Program Files\R\R-3.2.1\bin\i386\rscript" --verbose model.r 
그것은 작업 및 엑셀해야

은 이미지로 가득 차 있습니다. 이 성공적으로 수행되면

, 당신은 엑셀

내가 do.bat 전화를 Excel에서 다음 VBA 스크립트를 사용에 배치 파일을 호출 할 수 있습니다

Sub RunShell() 
Dim currentPath As String 
currentPath = ActiveWorkbook.Path 
'Debug.Print currentPath 
Call Shell(currentPath & "\do.bat ", vbNormalFocus) 
End Sub 

나는 코드를 테스트 한이다 작동 및 채우기는 이미지와 함께 excel

+0

도움을 주셔서 대단히 감사합니다. 이제 코드가 올바르게 작동하고 있으며 Excel 출력에서 ​​이미지를 볼 수 있습니다! – Jise7

+0

다른 문제가 생겼습니다. 문제의 2 번 부분에 설명되어 있습니다. 약간의 시간이 있다면, 당신이 그것을 볼 수 있다면 좋을 것입니다. 미안하지만 내가 VBA를 처음 접했을 때 나는 여전히 몇 가지 기본 개념을 놓쳤다. 감사! – Jise7

+0

해결 방법 : 1) 렌더링에 필요한 "pandoc"의 경로를 가리키는 환경 변수 {RSTUDIO_PANDOC}을 만듭니다. 내 컴퓨터 "G : \ Program Files \ RStudio \ bin \ pandoc"에 있습니다. 컴퓨터에서 찾으십시오. 2) r 스크립트에 다음 행을 추가하십시오 : library (rmarkdown). 그것은 나를 위해 일하고있다. 그게 너에게 효과가 있는지 알려줘. –

0

이것은 나를 위해 잘 작동합니다.

Sub RunRscript1() 
    Dim shell As Object 
    Set shell = VBA.CreateObject("WScript.Shell") 
    Dim waitTillComplete As Boolean: waitTillComplete = True 
    Dim style As Integer: style = 1 
    Dim errorCode As Integer 
    Dim path As String 

    ' http://shashiasrblog.blogspot.com/2013/10/vba-front-end-for-r.html 
    path = "C:\Users\your_path\Documents\R\R-3.2.5\bin\x64\R.exe CMD BATCH --vanilla --slave C:\Users\your_path\Documents\R\Download.r" 
    'path = """C:\Users\your_path\Documents\R\R-3.2.5\bin\i386"" C:\Users\your_path\Documents\R\Download.R" 
    errorCode = shell.Run(path, style, waitTillComplete) 
End Sub