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 :

Deux for each imbriqués ? [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2013
    Messages : 111
    Par défaut Deux for each imbriqués ?
    Bonjour à tous,

    Mon problème est le suivant :

    J'ai un tableau de données à double entrées c-a-d que dans ma prem colonne j'ai 1, 2,3 4, 5, etc et dans la première ligne a, b, c, d, e, etc. Toutes les autres cellules de ce tableau sont vides.

    J'ai ensuite un second tableau dans lequel est repris un agenda complet d'une année.

    A côté de chacun des jours de l'année, je peux inscrire un code de type 2a, 5c, 1b, etc...

    Par exemple :

    05/05/2014 - 2a
    06/05/2014 - 5c
    07/05/2014 - 1b
    ...

    Je souhaite à présent constituer une macro qui remplisse mon tableau de données suivant le code repris dans l'agenda.

    Pas exemple, en ligne 1 et colonne b, je devrais retrouver la date du 07/05/2014.

    J'espère être clair.

    Je parviens à utiliser for each pour rechercher une valeur quelque part, la fonction offset également mais je ne parviens pas à imbriquer deux for each l'un dans l'autre. A moins que l'on ne puisse faire autrement?

    Quelqu'un aurait-il une idée brillante ?

    On pourrait se servir du début de 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
        Dim Annuel, Donnee As Range
        Dim Cell1, Cell2 As Range
     
        Set Annuel = Sheets("Planning").Range("A1:H20")
        Set Donnee = Sheets("Centrales").Range("H20:J26")
     
        For Each Cell1 In Annuel
            If for each Cell2 in Donnee
     
            Cell1.Value = Sheets("Centrales").Cell2.End(xlToLeft).Value = "1" And Cell.End(xlUp).Value = "b" Then
     
            Cell.Offset(0, -1).Value
            End If
        Next
    Un grand merci à tous

  2. #2
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2012
    Messages : 2
    Par défaut
    Bonjour, ce code doit répondre à votre problématique, mais je pense que l'on peut trouver plus simple et surtout plus rapide.

    Attention au format des chiffres je l'ai convertis en texte.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
    Dim C As Range, M As Range, N As Range
    For Each C In Range("A10:A11")
    temp1 = Left(C.Value, 1)
    temp2 = Right(C.Value, 1)
    For Each N In Range("A2:A7")
    If N.Value = temp2 Then nbligne = N.Row
    For Each M In Range("b1:f1")
    If CStr(M.Value) = temp1 Then nbcol = M.Column
    Next M
    Next N
    Cells(nbligne, nbcol).Value = C.Offset(0, 1).Value
    Next C
    End Sub

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2013
    Messages : 111
    Par défaut
    Bonjour

    Merci mais je ne suis pas sur de comprendre, je le teste sur une feuille vierge mais j'ai une erreur 1004.
    Ou dois je faire attention au format des chiffres?

    Je pense que le code suivant pourrait faire un bon début mais j'ai toujours mon problème de FOR EACH imbriqué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
    Dim MyRangeAnnuel As Range, EtatAvancement As Range
        Dim k, m, n As String
     
        Set MyRangeAnnuel = Sheets("Planning").Range("D6:DR37")
        Set EtatAvancement = Sheets("Centrales").Range("G19:J26")
     
        For Each Cell In EtatAvancement
            k = Cell.End(xlToLeft).Value
            m = Cell.End(xlUp).Value
            For Each Cell In MyRangeAnnuel
                If Cell.Value = k & m Then
                    n = Cell.Offset(0, -6).Value
                End If
                Cell.Value = n
            Next Cell
        Next Cell

  4. #4
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2012
    Messages : 2
    Par défaut
    Citation Envoyé par thomanneca Voir le message
    Je pense que le code suivant pourrait faire un bon début mais j'ai toujours mon problème de FOR EACH imbriqué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
    Dim MyRangeAnnuel As Range, EtatAvancement As Range
        Dim k, m, n As String
     
        Set MyRangeAnnuel = Sheets("Planning").Range("D6:DR37")
        Set EtatAvancement = Sheets("Centrales").Range("G19:J26")
     
        For Each Cell In EtatAvancement
            k = Cell.End(xlToLeft).Value
            m = Cell.End(xlUp).Value
            For Each Cell In MyRangeAnnuel
                If Cell.Value = k & m Then
                    n = Cell.Offset(0, -6).Value
                End If
                Cell.Value = n
            Next Cell
        Next Cell
    A mon sens le problème de votre code est le "Cell" vous l'utilisez dans les deux boucles, ce qui peux perturber.

    En relisant, je me suis aperçu que j'ai inversé vos entête de ligne et de colonne dans le code que je vous ai transmis.
    Sur mon micro la procédure marche, quelle est l'anomalie qui ressort (je suis sous 2013).

  5. #5
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 271
    Par défaut
    Bonjour,

    Pourquoi tiens-tu à utiliser une macro?

    Je te joins un fichier qui fais ce que tu demandes sans macro.

    Si tu tiens absolument à avoir une macro utilise l'enregistreur.

    Classeur1.xlsx

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2013
    Messages : 111
    Par défaut
    Bonjour,

    En effet, je crois que c'est cela que je recherche mais plutôt en vba car mon tableau est succeptible de bouger.
    Et pour l'enregistreur, je ne vois pas de trop comment l'utiliser ici ?

    Merci beaucoup déjà

  7. #7
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 271
    Par défaut
    Bonjour,

    Dans quel proportion ton tableau est-il susceptible de bouger?

    Pour l'enregistreur, tu l'utilises comme d'habitude puis tu adaptes à la taille de ton tableau.

    Dis moi si tu veux quelque chose comme ça:

    Tant que la colonne A et la ligne 1 ne sont pas vides, on met dans les cellules dans l'aire (X;Y) la formule =RECHERCHEV ....


    Voici le code avec l'enregistreur de Macro pour les colonnes B à D.

    Tu n'as plus qu'à l'adapter en spécifiant la dernière ligne et la dernière colonne.


    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
    Sub Macro1()
     
     
     
        Range("B2").Select
        ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-1] & R1C2,Feuil2!R1C1:R3C2,2,0)"
        Range("B2").Select
        Selection.AutoFill Destination:=Range("B2:B15"), Type:=xlFillDefault
     
        Range("B2:B15").Select
        Range("C2").Select
        ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-2] & R1C3,Feuil2!R1C1:R3C2,2,0)"
        Range("C2").Select
        Selection.AutoFill Destination:=Range("C2:C15"), Type:=xlFillDefault
     
        Range("C2:C15").Select
        Range("D2").Select
        ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-3] & R1C4,Feuil2!R1C1:R3C2,1,0)"
        Range("D2").Select
        Selection.AutoFill Destination:=Range("D2:D15"), Type:=xlFillDefault
     
     
        Range("B2:D15").Select
        Selection.NumberFormat = "m/d/yyyy"
     
    End Sub

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2013
    Messages : 111
    Par défaut
    @had4789Bonsoir,

    J'étais parvenu à enregistrer un code de ce type avec l'enregistreur mais il ne me semblait pas très "catholique",
    n'y aurait-il pas un code plus simple que celui-la ?
    VBA ne prévoit-il pas ce genre de fonction ?

    Sinon le fichier joint reprend bien mon objectif !! c'est un très bon début

    Et pour répondre à ta question, mon tableau ne devrait pas changer des masses, genres quelques colonnes et/ou lignes (une cinquantaine grand max).

    Merci

    Re,

    Je l'ai un peu modifié par rapport à Cell, la il fonctionne mais me renvoie de mauvaises info :-S
    On y est presque...

    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
    Sub MettreAJourAgenda()
        Dim MyRangeAnnuel As Range, EtatAvancement As Range
        Dim k, m, n As String
        Dim cell1, cell2 As Range
     
        Set MyRangeAnnuel = Sheets(1).Range("B1:B11")
        Set EtatAvancement = Sheets(2).Range("B2:F11")
     
        For Each cell1 In EtatAvancement
            k = cell1.End(xlToLeft).Value
            m = cell1.End(xlUp).Value
            For Each cell2 In MyRangeAnnuel
                If cell2.Value = k & m Then
                    cell1.Value = cell2.Offset(0, -1).Value
                End If
            Next
        Next
    End Sub

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

Discussions similaires

  1. [XSLT] for-each imbriqués
    Par bgrand dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 15/10/2009, 13h42
  2. [XSL - XPATH?] Deux for-each, une variable et un noeud
    Par Jidewe dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 04/03/2008, 09h47
  3. [XSLT] for-each imbriqués
    Par abdoulax dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 11/10/2006, 12h08
  4. [XSLT]for-each imbriqués, et autres galères...
    Par Sarrus dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 16/03/2006, 17h57
  5. [XML/XSL] for-each imbriqués
    Par grome dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 11/11/2005, 12h44

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