2017-10-24 5 views
0

複数のスプレッドシートを含む複数のワークブックファイル(xlsx)を開き、各セルの式を破棄してデータを内部に保持したいとします。私はそれをmannualyするだろうが、少なくとも500のブッ​​クで私はタスクを自動化したいと思います。R/vba - いくつかのブック(+500)を開いて保存し、数式を破棄します。データフレームのみを保持する

自分自身に複数の部分的な解決策が見つかりました。たぶん、最も単純なのはvba経由で行うことですが、私はそれらの指示をどのように書くのか分かりません。私が管理できる他の解決策はRを通してです。

私はいくつかのパッケージをテストしましたが、最も有用なのはxlsxです。一度に1つのスプレッドシートしか保存できません。各スプレッドシートを1つのファイル(1つのワークブック)にまとめる方法。

私が今までに行った解決策は、ループ内でファイルを開き、XLConnectで再度保存することです。私は書式なしの書式を探していましたが、公式なしの式が存在することを知っていましたが、私はオプションを見つけることができませんでした...これらのパッケージを使った簡単な解決法はありますか? 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 = "")) 
} 
+1

VBAは簡単にこれを行うことができ、ドキュメントを開くことなくこれを行うこともできます。 Excelはそれらを「読み取り専用」ファイルとして読み取ることができます...私はすばらしい検索を行いました。これはあなたがhttp://www.encodedna.com/excel/copy-data-from-closedを開始するのに最適なリソースです-excel-workbook-without-opening.htm – Maldred

+0

私はvbaを使用します。タスクを中断してください。ブックをループし、次に開いて、情報をコピーし、ペーストを他のブックにコピーしてから、サンプルブックを閉じます。あなたは非常によくrを使用することができます。 – User632716

+0

すでに編集した –

答えて

0

はあなたが必要なファイルとそれに対応するワークシートをループにRを使用し、Excel独自のメソッド(いないサードパーティ製を使用することができますExcelのオブジェクトライブラリへのRのRDComclientいる可能COMインターフェースを考えてみましょうパッケージメソッド)、Range.CopyおよびRange.PasteSpecialを使用してセル値をコピーし、数式を除外します。

以下の手順は、tryCatchで包まれており、簡単なエラーでも処理を完全に終了します。メモ:一部のCOMExceptionsは検出されず、タスクマネージャからEXCEL.EXEプロセスを終了する必要があります。 COMは、Windowsの技術があるので

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() 
    } 
)  
} 

は、ソリューションの上にのみ、Windows環境で実行されているRで動作します。

+0

感謝を避ける場合も、いくつかの簡単なVBAコードをチェックしてみましょう。 – Ovidiu

+0

申し訳ありませんが、望ましくないリフレッシュ... このコードをお寄せいただきありがとうございます。パフェ、私はRDComclientパッケージに追いつこうとします。 それはかなりうまくいっていますが、私はそれが時々表示される理由を理解していないエラーがあります:クリップボードメッセージのコピー/ペーストのことです。私は検索し、xlApp [['cutcopymode']] < - Falseで表示しないでください。私は正しい?セルが<100 – Ovidiu

+0

の場合、エラーは発生しませんが、Excelからクリップボードに保存された量に関するユーザーの警告が表示されます。それは各ファイルまたは一度だけポップアップし続けますか? Rコンソールにエラーが表示されますか? – Parfait

関連する問題