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 :

Compter le nombre de fois qu'un item apparait et inscrire la somme dans une colonne


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Février 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Canada

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 32
    Par défaut Compter le nombre de fois qu'un item apparait et inscrire la somme dans une colonne
    J'ai un fichier excel avec un peu de programmation et j'aimerais y ajouter une nouvelle fonctionnalité, soit compter le nombre de fois que le même produit revient

    Voici ma source de donnée. Ma macro lit pour trouver produits, lorsqu'elle le trouve elle regarde la quantité en dessous et va la mettre dans un autre onglet

    Nom : source_panier.JPG
Affichages : 2131
Taille : 58,6 Ko

    Le résultat: (nom de pièce et Quantité + la couleur lue) Selon la pièce, la localisation va s'inscrire ainsi que la mesure, ça génère automatiquement l'étiquette à imprimé (champs image)
    Nom : resultats_panier.JPG
Affichages : 1851
Taille : 46,2 Ko

    Dans la colonne emplacement, je veux ajouter le nombre de fois que la même pièce revient. Exemple si cette pièce 72-PLAT-023-A revient 2 fois lors de la lecture, je veux que dans emplacement, il soit inscrit 2 dans emplacement vis à vis la pièce, même chose pour toutes les entrées de 2 et +. Si elle est trouvée juste une fois, on laisse emplacement vide

    Mon code:

    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
    Option Explicit
     
    Sub Recherche()
    'Déclaration des variables
    Dim oRng As Range
    Dim i As Integer, n As Integer
    Dim oProd As Range, oCell As Range
    Dim oTable() As String
     
    'Avec Feuil5 (feuille de données)
     
    With Worksheets("Panier")
        'On se place sur B9
        Set oRng = .Range("B9")
        'On parcours de B9 à la dernière ligne non-vide
        For i = 0 To .Cells(.Rows.Count, 2).End(xlUp).Row - 1
            'Si on trouve "Tablette" ou "Produits" (on peut enlever le LCase si souhaité)
            'If LCase(oRng.Offset(i, 0)) = "Tablette" Or LCase(oRng.Offset(i, 0)) = "Produits" Then
             If oRng.Offset(i, 0) = "Tablette" Or oRng.Offset(i, 0) = "Produits" Then
                'On vérifie qu'on a des éléments à sa droite
                If .Cells(oRng.Offset(i, 1).Row, .Columns.Count).End(xlToLeft).Column >= oRng.Offset(i, 1).Column Then
                    'Si oui, on récupère la range des valeurs
                    Set oProd = Range(oRng.Offset(i, 1), .Cells(oRng.Offset(i, 1).Row, .Columns.Count).End(xlToLeft))
                    'qu'on parcours.
                    For Each oCell In oProd
                        'Si on trouve quelque chose
                        If oCell <> "" Then
                            n = n + 1
                            'on sauvegarde les éléments.
                            ReDim Preserve oTable(1 To 3, 1 To n)
                            oTable(1, n) = oCell
                            oTable(2, n) = oCell.Offset(1, 0)
                            oTable(3, n) = oCell.Interior.Color
                        End If
                    Next oCell
                End If
            End If
        Next i
    End With
     
    'Avec Feuil6 (feuille de résultats)
    With Worksheets("Resultats")
        'On se place après la dernière cellule non-vide de la colonne 1
        Set oRng = .Cells(.Rows.Count, 2).End(xlUp)
        'et on y écrit les résultats.
        For i = LBound(oTable, 2) To UBound(oTable, 2)
            oRng.Offset(i, 0) = oTable(1, i)
     
    'On ne déplace ici plus de 1 mais de 3 colonnes l'écriture des résultats.
            oRng.Offset(i, 3) = oTable(2, i)
            oRng.Offset(i, 0).Interior.Color = oTable(3, i)
        Next i
    End With
     
     
    End Sub
    merci de votre aide

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    si, pour synthétiser, le problème reformulé devient :
    pour chaque nom de pièce d'une liste de noms de pièces données (colonne B de la seconde copie écran), je veux dénombrer sur une plage appelée MA_PLAGE (la première copie écran) le nombre de cellule qui contient exactement ce nom, et si c'est supérieur à 1, j'écris le nombre d'occurence dans une colonne (colonne G de la seconde copie écran)

    alors je te conseille de tout simplement pour commencer (en laissant de côté les considérations d'optimisation) :

    - boucle sur la colonne B

    - pour chaque élément

    - calculer le nombre d'occurences via une fonction Excel et gérer à la volée (dans la boucle de l'étape 1) le test des occurences >=2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Toto()
    ' purement illustratif
    Dim MA_PLAGE As Range, CombienDeFois As Long, MonNomDePiece As String
        CombienDeFois = Application.WorksheetFunction.CountIf(MA_PLAGE, MonNomDePiece)
        If CombienDeFois > 1 Then MsgBox MonNomDePiece & " apparait " & CombienDeFois & " fois sur la plage " & MA_PLAGE.Address
    End Sub
    Je me suis donc simplement contenté d'utiliser la fonction NB.SI en VBA.
    Si le VBA n'est pas obligatoire, c'est préférable de le faire dans Excel du coup

  3. #3
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Février 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Canada

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 32
    Par défaut
    Trop logique =)

    Quand on a la tête pleine on voit trop gros

    merci

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

Discussions similaires

  1. [XL-2003] compter le nombre de fois qu'un mot apparait
    Par isodoro dans le forum Excel
    Réponses: 3
    Dernier message: 05/04/2009, 08h24
  2. Réponses: 4
    Dernier message: 06/12/2007, 16h46
  3. Réponses: 2
    Dernier message: 23/05/2006, 18h45
  4. compter le nombre de fois qu'un fichier a été chargé
    Par phpaide dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 23/05/2006, 17h51
  5. Réponses: 2
    Dernier message: 06/01/2006, 23h18

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