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 :

"runtime error 9 subscript out of range" que je n'arrive pas à identifier [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2015
    Messages : 25
    Par défaut "runtime error 9 subscript out of range" que je n'arrive pas à identifier
    Bonjour à tous,

    J'ai mon programme qui produit une erreur 9 lorsque i prend la valeur 7.
    Je démarre ma boucle à 4 et l'erreur apparait avec Code(i, 1) = ...

    Quelqu'un peut-il m'expliquer l'erreur ?

    Je vous joins le fichier au cas où.
    test.xlsm

    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
    52
    53
    54
     
    Sub Valeur_vers_codification_indice()
     
    Dim Cloture, Code, i As Long, pourcentage As Double, Dcel As Range, x As Long
     
    ActiveWorkbook.Worksheets("Valeur").Activate
    Set Dcel = Range("B" & Rows.Count).End(xlUp)(1, 2)
    Cloture = Range("B5", Dcel)
    Set Dce2 = Range("C" & Rows.Count).End(xlUp)(1, 2)
    Code = Range("C5", Dce2)
     
    For i = 4 To UBound(Cloture)
            If Cloture(i, 1) = Cloture(i - 2, 1) And Cloture(i - 1, 1) > Cloture(i, 1) And Cloture(i - 3, 1) < Cloture(i, 1) Then
                Code(i, 1) = "r-"
            ElseIf Cloture(i, 1) = Cloture(i - 2, 1) And Cloture(i - 1, 1) > Cloture(i, 1) And Cloture(i - 3, 1) > Cloture(i, 1) Then
                If Cloture(i + 1, 1) > Cloture(i, 1) Then
                Code(i, 1) = "E+"
                Else
                Code(i, 1) = "e"
                End If
            ElseIf Cloture(i, 1) = Cloture(i - 2, 1) And Cloture(i - 1, 1) > Cloture(i, 1) And Cloture(i - 3, 1) > Cloture(i, 1) Then
                Code(i, 1) = "r-"
            ElseIf Cloture(i, 1) = Cloture(i - 2, 1) And Cloture(i - 1, 1) > Cloture(i, 1) And Cloture(i - 3, 1) < Cloture(i, 1) Then
                If Cloture(i + 1, 1) < Cloture(i, 1) Then
                Code(i, 1) = "E-"
                Else
                Code(i, 1) = "r"
                End If
     
            ElseIf Cloture(i - 2, 1) > Cloture(i - 1, 1) Then
                If Cloture(i, 1) < Cloture(i - 1, 1) Then
                    Code(i, 1) = "e1"
                ElseIf Cloture(i, 1) > Cloture(i - 1, 1) Then
                    If Cloture(i, 1) > Cloture(i - 2, 1) Then
                        Code(i, 1) = "r+"
                    Else
                        Code(i, 1) = "e+"
                    End If
                End If
            ElseIf Cloture(i - 2, 1) < Cloture(i - 1, 1) Then
                If Cloture(i, 1) > Cloture(i - 1, 1) Then
                    Code(i, 1) = "r1"
                ElseIf Cloture(i, 1) < Cloture(i - 1, 1) Then
                    If Cloture(i, 1) < Cloture(i - 2, 1) Then
                        Code(i, 1) = "e-"
                    Else
                        Code(i, 1) = "r-"
                    End If
                End If
            End If
    Next i
    Range("C" & Rows.Count).End(xlUp)(1, 2) = Code
    Range("C5").Resize(UBound(Cloture, 1), UBound(Cloture, 2)) = Code
    End Sub

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Bonjour !

    Juste avec une vraie vérification de la ligne déclenchant l'erreur et du contenu de la fenêtre des Variables locales

    _________________________________________________________________________________________________________
    Je suis Paris, Nice, Bruxelles, Charlie, …

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2015
    Messages : 25
    Par défaut
    L'erreur se déclenche à la ligne 47 et le message d'erreur est : Run-time error '9' : Subscript out of range

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Merci de ne pas quoter systématiquement l'intégralité d'un message juste précédent !

    Et ta vérification du contenu des variables de cette ligne dans la fenêtre des Variables locales ?‼
    Car ce message est un classique : le développeur appelle quelque chose n'existant pas ‼

  5. #5
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    as-tu au moins des données en colonne C ? Ca n'en as pas vraiment l'air, et ça expliquerait pourquoi ça plante à l'indice 6 (puisque Code commence en C5)
    tu parles d'indice 7, tu es certain ?


    Au passage, quand je vois un code aussi alambiqué pour deux tableaux provenant de plages excel, je me dis qu'on admire une usine à gaz codée à la volée, sans prendre de la hauteur pour analyser la meilleur stratégie à adopter.
    D'ailleurs, j'ai abandonné l'idée d'en comprendre la logique, que tu n'as même pas tenu à nous expliquer

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    A joe.levrai, à qui je mets un
    J'ai pour le coup une idée d'appli du tonnerre de dieu :
    inventer un jeu de mots croisés où l'on pourrait ajouter des lettres en dehors de la grille ... Ca va péter des flammes ... , sûr et certain ...

  7. #7
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2015
    Messages : 25
    Par défaut
    Citation Envoyé par Marc-L Voir le message

    Merci de ne pas quoter systématiquement l'intégralité d'un message juste précédent !

    Et ta vérification du contenu des variables de cette ligne dans la fenêtre des Variables locales ?‼
    Car ce message est un classique : le développeur appelle quelque chose n'existant pas ‼
    ok pour le conseil "quoter".

    Je commence à comprendre.
    Mon tableau Code est de type Variant/Variant(1 to 5, 1 to 2) alors que mon tableau Cloture (1 to 3571, 1 to 2)
    Si je comprends bien mon tableau va de 1 à 5. Je suppose que c'est pour ça que ça bug quand i = 6.
    Code dépend de Dce2 qui est une valeur de type Variant/Object/Range. Je suppose que mon problème vient de Dce2 qui est la colonne qui doit recevoir les données de la boucle.

    J'essaie de transformer les chiffres du tableau Cloture par des lettres (e, r, E, R) et d'inscrire ces lettres dans la colonne suivante (qui est naturellement vide)
    J'espère avoir été assez clair dans mes explications.

  8. #8
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2015
    Messages : 25
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    Bonjour,

    as-tu au moins des données en colonne C ? Ca n'en as pas vraiment l'air, et ça expliquerait pourquoi ça plante à l'indice 6 (puisque Code commence en C5)
    tu parles d'indice 7, tu es certain ?


    Au passage, quand je vois un code aussi alambiqué pour deux tableaux provenant de plages excel, je me dis qu'on admire une usine à gaz codée à la volée, sans prendre de la hauteur pour analyser la meilleur stratégie à adopter.
    D'ailleurs, j'ai abandonné l'idée d'en comprendre la logique, que tu n'as même pas tenu à nous expliquer
    Je n'ai pas de données dans la colonne C car elle doit recevoir les valeurs de la colonne B issue de la boucle (et tu as raison pour l'indice 6).

    J'essaie de faire avec mes connaissances parcellaires en programmation. C'est une usine à gaz mais c'était pire dans ma première version. Et pour un néophyte, il est très difficile de... prendre de la hauteur.

    Pour la logique, je ne l'ai pas expliqué car j'avais l'impression qu'elle ne pouvait être qu'évidente pour un informaticien.

    La voici :
    Dans la colonne B, le nombre inscrit dans une cellule se compare aux cellules précédentes. En fonction des valeurs précédentes, le programme doit transformer le nombre en une lettre (e, r, E, R avec un -/+) et l'inscrire dans la cellule à côté (c'est à dire dans la colonne C).

    Et j'espère qu'avec votre aide, mon usine perdra ... son gaz

  9. #9
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Un peu de logique et de soin sont nécessaires
    Un bloc d'instructions conditionnelles de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    If condition1 Then
    action1
     
    ElseIf condition2 Then
    action2
    ......
    ElseIf conditionn then
    action_n
     
    end if
    signifie que si la condition1 est vérifiée on exécute l'action1, sinon, si la condition2 est vérifiiée, on exécute l'action2, etc ...
    Dans un tel bloc, seule une condition correspond et donc seule une action est exécutée.
    Examine maintenant ce que tu as écrit (j'ai volontairement "rapproché" certaines de tes lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    If Cloture(i, 1) = Cloture(i - 2, 1) And Cloture(i - 1, 1) > Cloture(i, 1) And Cloture(i - 3, 1) < Cloture(i, 1) Then
    ' .....
    ElseIf Cloture(i, 1) = Cloture(i - 2, 1) And Cloture(i - 1, 1) > Cloture(i, 1) And Cloture(i - 3, 1) < Cloture(i, 1) Then
    '....
    ElseIf Cloture(i, 1) = Cloture(i - 2, 1) And Cloture(i - 1, 1) > Cloture(i, 1) And Cloture(i - 3, 1) > Cloture(i, 1) Then
    '.....
    ElseIf Cloture(i, 1) = Cloture(i - 2, 1) And Cloture(i - 1, 1) > Cloture(i, 1) And Cloture(i - 3, 1) > Cloture(i, 1) Then
    '.....
    End If
    Ce n'est pas déjà pas très sérieux, hein ...

  10. #10
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2015
    Messages : 25
    Par défaut
    J'avais remarqué que mes conditions n'étaient pas correctes et je compte les corriger.
    J'ai aussi remarqué que j'avais oublié Dce2 en dim.

    j'ai surtout besoin de corriger l'erreur du second tableau.
    J'ai créé un second tableau pour inscrire les résultats dans la colonne C
    Peut-être, n'ai-je pas besoin d'un second tableau ? Que les résultats peuvent être inscrit plus simplement dans la colonne C ?
    Malheureusement je ne sais pas faire.

    Il me semble que cela se situe dans ces 2 lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set Dce2 = Range("C" & Rows.Count).End(xlUp)(1, 2)
    Code = Range("C5", Dce2)

  11. #11
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par Erkidoux Voir le message
    Si je comprends bien mon tableau va de 1 à 5. Je suppose que c'est pour ça que ça bug quand i = 6.
    Certainement comme visuellement constatable dans la fenêtre Variables locales

  12. #12
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2015
    Messages : 25
    Par défaut
    Merci Marc-L, ton indication m'a permis de trouver une solution.
    J'ai réussi à agrandir mon second tableau en simplifiant Dce2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Dce2 = Range("C" & Rows.Count)(1, 2)
    Dce2 est un tableau qui englobe toute la colonne. N'y a-t-il pas une solution pour que mon tableau Dce2 soit paramétré de la même taille que Dce1 (3571 cellules) ?

  13. #13
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Soit le déclarer via Redim soit via l'affectation d'un Range équivalent en taille …

  14. #14
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour à tous,

    Juste une remarque.
    Plutôt que d'utiliser des If, ElseIf à l'infini.

    La méthode, même imbriquée.

    est parfois bien utile à la lisibilité d'un code

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

Discussions similaires

  1. [XL-2013] Run-time error '9': Subscript out of range
    Par francoisem dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 16/12/2014, 09h06
  2. [XL-2007] Error 9 : subscript out of range
    Par Me.Leti dans le forum Excel
    Réponses: 5
    Dernier message: 28/08/2012, 10h06
  3. Réponses: 2
    Dernier message: 15/08/2010, 16h20
  4. [debutant] Run-time error '9': Subscript out of range
    Par NikoBe dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/12/2008, 08h26
  5. Réponses: 1
    Dernier message: 23/04/2008, 10h37

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