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 :

XL 2007 : Macro recherche/copie valeur cellule comprise en 2 valeurs


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Vétérinaire
    Inscrit en
    Juin 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Vétérinaire

    Informations forums :
    Inscription : Juin 2014
    Messages : 3
    Par défaut XL 2007 : Macro recherche/copie valeur cellule comprise en 2 valeurs
    Bonjour à tous,
    j'aurais besoin d'une petite macro VBA mais je ne suis pas suffisamment performant et je n'y arrive pas.

    Le problème est relativement simple:
    Chaque mois, on fait un dosage sur un grand nombre de patients, les résultats sont enregistrés dans une feuille
    Dans une autre feuille, on rentre des épisodes de maladies pour ces même patients. J'aimerais que pour chaque date d'épisode clinique, la macro aille rechercher les valeurs de ce patient du mois d'avant et du mois d'après et les copie dans la feuille.

    Essai.xlsx

    Avec les fonctions rechercheV, c'est possible mais fastidieux. Est-ce que pour un programmateur un peu averti, une macro pourrait simplifier le travail ??
    J'ai quelques idées mais je ne sais pas le transcrire en VBA.

    Si quelqu'un est intéressé, merci d'avance...

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Dans une macro, tu commences par chercher le patient.
    Pour ça, tu peux :
    - soit utiliser la méthode Find appliquée à l'objet Range de la plage où se trouve tous les noms de patients, en terminant par un Row pour avoir le numéro de ligne (mais ça exige que tes patients soient classé dans l'ordre)
    - soit faire un For to pour scruter les lignes une à une avec un If qui teste la correspondance et un Exit For qui sort de la boucle en cas de succès.

    Tu mets le numéro de ligne dans une variable.

    Ensuite, tu scrutes la date. Les solutions sont les mêmes, excepté que pour le test du If il faudra placer une condition de type > et non = (si j'ai bien compris ton problème).

    Ensuite, il ne te restera plus qu'à afficher les valeurs de la ligne et colonne trouvée et de la ligne et colonne-1.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 199
    Par défaut
    Bonjour,

    un début a finaliser je penses

    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
     
     
    Sub mise_a_jour_episodes_cliniques()
     
    Dim cpt_l As Integer, cpt_c As Integer
    Dim lePatient As String
    Dim laDate As Date
    Dim lignePatient As Integer, derColonneDate As Integer
     
    For cpt_l = 2 To Sheets("Episodes cliniques").Range("a" & Rows.Count).End(xlUp).Row
        lePatient = Sheets("Episodes cliniques").Cells(cpt_l, 1)
        laDate = Sheets("Episodes cliniques").Cells(cpt_l, 2)
     
        'Recherche de la ligne du patient dans la feuille Résultats mensuels
        Set R = Sheets("Résultats mensuels").Range("A:A").Find(lePatient)
     
        If Not R Is Nothing Then
            lignePatient = R.Row
     
            'Derniere colonne ou il y a une date
            derColonneDate = Sheets("Résultats mensuels").Cells(1, Cells.Columns.Count).End(xlToLeft).Column
     
            'Parcours des colonnes dates à la recherche de la date directement supérieur à la date recherchée
            For cpt_c = 2 To derColonneDate
     
                If Sheets("Résultats mensuels").Cells(1, cpt_c) > laDate Then
                    Sheets("Episodes cliniques").Cells(cpt_l, 3) = Sheets("Résultats mensuels").Cells(lignePatient, cpt_c - 1)
                    Sheets("Episodes cliniques").Cells(cpt_l, 4) = Sheets("Résultats mensuels").Cells(lignePatient, cpt_c)
                    Exit For
                End If
            Next cpt_c
        End If
     
     
    Next cpt_l
     
    End Sub
    Cordialement,

  4. #4
    Candidat au Club
    Homme Profil pro
    Vétérinaire
    Inscrit en
    Juin 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Vétérinaire

    Informations forums :
    Inscription : Juin 2014
    Messages : 3
    Par défaut Parfait...
    Merci beaucoup à tous les 2,
    le code de Goldstar fonctionne parfaitement
    J'essaie de l'améliorer un peu (notamment pour éviter les valeurs nulles, lorsque un examen mensuel n'a pas été fait)
    Merci encore...

  5. #5
    Candidat au Club
    Homme Profil pro
    Vétérinaire
    Inscrit en
    Juin 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Vétérinaire

    Informations forums :
    Inscription : Juin 2014
    Messages : 3
    Par défaut Désolé, je n'arrive pas à finaliser le code
    Bonjour, c'est à nouveau moi...
    je pensais arriver à me débrouiller tout seul pour finaliser avant de cocher résolu mais je me suis sur-estimé.

    En fait, le code de Goldstar fonctionne parfaitement, mais lorsqu'une valeur est nulle, j'aurais besoin de prendre soit la première valeur non nulle à D, soit la première valeur non nulle à G
    ex: le patient 2 a été malade le 5/12/12 et donc il a manqué les contrôles de fin novembre et de janvier. Il me faudrait donc automatiquement prendre les contrôles d'octobre et de février.

    Je suppose qu'on doit y arriver avec les fonctions xlRight et xlLeft mais je n'arrive pas à paramétrer et j'obtiens soit la cellule la plus à droite de la ligne, soit la plus à gauche

    Essai 2.xlsx

    Le code de Goldstar est:

    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
     
    Sub mise_a_jour_episodes_cliniques()
     
    Dim cpt_l As Integer, cpt_c As Integer
    Dim lePatient As String
    Dim laDate As Date
    Dim lignePatient As Integer, derColonneDate As Integer
     
    For cpt_l = 2 To Sheets("Episodes cliniques").Range("a" & Rows.Count).End(xlUp).Row
        lePatient = Sheets("Episodes cliniques").Cells(cpt_l, 1)
        laDate = Sheets("Episodes cliniques").Cells(cpt_l, 2)
     
        'Recherche de la ligne du patient dans la feuille Résultats mensuels
        Set R = Sheets("Résultats mensuels").Range("A:A").Find(lePatient)
     
        If Not R Is Nothing Then
            lignePatient = R.Row
     
            'Derniere colonne ou il y a une date
            derColonneDate = Sheets("Résultats mensuels").Cells(1, Cells.Columns.Count).End(xlToLeft).Column
     
            'Parcours des colonnes dates à la recherche de la date directement supérieur à la date recherchée
            For cpt_c = 2 To derColonneDate
     
                If Sheets("Résultats mensuels").Cells(1, cpt_c) > laDate Then
                    Sheets("Episodes cliniques").Cells(cpt_l, 3) = Sheets("Résultats mensuels").Cells(lignePatient, cpt_c - 1)
                    ' au lieu de prendre la valeur (lignePatient, cpt_c - 1), j'aimerais mettre la dernière valeur non nulle à G si cette cellule est vide
     
                    Sheets("Episodes cliniques").Cells(cpt_l, 4) = Sheets("Résultats mensuels").Cells(lignePatient, cpt_c)
                    ' au lieu de prendre la valeur (lignePatient, cpt_c), j'aimerais mettre la première valeur non nulle à D si cette cellule est vide
     
                    Exit For
                End If
            Next cpt_c
        End If

    Merci d'avance si quelqu'un a encore un peu de temps à me consacrer...

Discussions similaires

  1. [XL-2010] Recherche d'une cellule formattée dont la valeur est résultat d'une formule.
    Par Marcouille34 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 12/06/2014, 11h17
  2. [XL-2007] Macro pour colorier des cellules en fonction de données
    Par stephane12 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 23/05/2014, 07h51
  3. [WD-2007] macro qui copie une cellule dans une autre cellule d'un autre tableau
    Par jmperieras dans le forum VBA Word
    Réponses: 2
    Dernier message: 17/05/2013, 20h05
  4. [XL-2007] Macro recherche d'une cellule variable
    Par snow58 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/02/2012, 16h57
  5. [XL-2003] Macro recherche + copie selon critère de dates
    Par exqlicit dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/09/2009, 14h50

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