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

  1. #1
    Nouveau Candidat au Club
    Erreur d'exécution 9 : L'indice est en dehors des dimension du tableau
    Bonjour !

    Je souhaite utiliser une macro Excel pour renommer une série de fichiers pdf. Dans la colonne A se trouvent les noms d'origine et dans la colonne B les noms que je souhaite donner aux fichiers. Je suis toute débutante en VBA et j'ai combiné plusieurs programmes trouvés sur des forums pour arriver au résultat 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
    Sub macro2()
     
     Sheets(Renommer).Select
        Dim derlign As Long
        Dim k As Long
        derlign = Range("A2:s2", "A5:s5").End(xlDown).Row
     
        For k = 2 To derlign
     
        Dim AncienNom As String, NouveauNom As String
        AncienNom = "Users/Coline/Desktop/renommage de fichiers pdf/LOAD/" & Range("A" & k)
        NouveauNom = "Users/Coline/Desktop/renommage de fichiers pdf/LOAD/" & Range("B" & k)
        On Error Resume Next
        Name AncienNom As NouveauNom
        If Err = 75 Then Exit Sub
        Next k
    End Sub


    Lorsque je lance le programme, l'erreur d'exécution 9 : l'indice est en dehors des dimensions du tableau apparaît. Après plusieurs tests je ne trouve pas ce qui provoque ce message d'erreur.

    Merci d'avance pour votre aide

  2. #2
    Membre expert
    bonjour
    1- mettre ton code entre balise (#) pour faciliter la lecture
    2- je crois que l'erreur vient de la détermination de la dernière ligne non vide que je trouve bizarre
    (moi aussi autodidacte et peut être que c'est correcte ce que tu as écris à savoir )
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    derlign = Range("A2:s2", "A5:s5").End(xlDown).Row

    je préfère et pour éviter tous risque déclarer l'onglet sujet de votre code
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Ws As Worksheet 
    'Attribue la référence objet à la variable 
    'La feuille est un Objet: la variable doit donc être précédée de l'instruction Set lors de l'attibution. 
    Set Ws = Worksheets("Feuil2")

    et puis déclarer la dernière ligne comme ce ci :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dim derlig as long
     
    derlig = ws.Range("A" & Rows.Count).End(xlUp).Row


    pour tester la valeur de derlig vous pouvez récupérer cette valeur via message et la comparer avec vos données

    j'espère que ça t'aide à avancer

    Bonne continuation
    -----------------------------------------------*****-------------------------------------------------------------------------------------------
    Notre seul pouvoir véritable consiste à aider autrui.

  3. #3
    Expert éminent sénior
    Citation Envoyé par ColineB Voir le message
    D'où vient ce Renommer ?
    Si c'est une variable, où (et comment) est-elle déclarée et initialisée ?
    Si c'est un nom d'onglet, il manque les guillemets.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  4. #4
    Nouveau Candidat au Club
    Merci BENNASR, cela me paraît effectivement mieux, mais je rencontre toujours le même message d'erreur lorsque je lance le programme corrigé comme suit :

    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
    Sub macro2()
    Sheets(Renommer).Select
    Dim derlign As Long
    Dim k As Long
    Dim Ws As Worksheet
    'Attribue la référence objet à la variable
    'La feuille est un Objet: la variable doit donc être précédée de l'instruction Set lors de l'attibution.
    Set Ws = Worksheets("Feuil1")
     
    Dim derlig As Long
    derlign = Ws.Range("A" & Rows.Count).End(xlUp).Row
     
    For k = 2 To derlign
     
    Dim AncienNom As String, NouveauNom As String
    AncienNom = "Users/Coline/Desktop/renommage de fichiers pdf/LOAD/" & Range("A" & k)
    NouveauNom = "Users/Coline/Desktop/renommage de fichiers pdf/LOAD/" & Range("B" & k)
    On Error Resume Next
    Name AncienNom As NouveauNom
    If Err = 75 Then Exit Sub
    Next k
    End Sub

  5. #5
    Nouveau Candidat au Club
    Citation Envoyé par Menhir Voir le message
    D'où vient ce Renommer ?
    Si c'est une variable, où (et comment) est-elle déclarée et initialisée ?
    Si c'est un nom d'onglet, il manque les guillemets.

    Il s'agit du nom de mon fichier Excel dans lequel se trouvent les noms des fichiers.
    Lorsque j'ai copié cette partie du code, le nom du fichier s'est mis automatiquement à cet endroit-là.

  6. #6
    Expert éminent sénior
    Citation Envoyé par ColineB Voir le message
    Il s'agit du nom de mon fichier Excel dans lequel se trouvent les noms des fichiers.
    Les objets Sheets ne référencent pas de fichiers mais des onglets (feuilles).

    Lorsque j'ai copié cette partie du code, le nom du fichier s'est mis automatiquement à cet endroit-là.
    Il est peu probable que l'enregistrement automatique de macro ait généré une variable.
    Donc, s'il a écrit cette ligne, c'est que Renommer est un nom de feuille (et non de fichier) et il l'a forcément mis entre guillemets.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  7. #7
    Nouveau Candidat au Club
    Menhir le nom s'est bien mis tout seul (ce que j'ai effectivement trouvé bizarre). J'ai suivi ton conseil et je l'ai remplacé par "Feuil1" comme suit, et le programme n'affiche plus de message d'erreur mais il ne se passe rien du tout, les fichiers ne sont pas renommés.

    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
    Sub macro2()
    Sheets("Feuil1").Select
    Dim derlign As Long
    Dim k As Long
    Dim Ws As Worksheet
    'Attribue la référence objet à la variable
    'La feuille est un Objet: la variable doit donc être précédée de l'instruction Set lors de l'attibution.
    Set Ws = Worksheets("Feuil1")
     
    Dim derlig As Long
    derlign = Ws.Range("A" & Rows.Count).End(xlUp).Row
     
    For k = 2 To derlign
     
    Dim AncienNom As String, NouveauNom As String
    AncienNom = "Users/Coline/Desktop/renommage de fichiers pdf/LOAD/" & Range("A" & k)
    NouveauNom = "Users/Coline/Desktop/renommage de fichiers pdf/LOAD/" & Range("B" & k)
    On Error Resume Next
    Name AncienNom As NouveauNom
    If Err = 75 Then Exit Sub
    Next k
    End Sub

  8. #8
    Membre expert
    Ce que recommande Menhir (salut au passage) et de mettre le nom de l'onglet entre guillemets à savoir "Renommer" et non pas de remplacer par feuil1 :
    Sheets("Renommer").select
    -----------------------------------------------*****-------------------------------------------------------------------------------------------
    Notre seul pouvoir véritable consiste à aider autrui.

  9. #9
    Expert éminent sénior
    Citation Envoyé par ColineB Voir le message
    Menhir le nom s'est bien mis tout seul
    Je le répète, si l'enregistrement automatique a mis un nom dans Sheets, c'était obligatoirement un nom d'onglet (et non de fichier) et il était encadré de guillemets.

    J'ai suivi ton conseil et je l'ai remplacé par "Feuil1" comme suit
    La question me semble triviale mais je préfère la poser : est-ce bien dans Feuil1 que se trouvent tes noms de fichiers ?
    Est-ce bien dans la colonne A ?

    il ne se passe rien du tout, les fichiers ne sont pas renommés.
    Fais tourner ton programme en pas-à-pas en observant le contenu des variables, en particulier derlign et AncienNom.

    On ne mets pas de déclaration de variable (Dim) dans une boucle.

    Supprime ton On Error pour voir la nature d'éventuelles erreur.
    Tu pourras éventuellement le remettre (ce que, personnellement, je déconseille fortement) lorsque le code sera fonctionnel.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  10. #10
    Nouveau Candidat au Club
    La question me semble triviale mais je préfère la poser : est-ce bien dans Feuil1 que se trouvent tes noms de fichiers ?
    Est-ce bien dans la colonne A ?
    Oui, la feuille qui contient les données s'appelle bien Feuil1, la colonna A est celle contenant les anciens noms et la B les nouveaux noms.

    Fais tourner ton programme en pas-à-pas en observant le contenu des variables, en particulier derlign et AncienNom.

    On ne mets pas de déclaration de variable (Dim) dans une boucle.

    Supprime ton On Error pour voir la nature d'éventuelles erreur.
    Tu pourras éventuellement le remettre (ce que, personnellement, je déconseille fortement) lorsque le code sera fonctionnel.

    J'ai enlevé OnError et il s'affiche Erreur d'exécution 76 : chemin d'accès introuvable.
    Et je peux remplacer Dim par quoi dans la boucle?

    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
    Sub macro2()
    Sheets("Feuil1").Select
    Dim derlign As Long
    Dim k As Long
    Dim Ws As Worksheet
    'Attribue la référence objet à la variable
    'La feuille est un Objet: la variable doit donc être précédée de l'instruction Set lors de l'attibution.
    Set Ws = Worksheets("Feuil1")
     
    Dim derlig As Long
    derlign = Ws.Range("A" & Rows.Count).End(xlUp).Row
     
    For k = 2 To derlign
     
    Dim AncienNom As String, NouveauNom As String
    AncienNom = "Users/Coline/Desktop/renommage de fichiers pdf/LOAD/" & Range("A" & k)
    NouveauNom = "Users/Coline/Desktop/renommage de fichiers pdf/LOAD/" & Range("B" & k)
    Name AncienNom As NouveauNom
    If Err = 75 Then Exit Sub
    Next k
    End Sub

  11. #11
    Expert éminent sénior
    J'ai enlevé OnError et il s'affiche Erreur d'exécution 76 : chemin d'accès introuvable.
    Quelle ligne de code est signalée par le débugage ?

    Cette erreur indique que le chemin spécifié n'existe pas dans ton filesystem.

    Et je peux remplacer Dim par quoi dans la boucle?

    On ne le remplace pas, on le met à l'extérieur de la boucle.
    Les déclarations doivent toujours être placées en début de code, avant toute autre instruction.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  12. #12
    Membre émérite
    Bonjour,

    Ne manquerait pas, en plus des remarques de Menhir (salutations), la lettre du lecteur?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    AncienNom = "Users/Coline/Desktop/renommage de fichiers pdf/LOAD/" & Range("A" & k)


    à remplacer par :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    AncienNom = "C:\Users/Coline/Desktop/renommage de fichiers pdf/LOAD/" & Range("A" & k)


    également vérifier les séparateurs /. Chez moi, dans un chemin, on utilise \, pas /

    Donc :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    AncienNom = "C:\Users\Coline\Desktop\renommage de fichiers pdf\LOAD\" & Range("A" & k)


    Idem pour NouveauNom...

    Le plus simple, pour être sur de ne pas se tromper sur le nom complet du "chemin" d'accès à un répertoire c'est :
    > clic droit sur un des fichiers du répertoire / Propriétés,
    > sélectionner puis copier l'emplacement,
    > coller dans votre code en pensant à ajouter, si nécessaire, le dernier \

    Voilà
    Cordialement,
    Franck

  13. #13
    Expert éminent sénior
    Citation Envoyé par pijaku Voir le message
    Ne manquerait pas, en plus des remarques de Menhir (salutations), la lettre du lecteur?
    Quand j'ai vu les séparateurs "/", j'ai pensé qu'il s'agissait soit de MacOS soit de Linux et comme je connais mal ces deux systèmes, j'ai préféré m'abstenir concernant le lecteur ou la référence à la racine.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  14. #14
    Nouveau Candidat au Club
    Quand j'ai vu les séparateurs "/", j'ai pensé qu'il s'agissait soit de MacOS soit de Linux et comme je connais mal ces deux systèmes, j'ai préféré m'abstenir concernant le lecteur ou la référence à la racine.
    Franck et Menhir effectivement je suis sur MacOS, donc l'emplacement du fichier s'écrit bien comme cela.

    Quelle ligne de code est signalée par le débugage ?

    Cette erreur indique que le chemin spécifié n'existe pas dans ton filesystem.
    C'est cette ligne de code là qui est signalée :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Name AncienNom As NouveauNom

  15. #15
    Expert éminent sénior
    Citation Envoyé par ColineB Voir le message
    Franck et Menhir effectivement je suis sur MacOS, donc l'emplacement du fichier s'écrit bien comme cela.
    VBA semble penser le contraire.
    Et il est têtu...

    Es-tu sûre qu'il n'y aurait pas un caractère à ajouter en début de chemin pour indiquer qu'on part de la racine ?...
    Je n'y connais pas grand chose en MacOS, mais, d'après le peu que je connais, un chemin absolu commence par un "/", ce qui n'est pas le cas dans ton code.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  16. #16
    Membre émérite
    A mon avis, ce n'est pas la fonction Name qui pose problème, mais bel et bien les chemins de tes fichiers.

    @Menhir

    1- Les chemins, sous MacOs, ne commencent-ils pas par un /?
    cf : https://forums.macg.co/threads/speci.../#post-5213421
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    AncienNom = "/Users/Coline/Desktop/renommage de fichiers pdf/LOAD/" & Range("A" & k)


    2- Le bureau n'aurait-il pas un chemin d'accès spécifique?
    cf : http://www.rondebruin.nl/mac/mac007.htm

    3- Sinon...
    Avec Excel 2011 il faut utiliser le séparateur :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    "Macintosh HD:Users:Coline<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />esktop:renommage de fichiers pdf:LOAD:" & Range("A" & k), fileformat:=53


    Avec Mac Excel 2016 :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    /Users/YourUserName/Desktop/renommage de fichiers pdf/LOAD/" & Range("A" & k)


    De plus, il vaut toujours mieux indiquer la propriété utilisée pour le Range. Remplacer : Range("A" & k) par : Range("A" & k).Value
    En espérant que dans la cellule Range("A" & k), il y ait bien le nom du fichier + extension...
    Cordialement,
    Franck

  17. #17
    Responsable
    Office & Excel

    Salut

    Citation Envoyé par pijaku Voir le message
    A mon avis, ce n'est pas la fonction Name qui pose problème[...]
    Perso, je serais plus nuancé. A mon avis, Name utilise les api windows liées au filesystem, et cela génère beaucoup de soucis avec les Mac car la gestion des fichiers n'est pas du tout la même.

    S'il existe un enregistreur de macro sur les Mac, je le lancerais pour une simple sauvegarde, histoire de voir comment le chemin du fichier est écrit, et j'essaierais d'en déduire la logique de construction du chemin en Mac. Puis je tenterais la chose avec la fonction Name, par exemple dans la fenêtre d'exécution, histoire de voir si le problème persiste...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------