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 :

Calcul du nombre d'occurences dans une colonne


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Points : 221
    Points
    221
    Par défaut Calcul du nombre d'occurences dans une colonne
    bonjour,

    Je débute dans VBA Excel et j'ai du mal à me dépatouiller.
    J'ai un classeur qui a 2 feuilles. La feuille 1 correspond aux données, et la feuille 2 me permet de travailler sur ses données.

    J'ai créé une macro dans module1. Cette macro doit me donner le nombre de strings identiques au paramètre d'une cellule.
    Un exemple :
    colonne X dans feuille 1
    SVK
    FRA
    GB
    SVK
    FRA
    GB
    FRA
    FRA
    USA

    Dans une cellule de ma feuille 2, je défini une fonction par fx = NomMacro( " FRA"). J'ai donc dans ma cellule le nombre de "FRA" qui se trouve dans la colonne X de la feuille1 soit 4.

    Voici le code que j'ai développé :
    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
     
    Function NomMacro (ByVal  S as String) as Integer
     
    dim i as integer
    dim num as integer
    i = 2
    num = 0
    'selection de la feuille 1
    Worksheet("F1").Activate
    'Tant que la cellule de la colonne X n'est pas vide
    While Trim(ActiveSheet.Cells(i, X).Value) <> ""
    'Si la valeur de la cellule est égale que S
    If Cells(i, X).Value Like S Then
    num = num + 1
    End If
    i = i + 1
    Wend
    Selection de la feuille 2
    Worksheet("F2").Activate
    'Mettre le numéro dans la cellule où il y a la fonction
    Set NomMacro = num
     
    End Function
    Ce code ne marche pas. Dans ma cellule, j'obtiens #NOM?.
    Quelqu'un pourrait m'aider à faire fonctionner cette macro?
    Merci
    "Nulla Tenaci Invia Est Via"
    Aux persévérants aucune route n'est interdite

  2. #2
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Citation Envoyé par Masmeta Voir le message
    .../...
    Voici le code que j'ai développé :
    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
    Function NomMacro (ByVal  S as String) as Integer
    
    dim i as integer
    dim num as integer
    i = 2
    num = 0
    'selection de la feuille 1
    Worksheet("F1").Activate
    'Tant que la cellule de la colonne X n'est pas vide
    While Trim(ActiveSheet.Cells(i, X).Value) <> ""
    'Si la valeur de la cellule est égale que S
    If Cells(i, X).Value Like S Then
    num = num + 1
    End If
    i = i + 1
    Wend
    Selection de la feuille 2
    Worksheet("F2").Activate
    'Mettre le numéro dans la cellule où il y a la fonction
    Set NomMacro = num
    
    End Function
    Ce code ne marche pas. Dans ma cellule, j'obtiens #NOM?.
    Quelqu'un pourrait m'aider à faire fonctionner cette macro?
    Merci
    1°) il n'est pas possible d'invoker de méthodes dans des fonctions de feuilles
    2°) Set n'est utilisé que pour affecter une variable de type objet

    soit
    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
    Function NomMacro (ByVal  S as String) as Integer
     
    dim i as integer
    dim num as integer
    i = 2
    num = 0
    'Tant que la cellule de la colonne X n'est pas vide
    While Trim(Worksheets("F1").Cells(i, X).Value) <> ""
    'Si la valeur de la cellule est égale que S
    If Worksheets("F1").Cells(i, X).Value Like S Then
    num = num + 1
    End If
    i = i + 1
    Wend
     
    NomMacro = num
     
    End Function
    est amplement suffisant

    Ceci dit, la fonction NB.SI ferait le même usage

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Points : 1 114
    Points
    1 114
    Par défaut
    bonsoir,

    a 1°vue, dans VBA on utilise le numéro de colonne et non la lettre
    X correspond à 24
    donc essaies
    cells(i,24)

    je suppose que tu as fait cette macro pour apprendre car elle existe en "PAC "(Pret A Cuire) dans Excel: nb.si(plage;valeur à dénombrer")

    bonne soirée
    Michel_M

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut Masmeta et le forum
    Une macro est un petit programme
    une function est une macro qui retourne une valeur (une formule)

    colonne X dans feuille 1
    SVK
    FRA
    GB
    SVK
    FRA
    GB
    FRA
    FRA
    USA

    Dans une cellule de ma feuille 2, je défini une fonction par fx = NomMacro( " FRA"). J'ai donc dans ma cellule le nombre de "FRA" qui se trouve dans la colonne X de la feuille1 soit 4.

    Voici le code que j'ai développé :
    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 NomMacro(ByVal S As String) As Integer
    Dim i As Integer
    Dim num As Integer
    i = 2
    num = 0
    Application.Volatile
    'recalcul à chaque changement de la feuille
    'selection de la feuille 1
    With Worksheet("F1")
    'ta formule doit pouvoir être employée sur toutes les feuille
        'Tant que la cellule de la colonne X n'est pas vide
        While Trim(.Range("X" & i)) <> ""
        'Cells(i, X) : x est une variable integer
        'Cells(i, "X") : colonne X
        'Si la valeur de la cellule est égale que S
            If Trim(UCase(.Range("X" & i))) = tirm(UCase(S)) Then
                num = num + 1
            End If
            i = i + 1
        Wend
    End With
    'Mettre le numéro dans la cellule où il y a la fonction
    NomMacro = num
    End Function
    Bon, quelques principes
    La déclaration des variables : Bon point, mais si tu la rend obligatoire (Outils>>Option), qu'elles commencent par une majuscules et que tu écris ton code en minuscule, quand tu valides ta ligne par Ebter, la majuscule se met automatiquement => si elle ne le fait pas, c'est que tu as une faute de frappe

    Like : c'est utile dans le cadre d'utilisation de caractères génériques (* ou ?). Sinon, je préfère tester l'égalité, en supprimant les parasites (espaces intempestifs, majuscules/minuscules). Sinon, les options de comparaison peuvent être utiles (voir Option Compare dans l'aide VBA)

    Tu utilises une function : évite les problème d'activation : dans tout les cas, le résultat est renvoyé dans la cellule contenant la formule

    L'emploi de Set est inadapté dans ce cas : il ne sert que pour définir les objets, et pas les variables.

    Cells(1,x) : cellule colonne n°x ligne 1
    Si tu ne définit pas x auparavant, il prend la valeur par défaut et comme Excel attend un Integer, c'est la valeur 0 qui lui est attribuée dans ton cas => colonne 0 n'existant pas => erreur Excel

    Pour définir une cellule :
    Range ("A1") définit la cellule A1
    cells(1,1) défini aussi A1
    Cells(1,"A") idem
    [A1] aussi
    pour une plage, (A1:B8)
    Range("A1:B8")
    [A1:B8] mais, le point derrière ne donne pas la liste déroulante des possibilités
    Range(Range("A1"),range("B8"))
    Range([A1],[B8])
    Range(cells(1,1),cells(8,2))

    J'utilises range ou [] pour définir clairement mes colonnes par lettres
    cells, je préféres l'utiliser pour des valeurs numériques cellules ou colonne
    Dans la plage B1:C8, si je veux pointer C2 je peux utiliser :
    Range("C2"), bien évidement, ou une des autres notations ci-dessus ou
    Range("B1:C8").cells(2,2) => 2me ligne 2me colonne de la plage
    Range("B1:C8").cells(4) => 4me cellule de la plage en lisant ligne par ligne

    et on peut complexifier :
    Range("B1:C8").cells(2,"B") => 2 ligne colonne B donc, 2me de la plage

    En variable : avec X comme variable de boucle
    Range("B" & x) me fait parcourir les lignes de la colonne B
    Cells(3,X) me fait parcourir les colonnes de la ligne 3

    Amuses-toi bien
    A+

  5. #5
    Membre actif Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Points : 221
    Points
    221
    Par défaut
    Merci à tous pour ses précisions.

    J'ai essayé la fonction NB.SI malheureusement les résultats donnés n'étaient pas bon. D'où le faite que je me suis fait une macro.

    Maintenant ca marche comme je le désire
    "Nulla Tenaci Invia Est Via"
    Aux persévérants aucune route n'est interdite

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

Discussions similaires

  1. Nombre d'occurence dans une colonne
    Par isitien dans le forum Excel
    Réponses: 4
    Dernier message: 02/12/2011, 15h51
  2. Calcul d'une occurence dans une colonne.
    Par Julieta dans le forum Excel
    Réponses: 2
    Dernier message: 11/06/2007, 15h45
  3. Réponses: 4
    Dernier message: 07/09/2006, 15h02
  4. recherche du nombre d'occurences dans une table
    Par berry dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/01/2004, 20h03

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