• Initiateur de la discussion Initiateur de la discussion jeff1494
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

jeff1494

XLDnaute Occasionnel
[Résolu] Boucles imbriquées

Bonjour à tous;
Je grenouille un peu sur la mise à jour de cellules.
Voilà mon problème :

Dans une feuille "Infos" j'ai deux colonnes. "A" contient un nombre de page de bouquin, et B contient une référence de bouquin.

Dans une autre feuille "Liste_Docs" j'ai plusieurs colonnes contenant des infos sur les documents, dont la référence (unique) et le nombre de page.

Je voudrais donc mettre à jour la cellule contenant le nombre de pages de la feuille "Liste_Docs" depuis celle de la feuille "Infos".

En gros une boucle de lecture de la référence de la feuille 'Infos" et pour chaque cellule, trouver sur la feuille "Liste_Docs" la cellule contenant la même valeur, puis mettre à jour la cellule nb de pages".

Boucles de traitement imbriquées? Et là c'est trop fort pour moi.

Alors si une bonne âme pouvait m'aider à comprendre comment faire fonctionner des boucles imbriquées, cela serait sympa.
Sur ce bonne journée à tous.
 
Dernière édition:
Re : Boucles imbriquées

Bonjour JHA;
Merci pour ta réponse. Je vais essayer de comprendre tout cela, car je ne connais pas la fonction INDEX. Mais je me demande comment je pourrais adapter cela en VBA.
Dans tous les cas merci pour ton temps et ta réponse.
Cordialement.
 
Re : Boucles imbriquées

Bien, j'ai trouvé un code qui devrait permettre de faire ce que je veux, mais il ne fonctionne pas. Le voici :

Code:
Private Sub majpages_Click()
Dim Nom As String, i As Long, j As Long

    Sheets("Infos").Select
    i = 2
    With Sheets("Liste_Docs")
      Do While Cells(i, 4) <> ""
        Nom = Cells(i, 4)
        For j = 2 To .Range("C65536").End(xlUp).Row
          If Nom = .Cells(j, 3) Then
            Cells(j, 8) = .Cells(i, 2)
            Exit For
          End If
        Next
        i = i + 1
      Loop
    End With

End Sub

Je positionne i et j à la valeur 2 car la 1ère ligne contient des entêtes.
En fait je ne passe jamais dans la feuille "List_Docs", et donc forcément je ne mets jamais à jour.
Ce que j'ai compris :

  • i sert à indexer la ligne dans la feuille "Infos".
    j sert à indexer la ligne dans la feuille "Liste_Docs".
    Cell(i, 4) correspond à la 4ème cellule de la ligne i.

En pièce jointe un extrait de mon fichier.
Quelqu'un pourrait-il m'expliquer comment faire marcher cette sub.
D'avance Merci et bonne journée à tous.
 

Pièces jointes

Dernière édition:
Re : Boucles imbriquées

Re,

A défaut de macro, tu peux toujours essayer en H2:
=SI(ESTERREUR(EQUIV(Liste_Docs!C2;Infos!$D$2:$D$16;0));"";INDEX(Infos!$B$2:$B$16;EQUIV(Liste_Docs!C2;Infos!$D$2:$D$16;0)))
puis tirer vers le bas.

JHA
 
Re : Boucles imbriquées

Merci JHA;
En effet ta formule fonctionne parfaitement.
Mais j'aimerais le faire en VBA. Par contre je ne sais pas comment faire.
En tout cas merci pour ton aide. Si je ne trouve pas le moyen de la faire par Macro, je verrais comment formater les cellules en question avec ta formule.

Merci beaucoup et A+.
 
Re : Boucles imbriquées

Hello,

J'ai nommer les plage de Références (dans liste_docs) et clefs_listeDocs (dans Infos) Ces plage ne doivent pas avoir de cellules vides

Nom de la macro :MettreAJourNbPages

A+
 
Re : Boucles imbriquées

Merci beaucoup Hasco;
Je vais donc détailler ta macro pour essayer de la comprendre. Par contre il est possible d'avoir des cellules vides, comme c'est le cas dans mon fichier exemple.
Alors est-ce gérable où pas?
En tout cas merci pour ton temps et tes conseils.
A+
Cordialement.
 
Re : Boucles imbriquées

Re Jeff

Si tu as des cellules vides, à ce moment là n'utilise pas les noms de plage.

Macro sans nom de plage
Code:
Sub MettreAjourNbPages()
    Dim cClef As Range    'Référence dans Liste_Doc
    Dim ClefsInfos As Range, ClefsDocs As Range ' les deux plage à comparer
    Dim cTrouve As Range 'Cellule trouvée dans infos

    With Sheets("Infos")
        Set ClefsInfos = .Range("D2:D" & .Range("D" & Rows.Count).End(xlUp).Row)
    End With
    With Sheets("Liste_Docs")
        Set ClefsDocs = .Range("C2:C" & .Range("C" & Rows.Count).End(xlUp).Row)
        If ActiveSheet.Name <> .Name Then .Activate
    End With

    For Each cClef In ClefsDocs.Cells
        With ClefsInfos
            Set cTrouve = .Find(what:=cClef, LookIn:=xlValues, lookat:=xlWhole, SearchOrder:=xlByRows)
            If Not cTrouve Is Nothing Then cClef.Offset(, 5) = cTrouve.Offset(, -2)
        End With
    Next cClef
    
End Sub

J'ai écrit la macro suivante pour que tu puisses faire la différence de temps d'éxécution, sur un grand nombre de lignes.
Macro moins performante que l'autre, il faut deux boucles:
la plage des cellules de liste infos est parcourue à chaque changement de référence


Code:
Sub majpages_Click()
    Dim Nom As String, i As Long, j As Long
    Dim [COLOR=red][B]ClefsInfos[/B] As Range, [B]ClefsDocs[/B] As Range[/COLOR]
    Dim Ref As String

    With Sheets("Infos")
        Set [COLOR=red][B]ClefsInfos[/B][/COLOR] = .Range("D2:D" & .Range("D" & Rows.Count).End(xlUp).Row)
    End With
    With Sheets("Liste_Docs")
        Set [COLOR=red][B]ClefsDocs[/B][/COLOR] = .Range("C2:C" & .Range("C" & Rows.Count).End(xlUp).Row)
        If ActiveSheet.Name <> .Name Then .Activate
    End With
    For i = 1 To ClefsDocs.Cells.Count
        Ref = ClefsDocs(i, 1)
        For j = 1 To ClefsInfos.Cells.Count
            If ClefsInfos(j) = Ref Then ClefsDocs(i).Offset(, 5) = ClefsInfos(j).Offset(, -2)
        Next j
    Next i
End Sub

A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
179
Réponses
3
Affichages
258
Réponses
12
Affichages
452
Retour