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 :

Comment faire un compteur en VBA Excel


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Comment faire un compteur en VBA Excel
    Bonjour,
    Est-ce que il y’a qlqun qui peut m’aider un faire un petit programme en Vab Excel qui contient un compteur qui peut me compter le nombre de dossiers par mode de transport a partir de feuille1 a feuille 2
    Voir format voulue sur feuille2 dans le fichier ci-joint
    Fichiers attachés Fichiers attachés

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour et bienvenue sur le forum Office de DVP.

    Beaucoup de membres du forum ne téléchargent pas les pièces jointes (pour des raisons de sécurité ou de connexion), c'est pour cela qu'il est aussi intéressant de détailler clairement son problème.

    Philippe

  3. #3
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    Ca pourrait ressembler à ça
    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
     
    Sub calcul()
     Dim ligne As Long, lignemax As Long, mois As Long, transport As Long
     
     Sheets("Feuil2").Range("B4:D16").ClearContents
     Sheets("Feuil1").Activate
     lignemax = Selection.SpecialCells(xlCellTypeLastCell).Row
     
     For ligne = 2 To lignemax
      If Sheets("Feuil1").Cells(ligne, 1) <> "" Then
       mois = Format$(Sheets("Feuil1").Cells(ligne, 1), "m")
       t = Sheets("Feuil1").Cells(ligne, 8)
       For transport = 2 To 4
        If t = Sheets("Feuil2").Cells(3, transport) Then Exit For
       Next transport
       Sheets("Feuil2").Cells(3 + mois, transport) = Sheets("Feuil2").Cells(3 + mois, transport) + 1
      End If
     Next ligne
     Sheets("Feuil2").Activate
     
    End Sub
    Il suffit de créer un bouton sur la feuille "Feuil2" qui pointe sur calcul

  4. #4
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    bonjour pmoge Philippe helas le forum
    dans ton cas pourquoi passer par vba ???? par formule plus simple
    ex: avec sommeprod

    feuille2 cellule b4

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMMEPROD((Feuil1!$A$2:$A$10000="01/01/2009"*1)*(Feuil1!$H$2:$H$10000="DHL"))
    tu etires la formule jusqu'a b15 & tu modifies
    idem pour les autres cellules tu modifies seulement adresse & condition

    tu remarques que janv.09 je l'écris "01/01/2009"*1
    donc => févr.-09 = "01/02/2009"*1

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour Helas,
    je vous remercie pour votre solution;néanemoins, ca me done la meme resultat qu'avec le tableau croisé dynamique ou someprode.Ca me compte les doublons des dossiers toujours ; est ce que c'est possible de ne pas compter les doublons.
    Est ce que c'est possible aussi d'aficher le nombre des dossiers qui sont payé et ceux qui n'on pas??

    je vous remerci beacoup pour votre aide

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Il faut d'abord expliquer ce que tu souhaites obtenir, au départ de quelles données...

    Tu parles de doublons. Si je regarde ton tableau, je vois effectivement des données en double, lorsque je regarde une colonne à la fois. Par contre, sur l'ensemble des colonnes, je n'ai pas de lignes en double.

    La finalité d'un tableau croisé dynamique étant de regrouper des données sur certaines valeurs, éliminer les doublons revient à ne plus avoir besoin du TCD car, si pas de valeurs en double, en triple, ... Pas de possibilité de regrouper (plus logique que cela, tu meurs).

    Donc, la question est:
    Sur base du tableau que tu donnes, que souhaites-tu obtenir?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Est-ce que votre tableau peut être trié sans inconvénient ?

    Sinon, une des possibilités : incrémenter une liste de N° séquentiels dans la 1ère colonne vide ("L" par exemple) puis trier sur le mois et le mode de transport puis exécuter la boucle puis trier sur la colonne "L" et supprimer le contenu de cette colonne.

    Tout cela fait en VBA bien sûr.

  8. #8
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    rebonjour le fil on peut le faire aussi avec sommeprod pour les doublons

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMMEPROD(((Feuil1!$A$2:$A$10000="01/01/2009"*1)*(Feuil1!$H$2:$H$10000="DHL")*(EQUIV(Feuil1!$I$2:$I$10000;Feuil1!$I$2:$I$10000;0)=LIGNE(Feuil1!$I$2:$I$10000))))
    a tester!!!

  9. #9
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    je vous remercie pour votre aide; mais ca marche pas toujours;en + avec someprode le PC n'arrete pas a calculer et se bloque aussi; est ce que vous pouvez m'aider a faire avec vba, sur le programme fait par Helas j'ai un problem que avec les doublons sinon samache bien. est ce que vous pouvez le faire sans qu'il compte les doublons

    merci d'avance

  10. #10
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    bonjour le fil le forum comme dit PIERRE quel doublons la reference , facture ect....soit plus explicite

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Un tcd fonctionne très bien pour cela




    Si tu veux vraiment ton tableau en feuil2, tu peux:
    - nommer la plage de données
    - l'utiliser dans la formule suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMMEPROD((MOIS(DECALER(Données;0;0;;1))=MOIS($A4))*(DECALER(Données;0;7;;1)=B$3))
    ce qui donne le tableau suivant


    Mais avec SOMMEPROD, tu vas ramer sur beaucoup de lignes

  12. #12
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    en effet, je veux faire la somme du numero des dossiers colonne (I) sur la premiere feuille, fichier attaché a mon premier message.
    le numero d'un seul dossier peut se repeter 20 fois dans la colonne (I) et je veux le compter une seul fois tout simplement
    je veux avoir le resultat suivant: nombre de dossiers par mode de transport

    Mois nbr dossiers DHL nbr dossiers avion

    Jan 05 06
    Fév 02 05
    Mars 03 09


    je vous remercie

    même avec le tcd ca ne marche pas aussi; il compte sur le mois de janv 9 dossiers avion alors que il y 'a que deux numero qui se repetes le TAF0028/09 et le TAF0031/09

    donc mois je veux sur le tableau que 2 pas 9 ; je ne sais pas si c'est possible.

    je vous remercie beaucoup pour votre aide.

    Pmoge

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Si tu peux ajouter une colonne

    1) Nommer la plage des données avec la formule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =DECALER(Feuil1!$A$1;1;0;NBVAL(Feuil1!$A:$A)-1;NBVAL(Feuil1!$1:$1))
    2) En L2, tu saisis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =1/SOMMEPROD((MOIS(DECALER(Données;0;0;;1))=MOIS(A2))*(DECALER(Données;0;7;;1)=H2)*(DECALER(Données;0;8;;1)=I2))
    et tu tires vers le bas

    3) En L1, tu saisis "Nombre" ou tout autre libellé qui te parle

    4) Tu ajoutes ce champ dans les données de ton tcd, avec une synthèse par somme...

    Si tu veux toujours ton tableau en feuille 2, tu utilises la même colonne ajoutée, et tu saisis la formule suivante en B4 de feuil2, puis tu copies sur ton tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMMEPROD((MOIS(DECALER(Données;0;0;;1))=MOIS($A4))*(DECALER(Données;0;7;;1)=B$3)*(DECALER(Données;0;11;;1)))
    MAIS! Sauf erreur, les valeurs que tu donnes dans ton précédent message ne correspondent pas au fichier que tu as donné dans ton premier message...

  14. #14
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    re, comme j' ai cru conprendre c'est vraiment pas sûr !!!en reprenant le code de helas en cherchant d'abord les doublons code vraiment brut de chez brute !!!!!!

    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
    Sub helas()
    Dim Cel As Range, M As Object, Rng As Range, MaLigne, L As Long, li As Long
    Dim ligne As Long, lignemax As Long, mois As Long, transport As Long
     Application.ScreenUpdating = False
      Sheets("Feuil1").Activate
      L = Range("A65536").End(xlUp).Row
      Set M = CreateObject("Scripting.Dictionary")
      For Each Cel In Range("a1:a" & Range("a65536").End(xlUp).Row)
     MaLigne = Cel & Cel.Offset(0, 8)
      If Not M.Exists(MaLigne) Then
      M.Add MaLigne, MaLigne
         Else
          Cel.Offset(0, 8).Interior.ColorIndex = 8
         If Cel.Offset(0, 7) = "DHL" Then z = z + 1
         End If
        Next Cel
    Sheets("Feuil2").Range("B4:D16").ClearContents
     Sheets("Feuil1").Activate
     lignemax = Selection.SpecialCells(xlCellTypeLastCell).Row
      For ligne = 2 To lignemax
      If Cells(ligne, 1) <> "" And Cells(ligne, 9).Interior.ColorIndex <> 8 Then
       mois = Format$(Sheets("Feuil1").Cells(ligne, 1), "m")
       t = Sheets("Feuil1").Cells(ligne, 8)
       For transport = 2 To 4
        If t = Sheets("Feuil2").Cells(3, transport) Then Exit For
       Next transport
       Sheets("Feuil2").Cells(3 + mois, transport) = Sheets("Feuil2").Cells(3 + mois, transport) + 1
      End If
     Next ligne
     Sheets("Feuil2").Activate
    End Sub

  15. #15
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Rebonjour,
    c'est tres gentille de votre part laetitia;j'aprecie votre cooperation je vous remercie pour tous ca , mais toujours il me sort le mauvais resulat , je pense bien que vous pouvez m'aider a le faire a la fin .le code de Helas marche bien sauf qu'il me compte le numéro du dossier a chaque fois il le trouve ;mais il compte juste ,si un numero du dossier apparesse 2 fois+ un autre numero d'un autre dossier apparesse 1 fois il me donne resultat 3; mais mois je veux c'est un numero du dossier apparesse 20 fois il le compte qu'une seul fois .

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Je te propose une fonction personnalisée, à utiliser dans la feuille 2 de ton classeur.

    Point de vue de la conception de ton tableau en feuil2, j'ai changé les valeurs des mois pour saisir des dates (01/01/09, 01/02/09, ...) avec format d'affichage à "mmmm". C'est plus pratique, pour comparer des dates, d'avoir des dates et des dates, et non des dates et du texte.

    Voici la fonction perso
    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
    Function CompterDossiersMoisTransport(Plage As Range, Mois As Integer, TypeTransport As String) As Long
        Dim dictionnaire As Object
        Dim Cellule As Range
        Dim ColDates As Integer
        Dim ColTypesTransport As Integer
        Dim ColDossiers As Integer
        Dim Compteur As Long
     
        ColDates = 1 ' Dates en A
        ColTypesTransport = 8 ' Types de transport en H
        ColDossiers = 9 ' Dossiers en I
        ' On peut aussi passer ces valeurs en paramètres
     
        Set dictionnaire = CreateObject("scripting.dictionary")
        For Each Cellule In Plage.Columns(1).Cells
            If Month(Cellule(1, ColDates)) = Mois And Cellule(1, ColTypesTransport) = TypeTransport Then
                    If Not dictionnaire.exists(Cellule(1, ColDossiers).Value) Then
                        dictionnaire.Add Cellule(1, ColDossiers).Value, ""
                        Compteur = Compteur + 1
                    End If
            End If
        Next Cellule
        CompterDossiersMoisTransport = Compteur
        Set dictionnaire = Nothing
    End Function
    Tu l'utilise, par exemple en B4, comme ceci, sur base de ton fichier exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =CompterDossiersMoisTransport(Feuil1!$A$2:$K$33;MOIS(Feuil2!$A4);Feuil2!B$3)

  17. #17
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Ma proposition est lourde:
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    Option Explicit
     
    Private Sub CommandButton1_Click()
    Dim LastLig As Long, i As Long
    Dim cel As Range, c As Range, r As Range
    Dim kod As Collection, moi As Collection, tran As Collection
     
    Application.ScreenUpdating = False
     
    With Sheets("Feuil1")
                                                        'Ajout d'une colonne Date & Dossier & Mode transp
        LastLig = .Range("A65536").End(xlUp).Row
        For i = 2 To LastLig
            .Range("L" & i).Value = .Range("A" & i).Value & .Range("I" & i).Value & .Range("H" & i).Value
        Next i
     
        Set kod = New Collection                        'Valeurs sans doublons de la nouvelle colonne
        On Error Resume Next
        For Each cel In .Range("L2:L" & LastLig)
            If cel <> "" Then kod.Add cel, CStr(cel)
        Next cel
        On Error GoTo 0
     
        Set moi = New Collection                        'Valeurs sans doublons des dates (mois)
        On Error Resume Next
        For Each cel In .Range("A2:A" & LastLig)
            If cel <> "" Then moi.Add cel, CStr(cel)
        Next cel
        On Error GoTo 0
     
        Set tran = New Collection                        'Valeurs sans doublons des modes de transport
        On Error Resume Next
        For Each cel In .Range("H2:H" & LastLig)
            If cel <> "" Then tran.Add cel, CStr(cel)
        Next cel
        On Error GoTo 0
    End With
     
    With Sheets("Feuil2")
        .Cells.ClearContents
        For i = 1 To moi.Count                              'Titres de lignes
            .Cells(i + 1, 1).Value = CDate(moi.Item(i))
        Next i
     
        For i = 1 To tran.Count                             'Titres de colonnes
            .Cells(1, i + 1).Value = tran.Item(i)
        Next i
     
        For i = 1 To kod.Count                              'Intersection
            Set c = .Range("A2:A" & .Range("A65536").End(xlUp).Row).Find(CDate(Left(kod.Item(i), 10)), LookIn:=xlValues, LookAt:=xlWhole)
            If Not c Is Nothing Then
                Set r = .Range(.Cells(1, 2), .Cells(1, .Range("IV1").End(xlToRight).Column)).Find(Mid(kod.Item(i), 21, Len(kod.Item(i)) - 20), LookIn:=xlValues, LookAt:=xlWhole)
                    If Not r Is Nothing Then .Cells(c.Row, r.Column) = .Cells(c.Row, r.Column) + 1
            End If
            Set c = Nothing: Set r = Nothing
        Next i
    End With
    Set kod = Nothing
    Set moi = Nothing
    Set tran = Nothing
    Sheets("Feuil1").Columns("L:L").ClearContents
    Application.ScreenUpdating = True
    End Sub

  18. #18
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Impeccable!!!! Maintenant ça marche bien avec la proposition de mercatog; il me compte juste et sans doublons; je vous remercie tous pour votre aide.

  19. #19
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 1
    Points : 1
    Points
    1
    Par défaut SOS
    Bonjour ,
    je viens de voir que votre problème a été solutionné .
    en faite ,'ai a peu près la mémé doléance que vous.
    j'aimerais avoir un fichier excel ou je pourrais mentionner
    la date de commande
    le nom du client
    type de commande
    le nombre de commande similaire
    le moyen de livraison
    le prix de livraison
    le poids de la commande
    les délais de réception
    les lieux de réception

    merci bien

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

Discussions similaires

  1. [XL-2007] comment faire une Jointure SQL en excel VBA
    Par Maxim0 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 01/07/2011, 20h04
  2. [VBA-E] comment faire net send en VBA
    Par zouille dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 11/04/2006, 17h49
  3. [Débutant] Comment faire un compteur pour un bouton?
    Par Paulinho dans le forum AWT/Swing
    Réponses: 21
    Dernier message: 07/01/2006, 21h51
  4. Comment faire un selon en vba
    Par Celia1303 dans le forum Access
    Réponses: 6
    Dernier message: 13/10/2005, 15h31
  5. [CR8.5] Comment faire un compteur ?
    Par sperron dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 09/06/2005, 10h07

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