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 Excel adequate


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2013
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lille
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 127
    Par défaut Fonction Excel adequate
    Bonjour à la communauté;
    Je suis à la recherche d'une fonction adéquate pour mon problème.
    En effet, j'ai 3 colonnes.
    La première contient une série de 0 et de 1.
    La deuxième contient une série de valeurs en zlotis.
    La 3ème colonne est dédiée à accueillir mon calcul.

    J'aimerais faire une fonction qui quand elle rencontre un 1 dans la 1ère colonne, fasse la somme des précédents nombre se trouvant dans la 2èmes colonne, elle inscrit cette dernière dans la 3ème colonne. Si il y a un 1 dans la 1ère colonne et qu'il n' ya aucune valeur dans la 2ème colonne, elle inscrit "not in contract" dans la 3ème colonne .

    Si elle rencontre un 0, elle laisse un blanc dans la 3ème colonne, même si il ya une valeur dans la 2ème colonne.

    La difficulté de cette exercice réside dans le fait de faire la somme des nombres et d'inscrire la somme dans la 3ème colonne.

    Merci pour votre aide.

    En pièce jointe vous trouverez un fichier pour illustrer mon propos.
    Par exemple, je dois retrouver 417.52 zlotis pour la ligne 6 de la colonne C

  2. #2
    Membre confirmé
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2013
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lille
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 127
    Par défaut
    Une première solution serait de faire ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =si(A2=0;"";si(B2="";Not in contract";B2))
    Mais là je fais en quelque sorte une copie de la colonne B. J'aimerais faire la somme des nombres précédents.

    En clair, à chaque fois que je rencontre un 1; je recopie le nombre correspondant plus la somme des nombres précédents.
    Quand je rencontre un 1 et que dans la colonne B , il y a aucun nombre, je laisse la chaîne de caractère Not in contract.
    Quand je rencontre un 0, je laisse un blanc.

    Merci pour votre aide.

  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 179
    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 179
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Une solution parmi d'autres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(ET(A2=1;B2=0);"Not in contract";A2*SOMME($B$2:B2))
    Si 1 en A et valeur en B fait la somme des cellules qui précèdent.
    Si 1 en A et valeur 0 en B - Affiche "Not in contract"
    Si 0 en A et valeur en B - Affiche 0
    Pour faire en sorte que la valeur nulle ne s'affiche pas, il y a trois solutions.
    1 - Modifier l'option d'excel pour ne pas afficher les valeurs nulles dans la feuille.
    2 - Appliquer une mise forme conditionnelle sur les cellules de la colonne C.
    3 - Placer un format personnalisé sur les cellules de la colonne C.
    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 confirmé
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2013
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lille
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 127
    Par défaut
    Merci Philippe, pour votre réponse.
    Mais je voudrais en fait que la somme s'arrête au niveau du premier 1 et reprenne par après.

    Je m'explique si pour la cellule 6 de la colonne C , j'ai 417,52 zlotis;
    pour la cellule 20, j'ai 153,56 zlotis.

    En fait la somme n'est pas linéaire. Une fois que j'ai fais une somme, le compteur est remis à zéro, et je reprends la somme quand je rencontre un autre 1 qui a bien évidement une valeur dans la colonne B.

    Je ne sais pas si je me suis bien fais comprendre.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Cherche-tu une fonction Excel ou une macro pourrait faire l'affaire ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2013
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lille
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 127
    Par défaut
    Je cherche plutot une macro j'ai peur qu'une fonction Excel ne fasse pas l'affaire.
    ça pourrait être un si monstrueux

    Un internaute m'a déjà suggéré cette formule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SI(ET(A2=1;B2=0);"Not in contract";A2*SOMME($B$2:B2))
    Sauf que je vais que le calcul se reinitialise à chaque fois que je rencontre un 1.
    Bien évidement le calcul se déclenche quand il y a un nombre dans la cellule B correspondante.

    Merci de votre aide

    Bonsoir à la communauté;
    Je suis un peu à la masse, je cherche à automatiser mon calcul dans une colonne donnée.

    Quelqu'un pourrait m'aider je suis un peu perdu.

  7. #7
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonsoir,

    Essaie :

    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
    Function SansNom() As Variant
        Dim Ligne, Col, Ctr As Byte
        Application.Volatile
        Ligne = Evaluate("Row()")
        Col = Evaluate("column()")
        If Cells(Ligne(1), Col(1) - 2) = 1 And _
            Cells(Ligne(1), Col(1) - 1) = "" Then
            SansNom = "not in contract"
        ElseIf Cells(Ligne(1), Col(1) - 2) = 1 Then
     
            Set c = Cells(Ligne(1), Col(1) - 2)
            Ctr = 0
            For i = Ligne(1) To 1 Step -1
                If Cells(i, 1) = 1 Then Ctr = Ctr + 1
                If Ctr = 2 Or i = 1 Then
                    Exit For
                End If
                SansNom = SansNom + Cells(i, 2)
            Next i
        End If
    End Function

  8. #8
    Membre confirmé
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2013
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lille
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 127
    Par défaut
    Je vous remercie beaucoup pour le coup de main.
    Mais tout cela semble compliqué sans des petits commentaires.
    Je vais essayer et je reviens vers vous.

    Bonjour,
    Je viens d'essayer la macro dans un module standard mais il l'air de ne pas bien marcher.
    J'ai une erreur récurrent comme quoi la variable c n'est pas définie.

    J'ai Option Explicit par défaut dans mon éditeur de macro.

  9. #9
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bon, tu définis c, c'est pas un problème. Ca ne peux pas fonctionner en tant que macro dans un module standard. Pourquoi est-ce que tu testes le code dans une macro ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Ligne = Evaluate("Row()")
        Col = Evaluate("column()")
    ces deux variables récupèrent l'adresse de la cellule contenant la fonction, alors, dans un module standard, ça correspond à rien. On te donne une fonction, pourquoi est-ce que tu n'essaies pas la fonction ? Ca fonctionne ou ça ne fonctionne pas. Tu le voies tout de suite.

    Fais comme tu veux, mais, personnellement, je ne mets l'option Explicit que lorsque je passe en prod. Tant que c'est en test, je veux être libre de modifier mes variables sans être enquiquiné.

  10. #10
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonsoir,

    Un ersatz de solution sans macro qui donne le résultat visuellement (les valeurs de la colonne C en face d'un 0 en colonne A sont masquées par une MFC).

    Patrice
    Fichiers attachés Fichiers attachés

  11. #11
    Membre confirmé
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2013
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lille
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 127
    Par défaut
    Bonjour à tous,
    Les solutions proposées semblent toutes bien marchées. Je vous remercie pour votre sollicitude.

    juste une dernière question la macro je dois la mettre dans la feuille test alors Daniel

    Bonsoir ,
    en fait ce que je n'arrive pas à comprendre c'est comment tester votre macro sans la mettre dans un module.

  12. #12
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    bonjour,

    Si j'ai bien tout compris.
    Et pour reprendre l'idée de la formule.
    On pourrais simplement inscrire dans la cellule C2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =IF(A2;IF(ISBLANK(B2);"Not in Contract";SUM($B$2:B2));"")
    et ensuite la tirer vers le bas

    non?

  13. #13
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Bricko :

    Tu mets la fonction dans le module standard et, dans la feuille Excel, tu écris :

    en colonne C
    PS. Désolé pour le nom de la fonction, je n'ai rien trouvé de causant. Tu peux le changer dans le code.

  14. #14
    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 179
    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 179
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    En fait la somme n'est pas linéaire. Une fois que j'ai fais une somme, le compteur est remis à zéro, et je reprends la somme quand je rencontre un autre 1 qui a bien évidement une valeur dans la colonne B.
    Pour compléter ma première proposition, à placer à partir de la ligne 3 (si la première ligne des données est en ligne 2).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(ET(A3=1;B3=0);"Not in contract";A3*SOMME($B$2:B3))-(A3*SOMME($C$2:C2))
    Il y a sûrement une meilleure solution qui pourrait débuter en ligne 2
    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

  15. #15
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    Bonjour (plein de soleil ici )

    Oups, j'avais zappé cette partie
    En fait la somme n'est pas linéaire. Une fois que j'ai fais une somme, le compteur est remis à zéro, et je reprends la somme quand je rencontre un autre 1 qui a bien évidement une valeur dans la colonne B.
    alors effectivement, en partant de la deuxieme ligne , on pourrait faire quelque chose ressemblant à ceci je pense
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =IF(A2;IF(ISBLANK(B2);"Not in Contract";SUM($B$2:B2)-SUM($C$1:C1));"")

  16. #16
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Ta fonction fonctionne bien. Seulement pour la recopier sur les 24000 lignes, dans mon environnement, cela prend 6m 30 sec (contre 3,50 sec avec la fonction VBA. Par contre, c'est plus rapide si on passe en calcul manuel le temps de la recopie Je reposte la mienne, modifiée pour tenir compte du calcul quand A=1 et B="" :

    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
    Function SansNom() As Variant
        Dim Ligne, Col, Ctr As Byte
        Application.Volatile
        Ligne = Evaluate("Row()")
        Col = Evaluate("column()")
        If Cells(Ligne(1), Col(1) - 2) = 1 And _
            Cells(Ligne(1), Col(1) - 1) = "" Then
            SansNom = "not in contract"
        ElseIf Cells(Ligne(1), Col(1) - 2) = 1 Then
            Set c = Cells(Ligne(1), Col(1) - 2)
            Ctr = 0
            For i = Ligne(1) To 1 Step -1
                If (Cells(i, Col(1) - 2) = 1 And Cells(i, Col(1) - 1) <> "" And Ligne(1) <> i) Or i = 1 Then
                    Exit For
                End If
                SansNom = SansNom + Cells(i, Col(1) - 1)
            Next i
        End If
        If SansNom = 0 Then SansNom = ""
    End Function
    Voici le code ayant servi à tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test2()
        deb = Timer
        'Application.Calculation = xlCalculationManual
        Set plage = Range([A2], Cells(Rows.Count, 1).End(xlUp)).Offset(, 2)
            [C2].AutoFill plage
        'Application.Calculation = xlCalculationAutomatic
        MsgBox Timer - deb
    End Sub

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

Discussions similaires

  1. Fonction excel adequate
    Par bricko dans le forum Excel
    Réponses: 3
    Dernier message: 02/08/2013, 13h23
  2. [VB.NET][Excel] utiliser des fonction Excel comme xlToRight
    Par Alexj51 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 01/03/2006, 12h10
  3. fonction excel
    Par semur dans le forum Excel
    Réponses: 4
    Dernier message: 24/01/2006, 17h41
  4. [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
  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