Rcom et Excel : Comment définir un Range ?

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Cedric Carpentier
Messages : 2
Enregistré le : 27 Nov 2018, 16:50

Rcom et Excel : Comment définir un Range ?

Messagepar Cedric Carpentier » 28 Nov 2018, 08:47

Bonjour,

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")
fonctionne mais comme je ne connais pas la taille du tableau à l'avance ce n'est pas pratique. Ca m'obligerais à définir un dico du style 1 = A, 2 = B ...
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

Cedric Carpentier
Messages : 2
Enregistré le : 27 Nov 2018, 16:50

Re: Rcom et Excel : Comment définir un Range ?

Messagepar Cedric Carpentier » 28 Nov 2018, 11:00

C'est bon j'ai trouvé la solution :)

Code : Tout sélectionner

ws[["Range", ws[["Cells", cs[[1]][1], cs[[1]][2] ]][["Address"]],
    ws[["Cells", cs[[2]][1], cs[[2]][2] ]][["Address"]] ]] -> rr


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité