Je travail actuellement à la migration de scripts R vers un R et un package Rcom plus récent (R3.3.2 et Rcom 3.1-2). J'ai pour habitude de gérer Excel avec Rcom mais je rencontre des problèmes de syntaxe sur la définition d'un range "dynamique".
Code : Tout sélectionner
# On load les libraries nécessairent, attention rcom est soumis à licence, sans elle pas possible d'exécuter ce script
library("rcom")
# ..............................................
# Création d'un classeur avec 5 feuilles
xl <<- comCreateObject("Excel.Application")
sheets = paste("Sheet", 1:5, sep ="")
length(sheets) -> n
xl[["SheetsInNewWorkbook"]] -> save
xl[["SheetsInNewWorkbook"]] <- n
xl[["Workbooks"]]$Add() -> wb
lapply(1:n, function(i) {
comSetProperty(wb[["Worksheets", i]],"Name",sheets[i])
wb[["Worksheets", i]] -> ws
ws[["Name"]] <- sheets[i]
return(ws)
ws <- NULL
} ) -> Sheets
names(Sheets) <- sheets
xl[["SheetsInNewWorkbook"]] <- save
wb$SaveAs(path) -> ans
# On dispose du fichier Excel wb créé avec 5 feuilles vides
# ..............................................
# Ecrire dans ce fichier
# Maintenant j'essaye de rajouter des données/formules à une feuilles,
# pour cela je souhaite définir la range dans laquelle écrire les données
ws <- wb$Sheet1
# cs définit les index de ma range (cellule de départ et de fin)
cs <- list(c(1, 1),c(2,2))
# J'essaye de définir la range à partir de cs
# Acienne méthode qui ne marche plus sur les nouvelles versions de R et rcom
rr <- ws[["Range", ws[["Cells", cs[[1]][1], cs[[1]][2] ]],
ws[["Cells", cs[[2]][1], cs[[2]][2] ]] ]]
# renvoi cette erreur
Error in `[[.COMObject`(ws, "Range", ws[["Cells", cs[[1]][1], cs[[1]][2]]], :
LENGTH or similar applied to externalptr object
Calls: [[ -> [[.COMObject -> .Call
# Méthodes testées renvoyant la même erreur
rr <- comGetProperty(ws,"Range",ws[["Cells", cs[[1]][1], cs[[1]][2] ]],ws[["Cells", cs[[2]][1], cs[[2]][2] ]])
rr <- comGetProperty(ws,"range",comGetProperty(ws,"Cells", cs[[1]][1], cs[[1]][2] ),comGetProperty(ws,"Cells", cs[[2]][1], cs[[2]][2] ))
Je sais que faire
Code : Tout sélectionner
rr <- comGetProperty(sheet, "Range", "A1", "B2")
Il doit forcément y avoir une manière de le faire sachant que l'on y arrive parfaitement avec VBA ou C#.
Exemple en VBA
Code : Tout sélectionner
ws.Range(ws.Cells(1, 1), ws.Cells(2, 2))
Alors, inspiré ? :)
Merci d'avance pour votre aide