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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
# 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
ws.Range(ws.Cells(1, 1), ws.Cells(2, 2))
Alors, inspiré ?

Merci d'avance pour votre aide