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 :

macro NB.SI avec ligne paire/impaire [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 71
    Par défaut macro NB.SI avec ligne paire/impaire
    Bonjour à tous !

    Je solicite votre aide sur un point particuliers de la fonction"NB.SI".
    En effet, pour la selection d'une plage de cellule qui se suivent cela donne ça et fonctionne:
    code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("I60").FormulaLocal = "=NB.SI(I10:I59;""<>0"")"
    Cependant, je suis amené à utiliser cette fonction pour une plage de cellule qui ne se suivent pas (c-a-d une ligne sur deux).
    J'ai donc essayé ceci:
    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("Q60").FormulaLocal = "=NB.SI((Q11;Q13;Q15;Q17;Q19;Q21;Q23;Q25;Q27;Q29;Q31;Q33;Q35;Q37;Q39;Q41;Q43;Q45;Q47;Q49;Q51;Q53;Q55;Q57;Q59);""<>0"")"
    Ce code n'est pas "beau" mais a le mérite de fonctionner pour la fonction"=Somme()"
    Cependant il ne fonctionne pas avec la fonction"NB.SI".

    ALors j'ai essayé ceci:
    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("F60").FormulaLocal = "=NB.SI(MOD(LIGNE(F10:F59)2);""<>0"")"
    Idem cela ne fonctionne pas...

    JJe solicite donc votre aide afin de savoir si il est possible d'employer cette fonction("NB.SI") avec comme parametre:une ligne sur deux.

    Je vous remercie d'avance et vous souhaite une bonne journée.

    Cordialement

  2. #2
    Membre éprouvé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Par défaut
    Salut, dans ta formule, le range sera toujours le meme? G de Q11 a Q59??
    Ou bien le range est alleatoir?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 71
    Par défaut
    Bonjour Jojo,

    Oui mon range sera toujours le même, le code sera du style, mais avec une ligne sur deux(soit paire ou impaire en gros):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    code:
        'BA
        Range("F60").FormulaLocal = "=NB.SI(((F10:F58);2);""<>0"")"
        'FP
        Range("L60").FormulaLocal = "=NB.SI(L10:L59;""<>0"")"
        'CO
        Range("O60").FormulaLocal = "=NB.SI(O10:O59;""<>0"")"
        'BQ
        Range("R60").FormulaLocal = "=NB.SI(R10:R59;""<>0"")"
        'BU
        Range("U60").FormulaLocal = "=NB.SI(U10:U59;""<>0"")"
    Je crée donc une ligne pour chaque colonne...

    Merci d'avance

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 71
    Par défaut
    Re,

    Bon, l'ajout de parenthese afin de séparer les cellules ne fonctionne pas non plus.
    Je n'ai pas de message d'erreur lors de l'execution, cependant la valeur inscrites dans la case correspondantes est "###", donc évidement il y a un probleme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("F60").FormulaLocal = "=NB.SI((F10;F12;F14;F16;F18;F20;F22;F24;F26;F28;F30;F32;F34;F36;F38;F40;F42;F44;F46;F48;F50;F52;F54;F56;F58);""<>0"")"
    De plus, plusieurs modificationde ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("I61").FormulaLocal = "=NB.SI(I10:I59;""=<>0"")"
    comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("I61").FormulaLocal = "=NB.SI(I10:I59;""=HS+FIX+MQT"")"
    avec des "+",des",",des";"ou encoredes" "" "ne fonctionne pas non plus...
    A noter, que cette solution (garder la plage de cellule) et modifier la condition ne me convient que partiellement car sur une même colonne, j'ai des termes identiques (cellule paire et impaire)-->donc cela n'est pas la solution à envisager (je voulais juste savoir si ça pouvais fonctionner).

    Seule solution possible-->modifier la plage de cellule...(ou une cellule sur deux, ou bien énumérer toute les cellules(pas très jolie probablement mais fonctionnel)

    Pour l'instant, je suis bloqué.

    J'espère qu'une personne pourra me transmettre une solution viable.

    Merci d'avance

    Cordialement

  5. #5
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Insère dans un module standard la fonction suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Function CpteImp(rng As Range) As Double
    Dim Plage As Range
    Dim Deb As Integer, i As Integer
     
    Deb = rng(1, 1).Row
    If Deb Mod 2 = 0 Then Deb = Deb + 1
    For i = Deb To rng.Rows.Count Step 2
        If rng(i, 1) <> 0 Then CpteImp = CpteImp + 1
    Next i
    End Function
    et remplace tes appels
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("E60").Formula = "=CpteImp(E10:E59)"
    Range("I60").Formula = "=CpteImp(I10:I59)"

  6. #6
    Membre émérite

    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
    Par défaut
    Bonjour,

    plutôt que des NB.SI, essaies des formules du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("D1").FormulaLocal = "=sommeprod((mod(ligne(A1:A29);2)=0)*(A1:A29<>0)*1)"

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 71
    Par défaut
    Bonjour Mercatog, (décidement outjours là pour me sortir de situation difficile)

    Merci pour ce code. Il fonctionne parfaitement !!!

    Cependant, il ne fonctionne que lorsque je l'integre dans un module standart...
    Car quand je l'integre dans ma "feuil1" les cellules de résultats affiche"###" donc erreur.

    Ma question est donc la suivante pourquoi cette fonction ne fonctionne que dans un module standart(module 1 par exemple) et pas dans ma "Feuil1".
    Et donc, est-il possible de l'adapter afin qu"elle fonctionne (en l'integrant dans la "Feuil1") afin que la totalité de mes fonctions et routines puissent se trouver dans le même "fichier"(c-a-d dans "Feuil1").
    Car la placer dans un module signifie entrer de plain pied dans la programmation objet or je ne maitrise pas du tout cette façon de faire et par consequent risque de rien comprendre au fonctionnement de mon programme (et donc risque de me "noyer" dans des problemes incompréhensible pour moi.

    Dans tous les cas , merci tout de même encore une fois.

    n.b:après lecture de "http://ftp-developpez.com/fauconnier/tutoriels/office/utilisation-fonction-sommeprod/sommeprod.pdf" de P.Fauconnier, il apparait qu'il n'est pas possible d'utiliser la fonction "NB.SI" sans plage de cellule se suivant...

    Amicalement

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 71
    Par défaut
    Bonjour Michel,

    Merci pour ce code également.

    Il fonctionne également , mais semble poser probleme dans certains cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("F60").FormulaLocal = "=sommeprod((mod(ligne(F10:F58);2)=0)*(F10:F58<>0)*1)"
       Range("F61").FormulaLocal = "=sommeprod((mod(ligne(F11:F59);2)=0)*(F11:F59<>0)*1)"
    Celui-ci particulierement:
    -changement de valeur dans cellule paire -->affiche le resultat dans les deux cellules(60et61).
    -changement de valeur dans cellule impaire -->ne modifie pas la valeur de la cellule 61.
    Donc peut-etre est-ce moi qui me suis trompé dans la syntaxe de la 2eme declaration?

    Ce qui me pose probleme, car je compte faire la somme d'une cellule sur 2 (paire ou 10,12,14 etc... jusqu'à 58) dans la cellule 60 par exemple et faire la somme d'une cellule sur 2 (impaire ou 11,13,15 etc... jusqu'à 59 dans la cellule 61.

    Merci encore pour ton aide

    Amicalement

  9. #9
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Avec sommeprod, c'est mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("F61").FormulaLocal = "=sommeprod((mod(ligne(F10:F59);2)<>0)*(F11:F59<>0)*1)"

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 71
    Par défaut
    Re et merci tout d'abord,

    En effet, "sommeprod semble plus dans mes "moyens".

    Cependant, le probleme est identique à la fonction de Michel.

    c'est-a-dire:
    Même probleme si je cumule 2 lignes de code telles que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("F60").FormulaLocal = "=sommeprod((mod(ligne(F10:F59);2)<>0)*(F11:F59<>0)*1)"
        Range("F61").FormulaLocal = "=sommeprod((mod(ligne(F11:F59);2)<>0)*(F10:F59<>0)*1)"
    --> resultat:Si clic dans cellule paire ou impaire alors "#N/A" affiché dans les deux cellules"60et61".

    1ere modifications:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Range("F60").FormulaLocal = "=sommeprod((mod(ligne(F10:F58);2)<>0)*(F11:F59<>0)*1)"
        Range("F61").FormulaLocal = "=sommeprod((mod(ligne(F10:F58);2)<>0)*(F11:F59<>0)*1)"
    -->resultat:si clic dans cellule paire alors modifications des deux cellules"60et61"(identique)
    si clic dans cellule impaire alors aucune modifications des deux cellules "60et61".
    2eme modifications:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("F60").FormulaLocal = "=sommeprod((mod(ligne(F10:F58);2)<>0)*(F11:F59<>0)*1)"
        Range("F61").FormulaLocal = "=sommeprod((mod(ligne(F10:F58);2)<>0)*(F11:F59<>0)*1)"
    -->résultat:si clic dans cellule paire alors modifications des deux cellules"60et61"(identique)
    si clic dans cellule impaire alors aucune modifications des deux cellules "60et61".
    3eme modification:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("F60").FormulaLocal = "=sommeprod((mod(ligne(F10:F58);2)<>0)*(F11:F59<>0)*1)"
        Range("F61").FormulaLocal = "=sommeprod((mod(ligne(F11:F59);2)<>0)*(F10:F58<>0)*1)"
    -->résultat:si clic dans cellule paire alors modifications des deux cellules"60et61"(identique)
    si clic dans cellule impaire alors aucune modifications des deux cellules "60et61".
    4eme modification:
    Range("F60").FormulaLocal = "=sommeprod((mod(ligne(F10:F58);2)<>0)*(F11:F59<>0)*1)"
    Range("F61").FormulaLocal = "=sommeprod((mod(ligne(F11:F59);2)<>0)*(F11:F59<>0)*1)"
    -->resultat:fonctionne mais perte de la cellule"F10".
    5eme modification:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("F60").FormulaLocal = "=sommeprod((mod(ligne(F8:F58);2)<>0)*(F9:F59<>0)*1)"
        Range("F61").FormulaLocal = "=sommeprod((mod(ligne(F9:F59);2)<>0)*(F9:F59<>0)*1)"
    -->fonctionne mais la cellule "F61" a 1 de base car la cellule "F9" n'est pas vide("F9"="E").
    6eme modification:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("F60").FormulaLocal = "=sommeprod((mod(ligne(F8:F58);2)<>0)*(F9:F59<>0)*1)"
        Range("F61").FormulaLocal = "=sommeprod((mod(ligne(F9:F59);2)<>0)*(F9:F59<>0)*1)-1"
    -->fonctionne même si c'est pas très "propre".

    Conclusion: A ne rien y comprendre....
    A s'en arracher les cheveux !!!

    Dans tous les cas, merci pour ce code qui fonctionne (finalement ).
    n.b:je serais quand même curieux de savoir pourquoi c'etait aussi "bizarre"...

    Amicalement

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 71
    Par défaut
    Désolé pour le doublon,

    Précision:
    Je ne considère pas ce topic comme résolu car j'aimerais connaitre la raison de ce problème.

    Merci

    Amicalement

    Manu

  12. #12
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("F60").FormulaLocal = "=sommeprod((mod(ligne(F10:F59);2)=0)*(F10:F58<>0)*1)"
       Range("F61").FormulaLocal = "=sommeprod((mod(ligne(F10:F59);2)<>0)*(F11:F59<>0)*1)"
    l'une pour les lignes paires mod(ligne(F10:F59);2)=0, l'autre impaires mod(ligne(F10:F59);2)<>0

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 71
    Par défaut
    Re,

    Je comprends maintenant.
    ça me rassure car je trouvais ça vraiment "bizarre".

    Conclusion: J'avais mal compris le fonctionnement de cette fonction...

    Bref, merci pour cette explication (une fois de plus...), je vais donc appliquer les modifs à mon code.

    Merci encore...

    Amicalement

    Manu

    n.b: je considère donc ce topique comme "résolu" (une fois de plus grâce a tes interventions...!! )

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

Discussions similaires

  1. [XL-2003] Macro de suppression de ligne avec un mot
    Par harisman87 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/07/2010, 16h50
  2. valeur MIN mais avec condition "pair" ou "impaire"
    Par litacan dans le forum Excel
    Réponses: 2
    Dernier message: 31/10/2009, 11h09
  3. [WD10] Couleur ligne pair et impair etat
    Par nitish dans le forum WinDev
    Réponses: 10
    Dernier message: 09/06/2009, 11h31
  4. Réponses: 3
    Dernier message: 10/04/2007, 18h09
  5. récupérer que les lignes paires ou impairs d'une proc ,?
    Par c_moi_c_moi dans le forum Oracle
    Réponses: 5
    Dernier message: 16/11/2005, 18h03

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