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 :

Rapatrier un nombre de données en fonction d'une date


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
    Ingénieur sécurité
    Inscrit en
    Août 2011
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 94
    Par défaut Rapatrier un nombre de données en fonction d'une date
    Bonjour le forum,

    J'ai besoin d'une aide à partir du fichier joint pour plus de clarté.

    Dans la colonne "A" j'ai une série de nom, qui se répète plusieurs fois.
    Dans les colonnes "C" et "E" j'ai la possibilité d'insérér des années. Pour une ligne il ne peu y avoir qu'une seule année, soit année 1 ou année 2.
    Cependant un même nom peut avoir une même année soit sur la colonne "C" ou "E".

    Par exemple:

    Dupont    2004    _
    Durand    _       2005
    Dupont    2005  2004
    Durand    2004  2006
    Je souhaiterais que dans la cellule jaune K3 en entrant une année exemple "2004", viennent s'inscrire dans la cellule grise M3 le nombre de personnes concernées par cette année sans faire de doublon. Dans l'exemple ci-dessus cela donnerait 2 si l'on saisit 2004, 2 si l'on saisit 2005, 1 si l'on saisit 2006.


    Je vous remercie par avence pour votre aide.

    Bien cordialement
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expérimenté Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Par défaut
    Bonjour!

    Voila une solution, a inserer dans un module:

    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
    40
    41
    42
    43
    44
    45
    46
    47
    Option Explicit
    Public tab_x() As String
     
    Public Sub nbagent()
    Dim n_Ligne As Long, n_x As Long, n_Agents As Single
    Dim i As Long, j As Long
    Dim tab_Agents() As String
     
    n_Ligne = Feuil4.Cells(Rows.Count, 1).End(xlUp).Row
    n_x = 0
    n_Agents = 0
     
    'ici je remplis ma variable tableau avec les noms (avec les doublons) qui correspondent a l'annee, les doublons seront supprimes plus tard
    For i = 4 To n_Ligne
        If Feuil4.Cells(i, 3).Value = Feuil4.Cells(3, 11).Value Or Feuil4.Cells(i, 5).Value = Feuil4.Cells(3, 11).Value Then
            ReDim Preserve tab_Agents(n_x)
            tab_Agents(n_x) = Feuil4.Cells(i, 1).Value
            n_x = n_x + 1
        Else
    End If
    Next i
     
    'ici je compte les elements de mon tableau en supprimant les doublons
    For i = 0 To UBound(tab_Agents)
        n_Agents = n_Agents + 1 / Compte_Var_Tab(tab_Agents, tab_Agents(i))
    Next i
     
    Feuil4.Cells(3, 13) = n_Agents
     
    End Sub
     
    'pour faire un countif pour une variable tableau, il faut creer sa fonction, ci-dessous un exemple
    Public Function Compte_Var_Tab(tab_x, str_x As String) As Long
    Dim n_cpte As Long, i As Long
     
    n_cpte = 0
     
    For i = 0 To UBound(tab_x)
        If str_x = tab_x(i) Then
            n_cpte = n_cpte + 1
        Else
        End If
    Next i
     
    Compte_Var_Tab = n_cpte
     
    End Function

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Août 2011
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 94
    Par défaut
    Bonjour Vanhoa,

    Merci pour ta contribution.
    Je n'arrive pas à faire fonctionner tes lignes de code. Peut être faut il modifier quelques données, mais là je suis un peu just.
    cordialement

    Autant pour moi Vanhoa, cela fonctionne parfaitement.
    Cependant, peut on la déclencher à chaque fois que l'on saisie la date dans la cellule K3?

    Merci

    Cordialement

  4. #4
    Membre expérimenté Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Par défaut
    Il faut creer un bouton et associer la macro nbagent ou directement faire lecture dans l'editeur VBA.
    Ou plus simple, voici le fichier avec la macro et le bouton en pj

    Classeur1_Avec_Macro.xlsm

    Oui c'est possible.
    Dans le code de ta Feuil4, donc en double cliquant sur "Feuil4 (AMBAZAC)" qui est sous "Microsoft Excel Objects" quand tu est dans l'editeur VBA, colle cette macro:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    If Not Intersect(Target, Feuil4.Cells(3, 11)) Is Nothing Then
    Call nbagent
    End If
     
    End Sub
    La macro va s'activer automatiquement quand tu changes la date

    Par contre j'ai vu qu'il y avait deja quelque chose d'ecrit dans le module de la Feuil4, tu peux le supprimer et replacer par mon code

    Petite modification, si une date n'existe pas, ca creer une erreur, donc j'ai modifier le code, met celui la dans ton module normal:

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    Option Explicit
    Public tab_x() As String
     
    Public Sub nbagent()
    Dim n_Ligne As Long, n_x As Long, n_Agents As Single
    Dim i As Long, j As Long
    Dim tab_Agents() As String
     
    On Error GoTo Traitement
    n_Ligne = Feuil4.Cells(Rows.Count, 1).End(xlUp).Row
    n_x = 0
    n_Agents = 0
     
    For i = 4 To n_Ligne
        If Feuil4.Cells(i, 3).Value = Feuil4.Cells(3, 11).Value Or Feuil4.Cells(i, 5).Value = Feuil4.Cells(3, 11).Value Then
            ReDim Preserve tab_Agents(n_x)
            tab_Agents(n_x) = Feuil4.Cells(i, 1).Value
            n_x = n_x + 1
        Else
    End If
    Next i
     
    For i = 0 To UBound(tab_Agents)
        n_Agents = n_Agents + 1 / Compte_Var_Tab(tab_Agents, tab_Agents(i))
    Next i
     
    Feuil4.Cells(3, 13) = CInt(n_Agents)
    Exit Sub
     
    Traitement:
    Feuil4.Cells(3, 13) = 0
     
    End Sub
    Public Function Compte_Var_Tab(tab_x, str_x As String) As Long
    Dim n_cpte As Long, i As Long
     
    n_cpte = 0
     
    For i = 0 To UBound(tab_x)
        If str_x = tab_x(i) Then
            n_cpte = n_cpte + 1
        Else
        End If
    Next i
     
    Compte_Var_Tab = n_cpte
     
    End Function
    et dans le module de la Feuil4 tu dois avoir seulement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    If Not Intersect(Target, Feuil4.Cells(3, 11)) Is Nothing Then
    Call nbagent
    End If
     
    End Sub
    et le tout va fonctionner

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Août 2011
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 94
    Par défaut Rapatrier un nombre de données en fonction d'une date
    Oui c'est exactement cela, ça fonctionne. Les lignes de commandes exisntantes, ont été effacées, elles ne servaient à rien.

    Merci pour ton aide

    Cordialement

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 24/11/2009, 12h28
  2. Réponses: 3
    Dernier message: 06/11/2008, 13h31
  3. affihage automatique d'une donnée en fonction d'une autre
    Par leclone dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/08/2008, 14h20
  4. Réponses: 14
    Dernier message: 16/04/2008, 14h31
  5. Réponses: 2
    Dernier message: 22/01/2008, 10h46

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