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 :

code fonctions Excell


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut code fonctions Excell
    Salut,

    Alors voila ce ke je veux faire.

    je veux créer une fonction qui me permet de compter le nombre de fois ou apparait un argument mais suivant 2 conditions.

    parce que sinon ca serait trop facile et je ne demanderais pas vu qu'il existe la fonction NB.SI

    en gros voila la logique :
    pour tte les cellules de la colonne alpha si la valeur = condition 1 et pour tte les cellules de la colonne beta si la valeur = la condition 2 alors compter le nombre de fois ou cela apparait.

    Alors voila ce que j'ai fait :


    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
    Public Function SiContarSi(Rango1 As Range, Criterio1 As Variant,_ Rango2 As Range, Criterio2 As Variant) As Integer
    
    'Dim Celda1 As Object
    'Dim Celda2 As Object
    For Each Cells In Range("Rango1")
        If Cells.Value = Criterio1 Then
        
            For Each Cells In Range("Rango2")
                If Cells.Value = Criterio2 Then
                SiContarSi = SiContarSi + 1
                End If
            Next Cells
            
            'Call CountIf
                    
        End If
    Next Cells
    
    End Function
    J'ai remis en vert ce que pour l'instant je laisse en commentaire 5 ceux des solutions qui n'ont pas l'air de fonctionner

    En fait pour le moment et je ne sais pas comment la corriger j'ai tjs la même erreur / Erreur de Compilation : Argument non facultatif ----> erreur 449

    j'ai aussi penser que comme l'idée etait proche de la fonction NB.SI si j'arrivai a sortir le code complet de cette fonction je m'en sortirai mais ya apparemment pas moyen de connaitre le code...

    pour finir, je suis pas une pro de la programmation ni meme mon metier. j'ai acquis une certaine logique (pas forcement correcte) et j'ai qque notions... disons que je suis capable d'ecrire un pgr simple mais la je bloque completement, je sais pas ou chercher ou comment resoudre le/les pb et j'ai di a mon chef que j'aurai fait l'analyse du fichier pour demain matin...et sans ca je peux pas faire grand chose! enfin si mais a la main et a chaque fois que le fichier sera modifier il faudra recompter...

    voila avis aux pros... vous etes des stars!

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2007
    Messages : 120
    Points : 181
    Points
    181
    Par défaut
    Salut Citrouilli

    Pourquoi une fonction alors que SommeProd fait déjà celà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMMEPROD((Plage1=Critere1)*(Plage2=Critere2))
    Mytå

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    sinon, pour le vba, je pense que c'est parce que tu utilise cells dans ta boucle, et puis ta boucle n'est pas bonne, tu n'as pas besoin de faire une boucle dans tous rango2 pour savoir si la cellule a coté de ta valeur est égale.
    et puis, si rango1 est une plage que tu a nommé dans excel, tu peux ecrire in range("rango1"), par contre si tu la nomme dans le code vba, tu dois écrire in range(rango1), moi , je prend cette option, a toi de voir


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for each valeurA in range (Rango1)
      if valeurA = Criterio1 Then
       ligne = valeurA.row
        if cells(ligne, 3 ) then SiContarSi = SiContarSi + 1
       en if
    next valeurA

    bien sur, tu remplace 3 par le n° de ta colonne béta dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if cells(ligne, 3 ) then SiContarSi = SiContarSi + 1

  4. #4
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Mytå_Qc
    Salut Citrouilli

    Pourquoi une fonction alors que SommeProd fait déjà celà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMMEPROD((Plage1=Critere1)*(Plage2=Critere2))
    Mytå


    alors j'ai testé mais ce n'est pas ca... la fonction me multiplie lee nombre d'occurence trouvé dans le colonne alpha par le nombre d'occurence trouvé dans la colonne beta.

    alos que moi je veux elimimer...

    ex:

    alpha beta
    2 A
    3 B
    5 A
    2 C

    moi je veux kil me sorte 1 pour le critère "2" sur la colonne alpha et le critere "A" sur la colonne beta. et cette fonction me donne 2*2=4

    c'est ce que mon prmier programme faisait

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par alsimbad
    sinon, pour le vba, je pense que c'est parce que tu utilise cells dans ta boucle, et puis ta boucle n'est pas bonne, tu n'as pas besoin de faire une boucle dans tous rango2 pour savoir si la cellule a coté de ta valeur est égale.
    et puis, si rango1 est une plage que tu a nommé dans excel, tu peux ecrire in range("rango1"), par contre si tu la nomme dans le code vba, tu dois écrire in range(rango1), moi , je prend cette option, a toi de voir


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for each valeurA in range (Rango1)
      if valeurA = Criterio1 Then
       ligne = valeurA.row
        if cells(ligne, 3 ) then SiContarSi = SiContarSi + 1
       en if
    next valeurA

    bien sur, tu remplace 3 par le n° de ta colonne béta dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if cells(ligne, 3 ) then SiContarSi = SiContarSi + 1

    je vais tester

  6. #6
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bon alors voila ce ke j'ai tenté:

    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
    Public Function Contar2Si(Rango1 As Range, Criterio1 As Variant, Rango2 As Range, Criterio2 As Variant) As Integer
     
     
    Dim Celda1 As Object
    Dim Celda2 As Object
    Dim Contar As Integer
     
    Contar = 0
     
    For Each Celda1 In Range(Rango1)
     
        Eval1 = Rango1.Cells(i) & "=" & Criterio1
        Eval2 = Rango2.Cells(i) & "=" & Criterio2
     
        If Evaluate(Eval1) And Evaluate(Eval2) Then
        Contar = Contar + 1
        End If
     
     
    Next Celda1
     
    Contar2Si = Contar
     
    End Function
    il ne me donne plus d'erreur de compil' mais un erreur de valuer qd je teste la fonction sous excel. en plus qd je selectionne la plage de celulle qui dans une autre feuille et qui est tte une colonne, il n'affiche NUM ?

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    si j'en crois ton exemple

    alpha beta
    2 A
    3 B
    5 A
    2 C

    moi je veux kil me sorte 1 pour le critère "2" sur la colonne alpha et le critere "A" sur la colonne beta. et cette fonction me donne 2*2=4

    cette formule convient tres bien, D1 et D2 sont les deux cellules ou tu inscrit tes criteres en l'occurence 2 et A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMME(NB.SI(A1:B4;D1);NB.SI(A1:B4;D2))
    du moins ça te donne 4 occurence, mais pas le 1 pour un seul alignement

  8. #8
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    non moi je veux k'il me dise il y a une seule fois la combinaison 2 et A dans les colonnes Alpha et Beta...

    J'ai quasiment trouvé, le dernier problème qu'il me reste c'est que c'a fonction pour un plage défini mais pas pour tte le colonne (par ex J:J)
    si je selectionne ça comme plage je resort une erreur Valeur? de la fonction
    et une erreur NuM? pour chaque colonne... voila le code que j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Function Contar2Si(Rango1 As Range, Criterio1 As Variant, Rango2 As Range, Criterio2 As Variant) As Integer
     
    Dim i As Integer
     
    For i = 1 To Rango1.Cells.Count
     
        If Rango1.Cells(i).Value = Criterio1 And Rango2.Cells(i).Value = Criterio2 Then
            Contar2Si = Contar2Si + 1
        End If
     
    Next i
     
    End Function

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    bon, alors, je te comprend pas, le premier code que je t'ai envoyé faisait parfaitement l'affaire
    supposons que tu compare la colonne A et la colonne B, je vais pas jouer aux devinettes. tes criteres 1 et 2 sont en c1 et d1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub deuxcriteres()
    Set criterio1 = Cells(1, 3)
    Set criterio2 = Cells(1, 4)
    lignes = Range("a1").End(xlDown).Row
    Set rango1 = Range("a1:a" & lignes)
    For Each valeurA In rango1
      If valeurA = criterio1 And valeurA.Offset(0, 1) = criterio2 Then SiContarSi = SiContarSi + 1
    Next valeurA
    MsgBox SiContarSi
    End Sub


    par contre, je ne vois pas du tout comment cette fonction pourrait te donner un 2*2 = 4, dans ton exemple, elle te donne 1

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2007
    Messages : 120
    Points : 181
    Points
    181
    Par défaut
    Re le forum

    Et mon sommeprod donne 1 aussi comme résultat et non 4

    Mytå_Qc

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    Et mon sommeprod donne 1 aussi comme résultat et non 4

    Mytå_Qc
    parfaitement, j'ai été voir le fichier, a part que je ne comprend pas comment tu a fais ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Contar2Si(A1:A5;D2;B1:B5;E2)
    . c'est quoi?

  12. #12
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    dsl pour ton sommeprod... je sais pas ce que j'ai fait mais effectivement ca marche!
    Enfin ca marche comme mon Contar2Si car il n'accpete pas de prendre la colonne en enteir mais seulement une partie.

    Merci

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 18
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par alsimbad
    parfaitement, j'ai été voir le fichier, a part que je ne comprend pas comment tu a fais ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Contar2Si(A1:A5;D2;B1:B5;E2)
    . c'est quoi?
    solution :
    {=NB(A2:B5)*(SI(A2:A5=2;1;0)*(SI(B2:B5="A";1;0)))}

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 18
    Points : 19
    Points
    19
    Par défaut
    en d'autres termes :

    Sub Macro1()
    '
    Selection.FormulaArray = _
    "=COUNT(R[-8]C[-3]:R[-5]C[-2])*(IF(R[-8]C[-3]:R[-5]C[-3]=2,1,0)*(IF(R[-8]C[-2]:R[-5]C[-2]=""A"",1,0)))"

    End Sub

  15. #15
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    désolé, mais c'est un peu chinois pour moi, je vois bien que c'est une fonction personnalisée, mais je ne sais pas comment on met ça en oeuvre?
    je viens de voir que tu a mis ça en module, donc je comprend bien que c'est ça, mais je savais pas qu'on pouvais le faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Function Contar2Si(Rango1 As Range, Criterio1 As Variant, Rango2 As Range, Criterio2 As Variant) As Integer
    Dim i As Integer
    For i = 1 To Rango1.Cells.Count
        If Rango1.Cells(i).Value = Criterio1 And Rango2.Cells(i).Value = Criterio2 Then
            Contar2Si = Contar2Si + 1
        End If
    Next i
    End Function
    mais apres, comment on passe de là a la boite qui s'inscrit dans excel quand tu veux t'en servir? c'est automatique?
    j'édite parce que j'apprend, j'ai fais ça pour voir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function metaucarré(alfa) As Integer
    alfa = alfa * alfa
    End Function
    et effectivement ma fonction apparaitr, c'est bien, mais elle me renvoie 0 alors que je rentre 2et elle devrais donc me renvoyer 4. ou c'est que je me trompe?

  16. #16
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2007
    Messages : 120
    Points : 181
    Points
    181
    Par défaut
    Salut le forum

    Alsimbad essaye plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Function metaucarré(alfa) As Integer
    metaucarré = alfa * alfa
    End Function
    Ta variable de sortie est metaucarré
    Ta variable d'entrée est alfa

    Mytå_Qc

  17. #17
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    ha d'accord, je vois.
    hé ben c'est super, merci
    bonne journée

Discussions similaires

  1. appel à code fonction excel
    Par victorzecat dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/12/2007, 19h38
  2. fonction excel
    Par semur dans le forum Excel
    Réponses: 4
    Dernier message: 24/01/2006, 17h41
  3. [VBA][Débutante] Fonction Excel avec Boucle
    Par Inelukia dans le forum Macros et VBA Excel
    Réponses: 32
    Dernier message: 11/01/2006, 19h31
  4. Encart code + Fonction de colorisation
    Par Ovide dans le forum Langage
    Réponses: 1
    Dernier message: 30/10/2005, 01h12
  5. Fonction excel: trouvé un numéro de ligne
    Par Nanid dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 28/09/2005, 14h52

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