[EXCEL - VBA] Err d'exec 9 : l'indice n'app..

Résolu
Bonjour,

Sur le principe, je scanne un répertoire pour récupérer tous les fichiers. : OK
J'identifie les fichiers excel : OK
Si les fichiers excel ont un onglet specifique "Saisie V9" (OK) alors je commence mon traitement qui plante.

En 1. Je calcule le nombre de fois ou il y a une valeur dans une colonne (TTC). ça ça marche.
En 2. Je dois récupérer la cellule a droite du TTC (montant) et le coller dans un autre classeur. Il faut donc passer d'un classeur actif a l'autre.

Et la j'ai ce message d'erreur qui se pose sur : "If Sheets("SAISIE V9").Range("E" & p) = "TTC" Then"

Si quelqu'un a une super idée car mon principe est simple, il faut que je récupère dans X classeurs les valeurs d'un onglet "Saisie V9" ou il y a TTC a droite de ces cellules. Vu que les cellules sont n'importe ou au niveau des lignes, je ne peux pas faire des récupération sur ces cellules prédéterminées.

Merci.

Le code :
Sub Recupdate3(m)
' calcule le nombre de fois ou il y a TTC
Dim Nom_Maitre2 As String
Dim Nom_Esclave2 As String

Sheets("Liste_2").Select

Nom_Maitre2 = ActiveWorkbook.Name
Nom_Esclave2 = Sheets("Liste_2").Cells(m, 3).Value

Workbooks.Open (Sheets("Liste_2").Cells(m, 2).Value)
Application.DisplayAlerts = False
Workbooks(Nom_Esclave2).Activate

ligne = 0
For o = 1 To 1000
If Sheets("SAISIE V9").Range("E" & o) = "TTC" Then ligne = ligne + 1
Next o

Call Recupdate4(m, ligne, Nom_Maitre2, Nom_Esclave2)
End Sub

Sub Recupdate4(m, ligne, Nom_Maitre2, Nom_Esclave2)
ligne2 = 0

For p = 1 To 1000
If Sheets("SAISIE V9").Range("E" & p) = "TTC" Then Workbooks(Nom_Esclave2).Activate
If Sheets("SAISIE V9").Range("E" & p) = "TTC" Then ligne2 = ligne2 + 1
If Sheets("SAISIE V9").Range("E" & p) = "TTC" Then Call Ligne_ref(ligne2, p, m, Nom_Maitre2, Nom_Esclave2)
Next p
End Sub
Function Ligne_ref(ligne2, p, m, Nom_Maitre2, Nom_Esclave2)

'MsgBox (ligne2)
If Sheets("SAISIE V9").Range("E" & p) = "TTC" And ligne2 = 1 Then AO = Sheets("SAISIE V9").Cells(3, 1).Value
If Sheets("SAISIE V9").Range("E" & p) = "TTC" And ligne2 = 1 Then AA = Sheets("SAISIE V9").Cells(p, 4).Value
If Sheets("SAISIE V9").Range("E" & p) = "TTC" And ligne2 = 2 Then AB = Sheets("SAISIE V9").Cells(p, 4).Value
If Sheets("SAISIE V9").Range("E" & p) = "TTC" And ligne2 = 3 Then AC = Sheets("SAISIE V9").Cells(p, 4).Value
If Sheets("SAISIE V9").Range("E" & p) = "TTC" And ligne2 = 4 Then AD = Sheets("SAISIE V9").Cells(p, 4).Value
If Sheets("SAISIE V9").Range("E" & p) = "TTC" And ligne2 = 5 Then AE = Sheets("SAISIE V9").Cells(p, 4).Value
If Sheets("SAISIE V9").Range("E" & p) = "TTC" And ligne2 = 6 Then AF = Sheets("SAISIE V9").Cells(p, 4).Value
If Sheets("SAISIE V9").Range("E" & p) = "TTC" And ligne2 = 7 Then AG = Sheets("SAISIE V9").Cells(p, 4).Value
If Sheets("SAISIE V9").Range("E" & p) = "TTC" And ligne2 = 8 Then AH = Sheets("SAISIE V9").Cells(p, 4).Value
If Sheets("SAISIE V9").Range("E" & p) = "TTC" And ligne2 = 9 Then AI = Sheets("SAISIE V9").Cells(p, 4).Value
If Sheets("SAISIE V9").Range("E" & p) = "TTC" And ligne2 = 10 Then AJ = Sheets("SAISIE V9").Cells(p, 4).Value

Application.DisplayAlerts = False
'Workbooks(Nom_Esclave2).Close (False)
Application.DisplayAlerts = False
Workbooks(Nom_Maitre2).Activate

Sheets("Liste_2").Cells(m, 7).Value = AO

Sheets("Liste_2").Cells(m, 8).Value = AA
Sheets("Liste_2").Cells(m, 9).Value = AB

Sheets("Liste_2").Cells(m, 10).Value = AC
Sheets("Liste_2").Cells(m, 11).Value = AD

Sheets("Liste_2").Cells(m, 12).Value = AE
Sheets("Liste_2").Cells(m, 13).Value = AF

Sheets("Liste_2").Cells(m, 14).Value = AG
Sheets("Liste_2").Cells(m, 15).Value = AH

Sheets("Liste_2").Cells(m, 16).Value = AI
Sheets("Liste_2").Cells(m, 17).Value = AJ

End Function

3 réponses

  1. Contributeur
    Bonjour,

    tu pourrais préparer 2 fichiers exemple et les déposer sur cjoint.com
    Coller ici le lien fourni.

    eric
    0
    1. Modérateur
      Bonjour,

      Pour éviter ces problèmes "d'indice n'appartient pas à la sélection", tu peux utiliser des blocs With End With.
      Exemple "àlacon" :
      With WorkBooks("Classeur1.xls") 
           If .Sheets("Feuil1").Range("A1") = "Poireau" Then 
                .Sheets("Feuil2").Range("A2") = "Rien" 
           End If 
      End With 
      With WorkBooks("Classeur2.xls") 
           If WorkBooks("Classeur1.xls").Sheets("Feuil1").Range("A1") = "Poireau" Then 
                .Sheets("Feuil2").Range("A2") = "Rien" 
           End If 
      End With

      A noter l'utilisation des points .Sheets(machin) point = qui se réfère à l'objet du bloc With...

      Cordialement,
      Franck P
      0
      1. Super merci, je venais juste de me bidouiller une solution en concatenant les résultat dans une variable : séparé avec un "/" que je converti ensuite.

        Je vais mettre en place votre méthode plus propre.
        Merci beaucoup Eric et Franck.

        Sub Recupdate3(m)

        Dim Nom_Maitre2 As String
        Dim Nom_Esclave2 As String

        Sheets("Liste_2").Select

        Nom_Maitre2 = ActiveWorkbook.Name
        Nom_Esclave2 = Sheets("Liste_2").Cells(m, 3).Value

        Workbooks.Open (Sheets("Liste_2").Cells(m, 2).Value)
        Application.DisplayAlerts = False
        Workbooks(Nom_Esclave2).Activate

        ligne = 0
        B = 0
        A = 0
        X = Sheets("SAISIE V9").Range("F3")
        y = Sheets("SAISIE V9").Range("F4")
        Z = Sheets("SAISIE V9").Range("A3")

        For o = 1 To 1000
        If Sheets("SAISIE V9").Range("E" & o) = "TTC" Then A = Sheets("SAISIE V9").Range("D" & o)
        If Sheets("SAISIE V9").Range("E" & o) = "TTC" Then B = B & "/" & A
        Next o

        Application.DisplayAlerts = False
        Workbooks(Nom_Esclave2).Close (False)
        Application.DisplayAlerts = False
        Workbooks(Nom_Maitre2).Activate

        Sheets("Liste_2").Cells(m, 7).Value = X
        Sheets("Liste_2").Cells(m, 8).Value = y
        Sheets("Liste_2").Cells(m, 9).Value = Z
        Sheets("Liste_2").Cells(m, 10).Value = B
        0