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 :

Run-time error '9': Subscript out of range [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 23
    Points : 45
    Points
    45
    Par défaut Run-time error '9': Subscript out of range
    Bonjour à tous !

    Je sais que cette erreur à déjà été traitée de nombreuses fois, mais je n'ai malheureusement pas pû trouver réponse à ma situation malgrès les nombreuses solutions proposées. Je me retourne donc vers vous.
    Je dois extraire des infos de plus de 5000 fichiers excel (infos de form controls, activeX, ext ...). Pour cela, je possède un fichier contenant toutes les infos nécessaires à cette extraction de données :
    - Une première colonne contenant le nom de mon fichier
    - Une seconde contenant le chemin de mon fichier
    - Les prochaines colonnes serviront à stocker les données nécessaires

    Je possède le bout de code suivant (je veux tout d'abord boucler sur les 900 premiers fichiers) :
    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
    Dim YSheet As Integer
    
    Sub GetDataFromFile()
    Dim sh As Worksheet
    Dim File As String
    
    Set sh = ActiveSheet
    YSheet = 2
    While YSheet <> 900
        File = Workbooks("Mydatas.xlsm").Worksheets("Feuil1").Cells(YSheet, 2).Value
        Workbooks.Open Filename:=File
        If IsWorksheet("MachineDatas") = True Then
            Worksheets("MachineDatas").Activate
        Else
            GoTo NextIteration
        End If
        CheckBoxAndOptions
        TextBox
        Other
    NextIteration:
        Application.DisplayAlerts = False
        If ActiveWorkbook.Name = Workbooks("Mydatas.xlsm").Worksheets("Feuil1").Cells(YSheet, 1).Value Then ActiveWorkbook.Close
        Application.DisplayAlerts = True
        YSheet = YSheet + 1
    Wend
    End Sub
    Pour les fichiers ne possédant pas la feuille "MachineDatas", je veux l'ignorer et passer au fichier suivant.

    Le code ci-dessus marche très bien dans 90% des cas, je ne viens pas forcément vers vous pour trouver une solution toute faite, mais pour comprendre quelle est l'origine de mon problème. Dans les 10% restant, l'erreur suivante apparait pour la ligne de mon code en rouge :

    Run-time error '9':

    Subscript out of range
    Cependant, mon fichier s'ouvre quand même et c'est la que je ne comprends pas quel est le réel problème. Etant donné que le fichier s'était bien ouvert, j'ai essayé d'esquiver l'erreur avec un On Error Resume Next mais je ne dois pas assez bien maîtriser ceci pour l'utiliser, de plus, ça m'embête de laisser passer ceci sans même l'avoir compris.

    Le chemin de mon fichier est exact, l'extension de mes fichiers aussi, tout se passé sans encombre quand je copy past le path de mon fichier.

    Je vous remercie par avance du temps accordé à mon problème, et je vous souhaite une agreeable journée,
    Cordialement,
    François

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 766
    Points : 28 625
    Points
    28 625
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Voir du coté du gestionnaire d'erreurs
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    On Error Resume Next ' Va à l'instruction suivante en cas d'erreur 
    Worksheets("L").Range("A1") = "Hello"
    On Error GoTo 0 ' Rend la main à VBA
    A lire La gestion des erreurs dans Excel
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut


    Bonjour,

    il faudrait commencer par vérifier ce que contient la variable au moment de l'erreur,
    certainement un fichier n'existant pas dans le chemin indiqué !

    La fonction Dir renvoie une chaîne vide quand le fichier n'existe pas …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 23
    Points : 45
    Points
    45
    Par défaut
    Bonjour à tous et tout d'abord merci pour vos réponses et votre temps accordé à mon problème.

    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Voir du coté du gestionnaire d'erreurs
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    On Error Resume Next ' Va à l'instruction suivante en cas d'erreur 
    Worksheets("L").Range("A1") = "Hello"
    On Error GoTo 0 ' Rend la main à VBA
    A lire La gestion des erreurs dans Excel
    Bonjour Philippe,

    Je vais me pencher un peu plus là-dessus merci pour le lien, je vous tiens au courant sur ce que cela donne mais j'ai déjà essayé de manipuler ces gestions d'erreurs sans succès, l'erreur demeurait ...

    Citation Envoyé par Marc-L Voir le message


    Bonjour,

    il faudrait commencer par vérifier ce que contient la variable au moment de l'erreur,
    certainement un fichier n'existant pas dans le chemin indiqué !

    La fonction Dir renvoie une chaîne vide quand le fichier n'existe pas …
    Bonjour Marc,

    La variable File contient malheureusement le bon Path de mon fichier, la colonne correspondante à ce dernier vient d'un parcours de plusieurs dossiers et sous-dossiers, un MsgBox de ma variable me montre également que ce chemin est le bon. Je vais tout de même essayer de verifier une nouvelle fois cela avec la function Dir.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 23
    Points : 45
    Points
    45
    Par défaut
    Rebonjour,

    J'ai re essayé la gestion d'erreur avec tout type de On Error, et pas moyen, toutes les erreurs possibles et inimaginables sont esquivées, mais pas celles-ci, si quelqu'un d'autre à une idée!

    Merci d'avance,
    Cordialement,
    François

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 766
    Points : 28 625
    Points
    28 625
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai re essayé la gestion d'erreur avec tout type de On Error, et pas moyen, toutes les erreurs possibles et inimaginables sont esquivées, mais pas celles-ci
    Toutes les erreurs doivent être interceptées. Le tout est de savoir comment les gérer.
    On ne gère pas toutes les erreurs de la même façon.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 23
    Points : 45
    Points
    45
    Par défaut
    Bonjour Philippe,

    Merci du temps accordé à mon problème et de ta réponse.
    Je suis actuellement en train de prendre le temps pour réussir à capter l'erreur en fonction de mon code proposé.

    J'espère donc trouver comment "gérer" cette erreur en "l'esquivant" grâce à "On Error", cependant j'aimerai comprendre quelle est l'origine de cette erreur dans le but d'être plus apte à la gérer.

    Je me demandais si, vu que j'ouvre un nouveau fichier Excel, je ne devais pas faire la gestion d'erreur également sur ce fichier (j'ai lu quelques articles sur des fichiers .xlam), n'hésitez pas à donner votre avis là-dessus.
    Je pense cependant que le problème ne doit pas venir de là et doit être resolvable plus simplement.

    Je procède sûrement mal pour ouvrir mon fichier ?

    Cordialement,
    François

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 766
    Points : 28 625
    Points
    28 625
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Une erreur 9 provient en général parce-qu'un élément d'une collection invoquée n'est pas présente. Dans cet exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox ThisWorkbook.WorkSheets("Toto").Range("A1").Value
    Si la feuille nommée Toto qui fait partie de la collection WorkSheets du classeur où se trouve le code VBA n'existe pas cela provoquera une erreur 9.
    L'exemple que j'ai donné dans ma première réponse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    On Error Resume Next ' Va à l'instruction suivante en cas d'erreur 
    Worksheets("L").Range("A1") = "Hello"
    On Error GoTo 0 ' Rend la main à VBA
    Permet de passer à la ligne suivante si la feuille n'existe pas.
    Cependant si les instructions qui suivent la ligne provoquant l'erreur font des actions sur la même feuille, il est évident que ce n'est pas On Error Resume Next qu'il faut utiliser. D'où le lien que je t'ai proposé pour lecture sur le sujet.

    Utilise les outils de débogage pour isoler le problème et voir où le problème se situe et pourquoi tu as cette erreur.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 23
    Points : 45
    Points
    45
    Par défaut
    Merci pour cette précision.

    Je comprends dorénavant un peu mieux comment tout cela marche, j'ai regardé le tout et je me retrouve avec le code suivant :

    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
     
    Dim YSheet As Integer
     
    Sub GetDataFromFile()
    Dim sh As Worksheet
    Dim File As String
     
    Set sh = ActiveSheet
    YSheet = 2
    While YSheet <> 900
        File = Workbooks("Mydatas.xlsm").Worksheets("Feuil1").Cells(YSheet, 2).Value
        On Error GoTo NextIteration
        Workbooks.Open Filename:=File
        If IsWorksheet("MachineDatas") = True Then
            Worksheets("MachineDatas").Activate
        Else
            GoTo NextIteration
        End If
        CheckBoxAndOptions
        TextBox
        Other
    NextIteration:
        Application.DisplayAlerts = False
        If ActiveWorkbook.Name = Workbooks("Mydatas.xlsm").Worksheets("Feuil1").Cells(YSheet, 1).Value Then ActiveWorkbook.Close
        Application.DisplayAlerts = True
        YSheet = YSheet + 1
    Wend
    End Sub
    L'exemple n'est peut être pas le meilleur, mais je ne comprends pas pourquoi une erreur persiste sur cette même ligne (j'aurai pu comprendre une erreur sur le Close si le fichier c'était mal ouvert), mais malgré mon On Error, l'erreur est toujours présente.

    N'ai-je toujours pas compris comment marchent les gestions d'erreurs ? L'ai-je mal interprété ?

    Merci pour le temps consacré,
    Cordialement,
    François

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 766
    Points : 28 625
    Points
    28 625
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Déjà, il faut un Exit Sub avant l'étiquette de ligne NextIteration: sinon il y aura un problème pour les cas où il n'y aurait pas d'erreur. De plus j'aurais pris comme nom GestionErreur qui est plus parlant pour gérer une erreur que NextIteration.
    De plus, il est important de placer un On error Goto 0 après les lignes sensées avoir un problème pour rendre la main au programme VBA.

    [EDIT]
    En relisant ta procédure, je réalise que tu ne gères pas l'erreur mais tu te contentes d'aller à une étiquette où tu fais déjà un Goto To après un Else (ligne 17)
    C'est une très mauvaise pratique de programmation d'utiliser des Goto To (Sauf pour le On Error car on a pas le choix).
    As-tu utiliser le débogage ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 23
    Points : 45
    Points
    45
    Par défaut
    Bonjour Philippe,

    En effet je remarque que c'est pas très elegant, mon Else devrait pourvoir être supprimé vu que j'ai ma gestion d'erreur au dessus.

    Je ne suis pas à l'aise avec le débogage malheureusement car il m'a l'air bien pratique, et j'ai malheureusement plus le temps nécessaire pour m'y mettre.
    Je vais manipuler dans la matinée un peu plus cette gestion d'erreur en prenant en compte ta remarque, puis je reviendrai vous faire part du résultat.

    Merci beaucoup,
    Cordialement,
    François

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 23
    Points : 45
    Points
    45
    Par défaut
    J'ai abordé ici le problème différemment :

    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
     
    Dim YSheet As Integer
     
    Sub GetDataFromFile()
    Dim sh As Worksheet
    Dim File As String
     
    Set sh = ActiveSheet
    YSheet = 2
    While YSheet <> 900
        File = Workbooks("Mydatas.xlsm").Worksheets("Feuil1").Cells(YSheet, 2).Value
        'Va à l'instruction suivante si erreur
        On Error Resume Next
        Workbooks.Open Filename:=File
        'Je rend le controle au VBA
        On Error GoTo 0
        'If IsWorksheet("MachineDatas") = True Then
        'Gestion d'erreur qui s'applique uniquement à ma prochaine ligne, mais qui me dirige vers GestionErreur
        On Error GoTo GestionErreur
        Worksheets("MachineDatas").Activate
        'Je rend le controle une nouvelle fois au VBA
        On Error GoTo 0
        CheckBoxAndOptions
        TextBox
        Other
    'Si le fichier s'est bien ouvert, je le ferme, sinon, j'incrémente ma boucle pour ouvrir le prochain fichier
    GestionErreur:
        Application.DisplayAlerts = False
        If ActiveWorkbook.Name = Workbooks("Mydatas.xlsm").Worksheets("Feuil1").Cells(YSheet, 1).Value Then ActiveWorkbook.Close
        Application.DisplayAlerts = True
        YSheet = YSheet + 1
    Wend
    End Sub
    J'ai quelques questions, pourquoi dans ce cas mettre un Exit sub avant GestionErreur ? Car cela voudrait dire que je veuille quitter ma sub lors d'une erreur, hors je voudrai continuer à incrémenter ma boucle, fermer mon fichier, et reprendre sans extraire aucune information de cette feuille. Au prochain tour de boucle je voudrai ouvrir un autre fichier ext ...

    Quand j'utilise On Error Resume Next, est-ce que mon programme va executer la ligne et ne pas renseigner les erreurs ? Ou alors, est-ce qu'il va, si il rencontre une erreur pendant l'éxécution de cette ligne la passer et faire comme si elle n'avait pas existé ? Car si il ne renseigne simplement pas l'erreur (ce que je recherche vu que mon fichier est ouvert), un resume next suffit. Sinon, j'aurai besoin d'un On Error GoTo GestionErreur (ou je ne passerai pas par la condition qui va executer le close de mon document actif ne sera pas celui attend).

    Merci, cordialement,
    François

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

Discussions similaires

  1. [XL-2007] Error 9 : subscript out of range
    Par Me.Leti dans le forum Excel
    Réponses: 5
    Dernier message: 28/08/2012, 10h06
  2. Réponses: 2
    Dernier message: 15/08/2010, 16h20
  3. [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
  4. Réponses: 1
    Dernier message: 23/04/2008, 10h37
  5. [VBA] Run-time error : '35600' Index out of bound
    Par neo2k2 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 18/03/2008, 16h23

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