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 :

Test sur une plage et récupération de la valeur d'une cellule [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Test sur une plage et récupération de la valeur d'une cellule
    Bonjour à tous

    Je cherche une façon de balayer une plage O3:O14 et, à la rencontre d'une valeur 0, récupérer la valeur contenue dans la cellule une ligne au-dessus et 3 colonnes à droite.

    J'ai essayé les lignes suivantes, mais ça ne fonctionne pas .
    C'est conçu pour être appliqué à plusieurs feuilles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For i = 5 To Sheets.Count
    ' *** Pour chaque feuille, de la 6 eme à la dernière
    With Sheets(i)
     
    ' ****Copie les données Heures
        Nbre_Heures = .Range("B8").Value
        Pourc = .Range("G8").Value
    Jusque là, ça va !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
         For J = 3 To 14
     
          If .Range("O" & J).Value = 0 Then
            Cumul = .Range("R" & J - 1).Value
          End If
       Next J
    Cette 1ere routine ne fonctionne pas


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        For Each CurCell In Range("O3:O14")
            If CurCell.Value = 0 Then
               Cumul = CurCell.Offset(-1, 3).Value
             End If
        Next
    Cette 2e routine ne fonctionne pas non plus !

    Le reste pour coller les variables dans une autre feuille fonctionne parfaitement.

    Je ne vois plus comment me dépêtrer de ce cas.
    Quelqu'un aurait-il la gentillesse de me dépanner ?
    Merci d'avance
    Mick

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 763
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Lorsque tu écris qu'une "routine" ne fonctionne pas, il faudrait être plus clair parce-que cela ne veux rien dire. Sois plus précis.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Bonjour,

    Es-tu certain que tes 0 sont bien des chiffres ?
    Il se pourrait que ce soit des caractères (string)

    Tu pourrais essayer comme ceci pour voir si ça passe mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For J = 3 To 14
       If .Range("O" & J).Value = "0" Then
          Cumul = .Range("R" & J - 1).Value
       End If
    Next J
    PS: quand tu mets du code, utilise le bouton # pour bien formater ton code.
    Sélectionne ton code et clique sur le bouton
    MPi²

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 6
    Points
    6
    Par défaut C'est bien vrai !
    Désolé de ne pas avoir donné plus de précision !

    En fait, il m'est renvoyé une valeur nulle. Dans la variable 'Cumul' il n'y a rien.

    Malgré les espions que j'aie pu déposer, je ne vois rien. (Quelque soit la routine)

    Cette plage est alimentée par une formule du genre

    Formule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(I128+I139+I150+I161+I172=0;0;I128+I139+I150+I161+I172) au format Heure suivant :   [h]" h "mm;@
    donc ça devrait bien être des zéros

    Je pense avoir répondu à ta demande, sinon je suis à disposition, bien entendu !

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Non, une heure à 0 donnerait 00:00:00
    Tu pourrais donc essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For J = 3 To 14
       If CLng(.Range("O" & J).Value) = 0 Then
          Cumul = .Range("R" & J - 1).Value
       End If
    Next J
    Et ta formule ne nécessite pas de SI
    Si la formule = 0, écrire 0 ne donne rien de plus...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =I128+I139+I150+I161+I172
    devrait suffire

    EDIT: non, tu as raison même une heure à 00:00:00 retourne 0...
    MPi²

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 763
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    EDIT: non, tu as raison même une heure à 00:00:00 retourne 0...
    Oui, 0 h 0 minute et 0 seconde donne 0 mais d'après ce que j'ai lu, le formatage est
    [h]" h "mm;@
    donc il y a peut-être des secondes cachées par le format.
    Est-ce que le programme passe par la ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cumul = .Range("R" & J - 1).Value
    si pas, il est évident qu'il y a de fortes chances qu'il y a des minutes cachées
    si le programme passe par cette ligne alors comme je lis que la variable se nomme Cumul, ne faut'il pas écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cumul = Cumul + .Range("R" & J - 1).Value[
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Bonjour

    Merci à tous de vous pencher sur mon problème.

    J'ai essayé les différentes méthodes proposées, mais toujours rien dans la variable Cumul.

    Mais au vu de tout ce que vous m’avez indiqué, il se pourrait que ce soit en sortie de boucle qu'il y ait le problème. En effet, il faudrait qu'à la première occurrence rencontrant un 0 en plage O3:O14, je sorte de la boucle pour conserver la valeur L-1 C+3 dans Cumul. C'est peut-être que ma routine continue à parcourir jusqu'à la fin de la plage et là, bien sur, il n'y a plus rien dans la colonne +3. Mais là, je ne sais pas comment sortir de façon conditionnelle.

    Cordialement
    Mick

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Ajoute Exit For quand la condition est vraie après avoir donné la valeur à Cumul
    MPi²

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Bonjour

    Dans l'impossibilité de tester la cellule à zéro, je fais le test sur une colonne précédente qui est en mois comparée à la date du jour.

    Là, ça fonctionne, je récupère bien la valeur colonne R ligne J.

    Par contre, quand la routine passe à la feuille suivante, 'Cumul' conserve la 1ere valeur comme si la boucle For J = 3 To 14 ne repassait pas après le mois courant rencontré !

    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
    For i = 5 To Sheets.Count
    ' *** Pour chaque feuille, de la 5 eme à la dernière
    With Sheets(i)
    ' ****Copie les données Nom Fonction
        Nom_Copier = .Name
        Fonction = .Range("I4").Value
     
    ' ****Copie les données Heures
        Nbre_Heures = .Range("B8").Value
        Pourc = .Range("G8").Value
     
    ' Copie Cumul mensuel
       ' Cumul = 0: J = 0
     
        For J = 3 To 14
     
            If .Range("M" & J).Value = Format(Date, "mmmm") Then
                Cumul = .Range("R" & J).Value
                Exit For
            End If
     
        Next J
    Je ne vois pas pourquoi la valeur 'Cumul' reste la même ensuite. Au départ, la liste commence en Septembre et la valeur Novembre est bien détectée et 'Cumul' prend la valeur de R5. Cette même valeur est reportée sur les autres feuilles. J'avais même réinitialisé les variables à un moment, mais ça ne sert à rien.

    Vois-tu une raison à cette anomalie ?
    Cordialement
    Mick

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    On ne voit pas ce que tu fais avec Cumul...
    Si tu l'inscris à quelque part, réinitialise-la à 0 tout de suite après.
    MPi²

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Effectivement, je viens de mettre 'Cumul' a 0, mais c'est pareil !

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    For i = 5 To Sheets.Count
    ' *** Pour chaque feuille, de la 5 eme à la dernière
    With Sheets(i)
    ' ****Copie les données Nom Fonction
        Nom_Copier = .Name
        Fonction = .Range("I4").Value
     
    ' ****Copie les données Heures
        Nbre_Heures = .Range("B8").Value
        Pourc = .Range("G8").Value
     
    ' Copie Cumul mensuel
       ' Cumul = 0: J = 0
     
        For J = 3 To 14
     
            If .Range("M" & J).Value = Format(Date, "mmmm") Then
                Cumul = .Range("R" & J).Value
                Exit For
            End If
     
        Next J
     
        Heures_Eff = .Range("g10").Value
        Reliquat = .Range("D12").Value
     
    End With
     
    ' ****Colle les données dans la feuille 'Récap'
     
        Range("Récap!A" & i).Value = Nom_Copier
        Range("Récap!B" & i).Value = Fonction
     
        Range("Récap!E" & i).Value = Cumul
        Cumul = 0
     
        Range("Récap!F" & i).Value = Heures_Eff
     
    Next i
    C'est un extrait du code
    Le reste fonctionne bien, c'est juste 'Cumul'
    Voici le résultat : (Les espaces ne sont pas pris !)


    "Nombre heures "Cumul Planning" "Heures effectuées"
    annuelles"
    1619 381 H 19:03
    1599 0 H 0:00 (Il devrait y avoir 373)
    1280 0 H 0:00 (Il devrait y avoir 300)
    1200 0 H 0:00 (Il devrait y avoir 333)

  12. #12
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    J'ai la flemme et pas le temps de tout lire. Ceci dit, VBA a des fonctions spécialisées pour le traitement des heures et des dates.

    Essaie avec ça, ou quelque chose qui devrait y ressembler.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ' Copie Cumul mensuel
       ' Cumul = 0: J = 0
     
        For J = 3 To 14
     
            If .Range("M" & J).Value = month(Date) Then
                Cumul = .Range("R" & J).Value
                Exit For
            End If
     
        Next J
    P.S. Au lieu de jouer avec des Range("a" & i), tu peux itérer une plage de cellules avec 2 boucles imbriquées et l'objet Cells()

    Par exemple, pour itérer de a1 à b10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    dim i as integer
    dim j as integer
    dim z as integer
    z = 0
    For i = 1 to 2 'balayer les lignes
        for j = 1 to 10 'balayer les colonnes
            Cells(i,j).value = z
        next
    next
    Cells() est fondamentalement une propriété d'un objet Range et a les mêmes propriétés qu'un objet Range.

    P.P.S. Jette aussi un œil sur offset. Toujours dans l'Objet Range. C'est magique pour zigonner dans une cellule distante de la cellule en cours.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        For J = 3 To 14
     
            If .Range("M" & J).Value = Format(Date, "mmmm") Then
                Cumul = .Range("R" & J).Value
                Exit For
            End If
     
        Next J
    Ton code a changé
    Ce n'est plus J - 1 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cumul = .Range("R" & J - 1).Value
    MPi²

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Bonjour

    Ce n'est plus J-1 car, ne pouvant toujours pas faire le test sur la valeur 0 de la colonne O, je me suis rabattu sur une colonne plus à gauche M pour faire le test sur le mois courant.

    Ça fonctionne sur le 1er test de la boucle, Cumul prend bien la valeur de la cellule R j mais ensuite pour les feuilles suivantes, la variable Cumul reste à la valeur de la 1ere boucle, comme si le programme ne rentrait plus dans la boucle.

    Le résultat est clair sur l'exemple que je donne sur mon dernier post à la 2eme colonne.

    Cordialement
    Mick

  15. #15
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 763
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Ça fonctionne sur le 1er test de la boucle, Cumul prend bien la valeur de la cellule R j mais ensuite pour les feuilles suivantes, la variable Cumul reste à la valeur de la 1ere boucle, comme si le programme ne rentrait plus dans la boucle.
    Si c'est un problème de conception, tu ne pourras pas t'en sortir sans utiliser les outils de débogage
    A lire Le débogage sous Visual Basic 6 & Visual Basic pour Application (1ère partie)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Bonsoir

    Je pense avoir réussi les manipulations avec tous les conseils donnés sur ce forum.

    Je remercie tous les contributeurs qui ont bien voulu me donner la main.

    Avec le débogueur, j'ai réussi a suivre pas à pas la routine. J'ai un peu galéré sur le test Novembre et novembre.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 29/08/2015, 15h42
  2. Réponses: 4
    Dernier message: 01/02/2013, 15h01
  3. [XL-2007] deplacer une plage en fonction de la valeur d'une cellule
    Par mft_ghost dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 19/04/2011, 14h17
  4. [MySQL] Prendre la valeur d'une table et l'associer à la valeur d'une autre
    Par gandolfi dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 02/02/2008, 08h04
  5. Récupération de la valeur d'une auto-incrémentation
    Par maldufleur dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/07/2005, 16h50

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