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

Macros et VBA Excel Discussion :

Fonctionnement surprenant de la propriété Range sur une plage discontinue [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Enseignant chercheur à la retraite
    Inscrit en
    Mai 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Enseignant chercheur à la retraite

    Informations forums :
    Inscription : Mai 2020
    Messages : 7
    Par défaut Fonctionnement surprenant de la propriété Range sur une plage discontinue
    Bonjour,
    J'ai du mal à comprendre le code suivant. Bug de VBA Excel ou alors il y a un truc que je n'ai pas compris dans la propriété Range.
    Si quelqu'un peut éclairer ma lanterne, je le remercie d'avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Bizarre()
        Dim r As Range
        Set r = Range("$A$1:$C$5, $B$6")
        Debug.Print r.address
        Debug.Print r.count, r.item(16).address, r.item(17).address, r.item(18).address
    End Sub
    La plage r est constituée d'une plage rectangulaire de 15 cellules à laquelle est accolée une 16ème cellule (B6).
    r.count renvoie bien la bonne réponse : 16
    Mais r.item(16) a pour résultat $A$6.
    Encore plus surprenant : r.item(17) et r.item(18) ne provoquent aucune erreur et renvoient respectivement $B$6 et $C$6.
    C'est gênant car je voulais parcourir la plage avec une boucle For i = 1 to r.count ... traiter(r.item(i)... Next i et bien sûr le résultat est erroné.
    A noter que la boucle For each cel in r ... traiter(cel) ... Next cel fonctionne normalement.

    NB. J'ai pensé un instant que ce serait dû à une mauvaise utilisation de Range. Mais si je refais l'expérience en remplaçant la ligne 3 par
    et en exécutant la procédure après avoir sélectionné manuellement la région qui m'intéresse, j'obtiens exactement le même résultat !

  2. #2
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 239
    Par défaut
    hello,
    c'est normal que tu ais ce résultat car la fonction r.item(x) ne représente pas les éléments de r :
    Propriété Range.Item (Excel)
    Cette propriété renvoie un objet Range qui représente une plage décalée par rapport à la plage spécifiée.
    Syntaxe
    . Item (RowIndex, ColumnIndex)

    expression Variable représentant un objet Range.

    PARAMÈTRES
    Nom Requis/Facultatif Type de données Description
    RowIndex Obligatoire Variant Si le deuxième argument est fourni, le numéro de ligne relatif de la cellule à renvoyer.

    Si le deuxième argument n’est pas fourni, l’index de la sous-range à renvoyer.
    ColumnIndex Facultatif Variant Numéro de colonne relatif de la cellule à renvoyer.
    Pour balayer les éléments de r tu peux utiliser un For Each
    voici un exemple de code qui effectue cette opération , en montrant ce qui se passe avec item(x) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub PasBizarre()
        Dim r As Range
        Dim x As Integer
        x = 1
        Set r = Range("$A$1:$C$5, $B$6")
        For Each cell In r
        Debug.Print cell.Address, r.Item(x).Address
        x = x + 1
        Next
    End Sub
    Résultat :
    $A$1 $A$1
    $B$1 $B$1
    $C$1 $C$1
    $A$2 $A$2
    $B$2 $B$2
    $C$2 $C$2
    $A$3 $A$3
    $B$3 $B$3
    $C$3 $C$3
    $A$4 $A$4
    $B$4 $B$4
    $C$4 $C$4
    $A$5 $A$5
    $B$5 $B$5
    $C$5 $C$5
    $B$6 $A$6
    On voir que pour r.item(16).Address on a $A$6 parce que c'est la première colonne de la ligne 16 bien qu'elle ne fasse pas partie des éléments du Range.

    Ami calmant, J.P

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Enseignant chercheur à la retraite
    Inscrit en
    Mai 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Enseignant chercheur à la retraite

    Informations forums :
    Inscription : Mai 2020
    Messages : 7
    Par défaut
    Un grand merci pour ces explications. Pas faciles à comprendre à la première lecture mais après avoir relu cinq fois la doc Microsoft de range.item, j'ai fini par capter (enfin je crois, mais c'est pas tout à fait sûr ).

    En fait, ce que j'ai compris, c'est que, comme les arguments représentent un décalage, on peut très bien récupérer ainsi une cellule qui n'est pas dans la plage initiale !

    Ainsi par exemple, Range("$B$2:$D$4").Item(10) renvoie la cellule $B$5 !

    Cela dit, étant donné que je suis incapable de prévoir le comportement de range.item, même sur un cas simple comme celui ci-dessus, (la doc Microsoft est un modèle de ce qu'il ne faut pas faire en programmation : le résultat dépend de tout un tas de choses, y compris de la structure de la plage ), je retiens donc surtout que je m'abstiendrai de l'utiliser à l'avenir.

    Encore merci d'avoir pris le temps de me répondre.

    Ami calmant itou, Gg

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

Discussions similaires

  1. [XL-2016] Range sur une plage de cellule avec ligne variable VBA
    Par Nheude dans le forum Macros et VBA Excel
    Réponses: 30
    Dernier message: 01/12/2022, 16h26
  2. Conversion nombre stocké sous forme de texte sur une plage discontinue
    Par Kestion100 dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 30/09/2015, 11h50
  3. Propriété 'Enable' sur une checkbox
    Par gossetad dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 20/06/2011, 16h40
  4. range sur une ligne
    Par miopie dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/09/2010, 13h15
  5. Réponses: 4
    Dernier message: 12/08/2008, 12h20

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