Fermer un fichier Excel mode de Compatibilité

Résolu
Phil.ch -  
 Phil.ch -
bonjour à vous toutes et tous,

Via une macro ,j'ouvre un fichier Excel. Celui-ci fait par une autre personne à été mis en mode de Compatibilité ( Je l'appel B pour la suite ...).

Depuis ce fichier B, je copie des données d'un tableau que je reporte dans le tableau de mon document.
Cette partie là ne me pose pas trop de problème.
Par contre, dès que j'essaye de retourner dans le fichier B, j'ai le message suivant : Erreur d'exécution : 9 , L'indice n'appartient pas à la sélection.

Qui peut me dire ce qui se passe. Car j'ai remarqué que tout ce qu'identifie le fichier B une fois que celui-ci est ouvert, me donne le message d'erreur.

Merci de m'expliquer ce qui se passe et comment faire pour pouvoir fermer ce fichier automatiquement.

D'avance merci à vous

2 réponses

  1. Utilisateur anonyme
     
    Bonjour Phil.ch,

    L'erreur d'exécution #9 : « L'indice n'appartient pas à la sélection »
    se produit lorsque l'indice d'un tableau est en dehors des limites
    de ce tableau ; exemple : Dim Tbl(5) avec Option Base 1 =>
    erreur #9 si tu utilises Tbl(0) ou Tbl(10).

    Cette erreur #9 peut aussi se produire si tu essayes de référencer
    un élément qui ne fait pas partie d'une collection. Exemple :
    Worksheets(6) quand il n'y a que 5 feuilles de calcul ;
    Worksheets("Juin") quand la feuille "Juin" n'existe pas ;
    Workbooks("ABC") quand le classeur "ABC" n'est pas
    chargé en mémoire vive (RAM).

    Et n'oublies pas que pour ouvrir un fichier, il faut préciser son
    chemin (sauf si dans répertoire en cours) et son extension :
    *.xlsx ou *.xlsm

    Mais difficile d'en dire plus sans voir ton code !

    Si ton problème est réglé, merci d'aller en haut de page
    pour cliquer sur « Marquer comme résolu ».

    Cordialement.  😊
     
    1
    1. Phil.ch
       
      Bonjour Albkan,

      Un grand merci pour ton explication. Elle est claire et j'ai bien compris. Par contre, ce que je ne comprends pas c'est pourquoi elle vient.


      J'ouvre le fichier sans problème, je copie et reporte sans soucis avec ce qui suit :

      Dim CHE As String, NomFi As String, ONGL As String, CEFI As String, NomComp As String
      CHE = Sheets("Lien").Range("B3").Value  ' Chemin d'accès
      NomFi = Sheets("Lien").Range("C3").Value    ' Nom du fichier avec extension
      ONGL = Sheets("Lien").Range("D3").Value     ' Nom de la page à travailler
      CEFI = Sheets("Lien").Range("C2").Value     ' Nom du fichier depuis lequel j'ouvre
      NomComp = CHE & NomFi           'Mise en place pour ouvrir le fichier
      Workbooks.Open Filename:=NomComp
      X = 2   'Valeur du tableau RH
      'Boucle pour déterminer la zone à copier
      While Range("B" & X) <> ""
      X = X + 1
      Wend
      X = X - 1
      Range("B2", "G" & X).Copy
      Windows(CEFI).Activate
      Sheets("LP").Range("B2").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
      False, Transpose:=False
      Application.CutCopyMode = False
      
      Et c'est ci-dessous que celà coince : 
      
          'Retour au fichier RH pour le fermer
          Windows(NomFi).Activate
          ActiveWorkbook.Saved = True
          ActiveWorkbook.Close
      
      
      '..... etc etc la suit


      PS : tu l'as constaté, je bricole .... C'est surement pas fait dans les règles ni dans la simplicité, mais si tu peux tout de même m'aider.... Je t'en, ou vous, en serai reconnaissant.

      Avec mes remerciements
      0
      1. Utilisateur anonyme > Phil.ch
         
         
        Rebonjour Phil.ch,

        Tu peux me tutoyer ; mon explication vient car dans ton message initial,
        tu as écris que tu avais cette erreur :

        « Erreur d'exécution : 9 , L'indice n'appartient pas à la sélection. »

        --------------------------------------------------------

        Voici d'abord une simplification de la première partie de ton code VBA :

        
        Option Explicit
        
        Sub Essai()
        
          Dim CHE As String, NomFi As String, ONGL As String, CEFI As String, NomComp As String
        
          ' N'oublie pas les points « . » qui sont  devant les « [ » !
          With Worksheets("Lien")
            CHE = .[B3]      ' Chemin d'accès
            NomFi = .[C3]    ' Nom du fichier avec extension
            ONGL = .[D3]     ' Nom de la page à travailler
            CEFI = .[C2]     ' Nom du fichier depuis lequel j'ouvre
          End With
        
          NomComp = CHE & NomFi   ' Mise en place pour ouvrir le fichier
          Workbooks.Open NomComp
        
          ' Ou directement, sans utiliser NomComp (auquel cas tu peux
          ' supprimer sa déclaration en ligne Dim) :
          ' Workbooks.Open CHE & NomFi
        
          ' X : selon la colonne B, dernière ligne du tableau ; attention :
          ' valable seulement si pas de données sous ton tableau
          X = Range("B" & Rows.Count).End(xlUp).Row
        
          ' S'il y a des données sous ton tableau, mets ce que tu avais
          ' mis au départ :
          ' X = 2   'Valeur du tableau RH
          ' Boucle pour déterminer la zone à copier
          ' While Range("B" & X) <> ""
          '   X = X + 1
          '  Wend
          '  X = X - 1
        
          ' Attention : ton instruction de départ n'est pas bonne !
          ' Pour une plage, tu dois utiliser le caractère séparateur
          ' deux-points « : »
          Range("B2:G" & X).Copy
        
          Windows(CEFI).Activate
          [LP!B2].PasteSpecial Paste:=xlPasteAll
          Application.CutCopyMode = False
        
        End Sub
        
        

        Ça sera beaucoup plus court si tu enlèves tous les commentaires ajoutés
        à ton intention et qui ne serviront plus après que tu les aies lus. Vérifie
        d'abord que ce code VBA marche bien et te donne le résultat attendu,
        puis dis-moi ce que tu en penses.  😉

        --------------------------------------------------------

        Pour ce que tu as mis à la fin de ton message, je suppose que c'est
        ta 1ère ligne qui coince : Windows(NomFi).Activate

        Je pense que c'est parce que NomFi comporte l'extension de fichier,
        et que ça marchera sans cette extension ; donc à toi de l'enlever,
        mais seulement pour cette instruction.

        Je pourrais facilement le vérifier avec ton vrai fichier, mais sans,
        je n'en suis pas sûr (et je n'ai pas envie de créer un fichier de
        simulation juste pour ça) ; donc je te laisse essayer...

        À te lire.  😊
         
        0
      2. Phil.ch > Utilisateur anonyme
         
        Salut,

        Un grand GRAND MERCI. Tes explications sont nickel et de qualitées. Tu as été plus rapide que moi, je m'en excuse. J'ai fait autre chose. J'ai suivi tes conseils, modifié comme tu me l'as suggéré. Ca marche. Mon problème est résolu.

        Je te suis reconnaissant de ton aide, du temps que tu as pris pour me lire, me répondre et me conseiller.

        Albkan, meilleures salutations.
        Amicalement.
        :-)
        0
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Lorsque l'on fait, comme cela, des "allers-retours" entre plusieurs classeurs, il vaut toujours mieux les référencer dans des variables Objets. Comme ceci :

    Dim wbkSource As Workbook, wbkDest As Workbook
    
    Set wbkDest = ThisWorkbook
    Set wbkSource = Workbooks.Open(NomComp)
    
    'Ainsi après tu peux utiliser ces variables :
    With wbkSource
    
    End With
    With wbkDest
    
    End With


    0
    1. Phil.ch
       
      Bonjour / Bonsoir,

      Merci à vous pijaku, pour merci pour votre explication. Je fais facilement ce genre de "aller-retour", et votre remarque me sera donc d'une grande utilitée.

      Merci à vous
      0