Problème fonction If avec plusieurs conditions

Marco56

XLDnaute Nouveau
Bonjour à tous,

Je rencontre un petit problème sous Excel 2003 avec la fonction If.

Le but de la macro est de copier/coller une cellule si deux conditions sont respectées, en l'occurence si le nom et la date correspondent.

Concrètement, le début de la macro a pour but d'extraire des données concernant les heures travaillées et de les coller en feuille 2 du classeur. La colonne importante est nommée HJJOU (colonne N). La macro créé ensuite la colonne Q pour avoir le résultat en heures, et non en minutes. Donc cette partie du code ne pose pas de problèmes...

Ensuite, la macro vérifie que le nom situé en feuille 2 (colonne B) correspond bien au nom de la feuille 1 (colonne B également). Si cette condition est respectée, elle va chercher la date du jour (affichée en colonne 5 de la feuille 2) et la trouve dans la ligne 2 de la feuille 1. Si ces deux conditions sont respectées, elle colle alors, dans la ligne du nom de la personne, les heures de la colonne Q de la feuille 2 dans la colonne correspondant à la bonne date en feuille 1.

J'ai fais un test pour la seule condition de la date, cela fonctionne bien, mais lorsque j'ajoute la condition du nom, la macro ne le prend pas en compte.

Je vous joins un fichier exemple avec le code que j'ai mis (macro "Extract") pour les deux conditions. Code qui ne prend en compte seulement la condition de la date, mais pas celle du nom.

Pour clarifier la macro, j'ai fais l'extraction moi même, donc il n'y a que le code correspondant au "copier/coller sous conditions".

Merci de votre aide,
Bonne journée :)
 

Pièces jointes

  • Planning vierge.xls
    51 KB · Affichages: 78
  • Planning vierge.xls
    51 KB · Affichages: 83
  • Planning vierge.xls
    51 KB · Affichages: 83
Dernière édition:

Marco56

XLDnaute Nouveau
Re : Problème fonction If avec plusieurs conditions

Après plusieurs essais, j'ai réussi à faire appliquer l'autre condition "Nom", mais lorsque je met les deux conditions dans le même code, ça ne marche pas.

CODE CONDITION "NOM" :

Code:
Sub Extract()

Dim Nom As String, i As Long, j As Long                 
Sheets(1).Select
i = 4                                'Sélectionne la ligne 4 de la feuille 1 comme "départ"

With Sheets(2)
  Do While Cells(i, 2) <> "FIN"            'Exécute la macro jusqu'à la valeur "FIN" dans la colonne B (pour éviter que la macro éxécute jusqu'à la ligne 65536)

    Nom = Cells(i, 2)
    For j = 4 To .Range("B65536").End(xlUp).Row     'Sélectionne la ligne 4 de la feuille 2 comme "départ"

      If Nom = .Cells(j, 2) Then                         'Si la cellule (BligneX) feuille 1 = cellule (Bligne Y) feuille 2

        Sheets(1).Cells(i, 9).Value = Sheets(2).Cells(j, 17).Value          'Cellule (I,ligneX) = cellule (Q, ligneY)

            Exit For
      End If
    Next
    i = i + 1
  Loop
End With
End Sub

CODE CONDITION "DATE" :

Code:
Sub Macro()
Dim datejour As Range
Dim datej As Range
Dim X As Integer

Set datejour = Worksheets("Feuil2").Range("E4")         'La date du jour est dans la cellule E4 de la feuille 2

With Worksheets("Feuil1").Range("A2:Z2")                    'Sélectionne la ligne 2 de la feuille 1 où se situe les dates de la semaine en cours

Set datej = .Find(datejour, LookIn:=xlFormulas)           'Trouve la date de la cellule E4 de la feuille 2 dans la ligne 2 de la feuille 1

X = datej.Column

Worksheets("Feuil2").Range("Q4:Q200").Copy                'Copie la cellule de la feuille 2 correspondant aux conditions

ActiveSheet.Paste Destination:=Worksheets("Feuil1").Range(.Cells(4, X + 1), .Cells(200, X + 1))          'Colle la cellule copiée dans la cellule de la feuille 1 correspondant à la date

End With
End Sub

Donc si les deux codes fonctionnent indépendamment, ça devrait marcher si on les assemblent logiquement :confused: :D

Mais pour ma part je ne vois pas trop comment les imbriquer, j'ai toujours une petite erreur qui traine.

Votre aide me sera très précieuse !

Merci beaucoup :D
 
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : Problème fonction If avec plusieurs conditions

Salut Marco56 et le forum
Macro "Extract " :
Pour chaque cellule de B4 à celle de B qui contient "FIN" dans la feuille d'index 1
rechercher dans B de la feuille d'index 2 l'égalité, et coller en I de F(1) Q de f(2)

Macro "Macro" :
rechercher la valeur de la cellule E4 de "Feuil2" dans la plage A2:Z2 de "Feuil1"
coller les valeurs de Q4:Q200 de "Feuil1" dans la colonne trouvée à partir de la ligne 4

Petit rappel : il n'y a ni devin, ni télépathe sur ce site. Et rien dans les deux codes fournis qui permette de faire la liaison entre eux :
- Les feuilles sont désignées soit par le nom de l'onglet, soit par l'index de la feuille.
- Dans un cas, pour toute une partie de colonne, on copie une cellule dans une ligne. Dans l'autre cas, c'est une partie de colonne qu'on copie.
- On n'a aucun fichier permettant de se faire une idée de ce qu'on doit faire. Le fichier.
question à part : la colonne Q est censée contenir quoi comme information ?
A+
 
Dernière édition:

Marco56

XLDnaute Nouveau
Re : Problème fonction If avec plusieurs conditions

Bonjour Gorfael et merci pour ta réponse,

J'ai évité d'annoter le code au début pour qu'il reste clair, mais j'ai édité le message pour rajouter quelques explications.
Le nom des feuilles importent peu, je pense que c'est plus simple de laisser le nom de base des onglets. La feuille 1 est le planning qu'on remplit manuellement, tandis que la feuille 2 est un fichier extrait montrant les heures réellement travaillées. Le fichier extrait provient en fait de données d'une pointeuse.

Je ne comprends pas trop ce que tu veux dire par "partie de colonne qu'on copie". En fait, le but de la macro est de copier seulement les cellules qui correspondent à un même nom et à une même date, afin de recopier cette cellule par dessus l'ancienne (celle du planning manuel), afin de visionner les heures réellement effectuées.

Enfin, concernant le fichier, je vous ai transmis un exemple dans le premier message, mais je ne peux pas mettre de vrai noms donc j'ai modifié par des lettres de A à Z.

J'ai récupéré différents morceaux de codes sur Internet et je les ai appliqués à mon propre fichier, je suis encore débutant en VBA donc il est possible que je ne sois pas très clair, veuillez m'en excuser...

En tout cas, merci de votre aide :)
 

Marco56

XLDnaute Nouveau
Re : Problème fonction If avec plusieurs conditions

J'ai enregistré deux fichiers test pour chaque condition afin de vous montrer un peu le but de la macro.

Donc comme vous constatez, pour le fichier 'Test Date Ok', la macro colle bien en fonction de la date (vous pouvez le constater en modifiant la date dans la cellule E4 de la feuille 2). Et pour le fichier 'Test Nom Ok', la macro colle bien en fonction du nom.

Et ce que je veux arriver à faire, c'est réunir ces deux conditions dans un même fichier, afin que la macro colle en fonction du nom et de la date la cellule correspondante. Par exemple, pour le 17/05/2011, en colonne I.

J'espère être clair, si vous avez besoin d'autres explications, n'hésitez pas ! :)

Merci à vous :D
 

Pièces jointes

  • Test date OK.xls
    48 KB · Affichages: 59
  • Test nom OK.xls
    47.5 KB · Affichages: 61

Marco56

XLDnaute Nouveau
Re : Problème fonction If avec plusieurs conditions

J'essaye de bidouiller un peu le code, mais malheureusement ca ne fonctionne toujours pas. La bonne nouvelle, c'est que je n'ai pas de message d'erreur, mais le problème c'est que la macro colle bien en fonction de la date, mais ne prend toujours pas en compte le nom. Pourtant, je le précise bien dans le code, mais je dois oublier un petit détail qui change tout...

Code:
Sub Macro()
Dim datejour As Range
Dim datej As Range
Dim X As Integer

Set datejour = Worksheets("Feuil2").Range("E4")
With Worksheets("Feuil1").Range("A2:Z2")
Set datej = .Find(datejour, LookIn:=xlFormulas)
X = datej.Column

End With

Dim Nom As String, i As Long, j As Long                 'Collage en fonction des conditions (PROBLEME A PARTIR DE LA)
Sheets(1).Select
i = 4
With Sheets(2)
  Do While Cells(i, 2) <> "FIN"
    Nom = Cells(i, 2)
    For j = 4 To .Range("B65536").End(xlUp).Row
      If Nom = .Cells(j, 2) And Sheets(1).Cells(2, X).Value = Sheets(2).Cells(4, 5).Value Then
        Worksheets("Feuil2").Range("Q4:Q200").Copy
ActiveSheet.Paste Destination:=Worksheets("Feuil1").Range(Cells(4, X + 1), Cells(200, X + 1))
            Exit For
      End If
    Next
    i = i + 1
  Loop
End With
End Sub

Je vous laisse le fichier, il suffit d'exécuter la macro pour voir le résultat.

Merci de votre aide, car là je commence à être en panne d'imagination... :(
 

Pièces jointes

  • Planning vierge.xls
    48.5 KB · Affichages: 50
  • Planning vierge.xls
    48.5 KB · Affichages: 52
  • Planning vierge.xls
    48.5 KB · Affichages: 49

Gorfael

XLDnaute Barbatruc
Re : Problème fonction If avec plusieurs conditions

Salut Marco56 et le forum
Je ne suis pas sûr d'avoir compris. Alors juste des remarques :
- Le nomprenom : c'est un identifiant... aléatoire. Si t'es sûr de ne jamais avoir d'homonymes, tu peux les utiliser. Mais par contre, avec le matricule, tu es sûr ne de pas faire d'erreur.

- sur la feuille 2 :
A : les noms
E : la date
Q : les heures en décimales
- Sur la feuille 1 :
2 - les dates
B : les noms

Ce que je crois comprendre :
mettre la valeur de Q dans la cellule ligne (A=B) colonne (E=2) décalée de 1 colonne à droite.
Si c'est ça :
Code:
Sub test()
'Déclaration ===================================
Dim F_S As Worksheet, F_D As Worksheet, Cel As Range, X As Long, Col As Integer, rep As Integer
'MEI ===========================================
Set F_S = Sheets("Feuil2")  'Feuille source
Set F_D = Sheets("Feuil1")  'Feuille destination
'Traitement ====================================
'Boucle ----------------------------------------
For X = 4 To F_S.Cells(Rows.Count, "B").End(xlUp).Row
'Pour x=4 à dernière ligne non-vide en B
    'recherche de la colonne de destination ------------------------
    Set Cel = F_D.Rows(2).Find(what:=F_S.Cells(X, "E"), lookat:=xlWhole)
    'cel = cellule contenant la valeur de la cellule C, ligne X, cellule entière)
    If Not (Cel Is Nothing) Then
    'si cel existe, alors
        Col = Cel.Column + 1
        'recherche de la ligne de destination ----------------------
        Set Cel = F_D.Columns(2).Find(what:=F_S.Cells(X, "B"), lookat:=xlWhole)
        If Not (Cel Is Nothing) Then
            F_D.Cells(Cel.Row, Col) = F_S.Cells(X, "Q")
        Else
            rep = MsgBox("on continue ?", vbQuestion + vbYesNo, F_S.Cells(X, "B") & " absent de la liste")
            If rep = 7 Then Exit Sub
            'si la réponse est non, on sort
            End If
    Else ' la date n'existe pas
        rep = MsgBox("on continue ?", vbQuestion + vbYesNo, "date non trouvée pour la ligne " & X)
        If rep = 7 Then Exit Sub
        'si la réponse est non, on sort
    End If
Next X
'Fin boucle -----------------------------------
End Sub
Les boîtes de dialogue sont sans doute à modifier suivant le message réel désiré.
A+
 

Marco56

XLDnaute Nouveau
Re : Problème fonction If avec plusieurs conditions

Salut Gorfael,

Merci pour ton code, il marche très bien. J'ai moi même réussi de mon côté à développer un code qui marche, maintenant j'ai l'embarras du choix :)

Pour information, voici le code qui fonctionne :

Code:
Sub Macro()
Dim datejour As Range
Dim datej As Range
Dim X As Integer

' ActiveSheet.Paste Destination:=Worksheets("Feuil1").Range(.Cells(4, X + 1), .Cells(200, X + 1))

Dim Nom As String, i As Long, j As Long                 'Collage en fonction des conditions (PROBLEME A PARTIR DE LA)
Sheets(1).Select
i = 4
With Sheets(2)
  Do While Cells(i, 2) <> "FIN"
    Nom = Cells(i, 2)
    For j = 4 To .Range("B200").End(xlUp).Row
      If Nom = .Cells(j, 2) Then
      Set datejour = Worksheets("Feuil2").Cells(j, 5)
With Worksheets("Feuil1").Range("A2:Z2")
Set datej = .Find(datejour, LookIn:=xlFormulas)
X = datej.Column
       End With
        Sheets(1).Cells(i, X).Value = Sheets(2).Cells(j, 17).Value
            Exit For
      End If
    Next
    i = i + 1
  Loop
End With
End Sub

Pour finir, j'aimerais désormais pouvoir voir quelles valeurs ont été modifiées.
J'ai pensé à une mise en forme conditionnelle mais en VBA ça n'existe pas il me semble.

En fait, je voudrais que si la valeur de la cellule change, cette cellule se colore en jaune.

A savoir que ce petit morceau de code se colerait à la suite de la macro.

Merci de votre aide :D

Et encore merci Gorfael ;)
 

Discussions similaires

Réponses
2
Affichages
127

Statistiques des forums

Discussions
312 169
Messages
2 085 918
Membres
103 038
dernier inscrit
Herve7