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 :

Fonction NB.SI VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 80
    Par défaut Fonction NB.SI VBA
    Bonjour à tous !

    Petit soucis avec la fonction NB.SI

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    With Sheets("Synthese")
    .Range("E4").Select 
        Selection.NumberFormat = "0"" PDV en progression"""
        ActiveCell.Formula = "=NB.SI(PLAGE;">2")"
    J'automatise la création de tableaux de synthèses, la plage n'est pas la même pour chaque fichier, ce que je voudrais en fait, c'est que le comptage commence à la ligne H3 (bon ça ok j'y arrive sans problème) MAIS que ça se termine à la dernière ligne renseignée ; c'est possible de "dire" ça à la fonction NB.SI ?

    Merci par avance pour l'aide que vous pourrez m'apporter !!!

  2. #2
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    Bonjour,
    Tu peux utiliser ce code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x = Range("H"& Rows.count).End(x1Up).Row
    Application.WorksheetFunction.CountIf(Range("H3:H" & x), toncritère)

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 055
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Cette ligne ActiveCell.Formula = "=NB.SI(PLAGE;">2")" renverra une erreur car la propriété Formula attend une chaîne de caractères contenant une formule en anglais soit COUNTIF
    Pour en savoir plus, tu peux lire Ecrire une formule dans Excel à l'aide d'une procédure VBA
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    Philippe est ce que mon code pourrait lui convenir?

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 80
    Par défaut
    Bonjour Kiouane, bonjour Philippe,

    Tout d'abord, je vous remercie à tous les deux pour vos réponses ! J'ai pris connaissance du lien que tu as envoyé Philippe, du coup tu m'apprends quelque chose ; utiliser le nom en Anglais, merci

    Kiouane, je vais essayer ton code et je te tiens au courant du résultat, merci pour le partage !!

    EDIT : j'ai oublié de préciser que le résultat, je souhaite le placer dans une autre feuille intitulée "synthese", par contre le calcule se fait sur la feuille "telephonie"

    J'ai essayé sur un autre fichier excel pour essayer :

    Nom : Capture.PNG
Affichages : 18149
Taille : 14,0 Ko

  6. #6
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Bonjour mateoa44,

    essaye ça pour voir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub fonction()
     
    With Sheets(2)
        .Range("E4").NumberFormat = "0"" PDV en progression"""
        .Range("E4") = Application.WorksheetFunction.CountIf(Sheets(1).Range("A1:A" & Sheets(1).Range("A1").End(xlDown).Row), ">2")
    End With
     
    End Sub

  7. #7
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    Citation Envoyé par mateoa44 Voir le message
    Bonjour Kiouane, bonjour Philippe,

    Tout d'abord, je vous remercie à tous les deux pour vos réponses ! J'ai pris connaissance du lien que tu as envoyé Philippe, du coup tu m'apprends quelque chose ; utiliser le nom en Anglais, merci

    Kiouane, je vais essayer ton code et je te tiens au courant du résultat, merci pour le partage !!

    EDIT : j'ai oublié de préciser que le résultat, je souhaite le placer dans une autre feuille intitulée "synthese", par contre le calcule se fait sur la feuille "telephonie"

    J'ai essayé sur un autre fichier excel pour essayer :

    Nom : Capture.PNG
Affichages : 18149
Taille : 14,0 Ko

    Tu dois affecter ton application.function à une cellule par exemple. C'est pour cela que tu reçois cette erreur.

    Edit : Pour la syntaxe de ta plage, ça devrait plutôt être sous forme d'un Range.

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 80
    Par défaut
    Bonjour Al__22, merci pour ta réponse !!! Sur mon fichier test ça marche parfaitement, du coup, baaah, merci beaucoup haha

    @Kilouane :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.WorksheetFunction.CountIf(Range("H3:H" & x), ">2")
    Je ne sais pas comment ajouter la feuille dans ce code, j'ai essayé plusieurs choses mais qui provoquent des erreurs à chaque fois !

  9. #9
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 72
    Par défaut
    Sinon si tu veux rester sur ta formule de base, remplace le Formula par FormulaLocal.

    Comme le stipule le lien donné par Philippe, .formula attendra TOUJOURS une formule Excel en ANGLAIS.
    Alors que FormulaLocal dépend de ton installation, si ton installation est en français ce qui semble être vu que tu utilise NB.SI alors il faut utilisé la méthode FormulaLocal et non Formula.

    DeathZarakai

    EDIT : range() -> Worksheets("nom de ta feuille").Range()

  10. #10
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    Pour te dépanner mais il y aura sûrement mieux à faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub fonction()
     
     
    Sheets(1).Activate
        x = Range("C" & Rows.Count).End(xlUp).Row
        Cells(1, 1).Value = Application.WorksheetFunction.CountIf(Range("H3:H" & x), ">2")
     
    Sheets(2).Activate
        Range("E5").NumberFormat = "0"" PDV en progression"""
        Cells(5, 5).Value = Sheets(1).Cells(1, 1).Value
     
     
    End Sub

  11. #11
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 80
    Par défaut
    Je vous remercie à tous pour vos réponses !

    J'ai gardé la solution de Al__22 qui fonctionne !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .Range("E4").NumberFormat = "0"" PDV en progression"""
    .Range("E4") = Application.WorksheetFunction.CountIf(Sheets("Telephonie").Range("I4:I" & Sheets("Telephonie").Range("I4").End(xlDown).Row), ">2")

    EDIT : il est vrai que j'aurais pu, mais comme je suis en stage, je ne sais pas qui va utiliser le code après, donc autant laisser en anglais !! (au cas où ^^)

  12. #12
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Heureux si ça t'a aidé
    Après si tu le souhaites plutôt que de mettre le n° d'index des feuilles tu peux mettre leur noms :
    sheets(1) = sheets("Téléphonie") etc
    le 1 signifie que ta feuille est en position 1 par rapport aux autres donc si jamais tu la bouge de place cela foire tes calculs donc à toi de voir ce que tu préfères

    Et pour plus de flexibilité je te le remets avec les noms des feuilles et des explications :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub fonction()
     
    With Sheets("Synthèse") 'Tout ce qui suit avec un "." au début appartient à la feuille Synthèse
        .Range("E4").NumberFormat = "0"" PDV en progression""" 'ta mise en format perso
        .Range("E4") = Application.WorksheetFunction.CountIf(Sheets("Téléphonie").Range("A1:A" & Sheets("Téléphonie").Range("A1").End(xlDown).Row), ">2") 'tu dis à VBA de mettre dans la cellule E4 le résultat de ton countif
    'Sheets("Téléphonie").Range("A1").End(xlDown).Row : renvoie la dernière ligne avec une valeur dans la colonne A
     
    End With
     
    End Sub
    Bon courage pour la suite

  13. #13
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 80
    Par défaut
    Je te remercie pour le partage et les explications ! ^^
    J'avais déjà modifié (1) par "Telephonie"

    J'aurais tout de même une dernière question sur le count if !!

    Je fais face à un nouveau problème !!

    J'aimerais que .Range("E12") prenne la valeur de cette formule.. mais avec ta technique, je m'emmêle les pinceaux !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =(NB.SI(P5:P36;"=100%")/NB.SI(O5:O36;">0"))
    C'est le même principe que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("E8") = Application.WorksheetFunction.CountIf(Sheets("Telephonie").Range("L4:L" & Sheets("Telephonie").Range("L4").End(xlDown).Row), ">2")
    sauf que cette fois il y a une division par un autre countif haha

    Tu as une idée de comment faire ? ^^'

  14. #14
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Bonjour mateoa,

    Pour plus de lisibilité tu peux mettre en variable string tes deux valeurs puis dire de mettre le résultat dans la cellule de ton choix, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cif1 = Application.WorksheetFunction.CountIf(Sheets("Ta feuille avec les données").Range("Ton range"), "Ta condition")
    cif2 = Application.WorksheetFunction.CountIf(Sheets("Ta feuille avec les données").Range("Ton range"), "Ta condition")
    Sheets("Ta feuille finale").Range("Ta cellule finale").Value = cif1/cif2
    A toi d'adapter après avec les valeurs dont tu as besoins

  15. #15
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 72
    Par défaut
    Citation Envoyé par Al__22 Voir le message
    Bonjour mateoa,

    Pour plus de lisibilité tu peux mettre en variable string tes deux valeurs puis dire de mettre le résultat dans la cellule de ton choix, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cif1 = Application.WorksheetFunction.CountIf(Sheets("Ta feuille avec les données").Range("Ton range"), "Ta condition")
    cif2 = Application.WorksheetFunction.CountIf(Sheets("Ta feuille avec les données").Range("Ton range"), "Ta condition")
    Sheets("Ta feuille finale").Range("Ta cellule finale").Value = cif1/cif2
    A toi d'adapter après avec les valeurs dont tu as besoins
    Attention, ta méthode est la bonne mais tu oublies un détail :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If cif2 <> 0 then
         Sheets("Ta feuille finale").Range("Ta cellule finale").Value = cif1/cif2
    Else
         Sheets("Ta feuille finale").Range("Ta cellule finale").Value = 0 'A changer si tu veux autre chose
    End If
    Par sécurité c'est mieux ça évite les erreurs, autant la formule Excel mettrait un #N/A autant la macro elle plantera. Enfin de toute façon c'est plus propre.

    DeathZarakai.

  16. #16
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 80
    Par défaut
    Bonjour à vous deux !

    Je vous remercie pour vos réponses !

    Je me repenche sur le problème cet après-midi, je vous tiendrais au courant !

  17. #17
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Citation Envoyé par DeathZarakai Voir le message
    Attention, ta méthode est la bonne mais tu oublies un détail :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If cif2 <> 0 then
         Sheets("Ta feuille finale").Range("Ta cellule finale").Value = cif1/cif2
    Else
         Sheets("Ta feuille finale").Range("Ta cellule finale").Value = 0 'A changer si tu veux autre chose
    End If
    Par sécurité c'est mieux ça évite les erreurs, autant la formule Excel mettrait un #N/A autant la macro elle plantera. Enfin de toute façon c'est plus propre.

    DeathZarakai.
    En effet mais je partais du principe que son cif2 ne serait jamais égale à 0
    Mais tu as raison il vaut mieux le préciser

    PS : il me semble par ailleurs l'erreur que mettrait excel est #DIV/0! non ?

  18. #18
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 72
    Par défaut
    Citation Envoyé par Al__22 Voir le message
    PS : il me semble par ailleurs l'erreur que mettrait excel est #DIV/0! non ?
    Après test en effet, mais étant matheux c'est un truc que je check toujours direct, donc j'avais jamais eu le cas :p

  19. #19
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 161
    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 161
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    je pense plutôt que la procédure va planter avec l'erreur "Division par 0" si cif2 = 0 et pas cif1 ?
    on aura un dépassement de capacité si les 2 ont une valeur à 0


    ce n'est qu'un détail ... certes

  20. #20
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    Il a bien mis la condition pour le cif2 Joe!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [VBA]Fonction 'ajout' en vba sur une table
    Par rico63 dans le forum VBA Access
    Réponses: 15
    Dernier message: 28/03/2007, 17h56
  2. Comment écrire dans une cellule la fonction SUM en vba?
    Par Subkill dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/02/2007, 20h24
  3. Fonction excel en VBA
    Par Gary US dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/12/2006, 18h39
  4. Fonction Yield en VBA sans Automation
    Par laurentcr dans le forum Access
    Réponses: 7
    Dernier message: 02/10/2006, 15h43
  5. Réponses: 1
    Dernier message: 14/10/2005, 16h36

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