IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Rcom et Excel : Définition d'un range


Sujet :

R

  1. #1
    Membre régulier
    Homme Profil pro
    Analyste Quantitatif / Ingénieur Financier
    Inscrit en
    Janvier 2008
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Analyste Quantitatif / Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2008
    Messages : 163
    Points : 107
    Points
    107
    Par défaut Rcom et Excel : Définition d'un range
    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

  2. #2
    Membre régulier
    Homme Profil pro
    Analyste Quantitatif / Ingénieur Financier
    Inscrit en
    Janvier 2008
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Analyste Quantitatif / Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2008
    Messages : 163
    Points : 107
    Points
    107
    Par défaut
    C'est bon j'ai trouvé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ws[["Range", ws[["Cells", cs[[1]][1], cs[[1]][2] ]][["Address"]],
        ws[["Cells", cs[[2]][1], cs[[2]][2] ]][["Address"]] ]] -> rr

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA - Excel - Word] Problème avec Range(Cells(1,1),Cells(10,10))
    Par Tanoffy dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/10/2014, 11h07
  2. [AC-2007] Export excel définition du nom du fichier aves un module
    Par Marcopololo dans le forum VBA Access
    Réponses: 7
    Dernier message: 29/11/2011, 10h32
  3. [Toutes versions] ERREUR lors de la définition un objet Range
    Par nianko dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/06/2009, 10h48
  4. [MFC/Excel] Comment utiliser un Range ?
    Par SmOkEiSBaD dans le forum MFC
    Réponses: 2
    Dernier message: 14/05/2008, 14h00
  5. Définition d'un range par Cells(), Cells()
    Par Dereck07 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/03/2008, 22h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo