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

Excel Discussion :

SOMME.Si.ENS, SumIfs en VBA et problème de langue. [XL-2010]


Sujet :

Excel

  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut SOMME.Si.ENS, SumIfs en VBA et problème de langue.
    Bonjour à toutes et à tous.

    J'ai enrichi SOMME.SI.ENS avec une fonction VBA pour permettre de faire l'addition de plusieurs colonnes mais avec des zones de critères avec une seule colonne.
    En standard SOMME.Si.ENS retourne .#VALEUR# dans ce cas.

    Ici le code de ma fonction :

    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
    Public Function Mon_Somme_Si_Ens( _
                        prmZoneSomme As Range, prmZoneCritere01 As Range, prmCritere01 As Variant, _
                        Optional prmZoneCritere02 As Variant, Optional prmCritere02 As Variant, Optional prmZoneCritere03 As Variant, Optional prmCritere03 As Variant, Optional prmZoneCritere04 As Variant, Optional prmCritere04 As Variant, Optional prmZoneCritere05 As Variant, Optional prmCritere05 As Variant, Optional prmZoneCritere06 As Variant, Optional prmCritere06 As Variant, _
                        Optional prmZoneCritere07 As Variant, Optional prmCritere07 As Variant, Optional prmZoneCritere08 As Variant, Optional prmCritere08 As Variant, Optional prmZoneCritere09 As Variant, Optional prmCritere09 As Variant, Optional prmZoneCritere10 As Variant, Optional prmCritere10 As Variant, Optional prmZoneCritere11 As Variant, Optional prmCritere11 As Variant, _
                        Optional prmZoneCritere12 As Variant, Optional prmCritere12 As Variant, Optional prmZoneCritere13 As Variant, Optional prmCritere13 As Variant, Optional prmZoneCritere14 As Variant, Optional prmCritere14 As Variant) As Double
        'Fait un somme.si.ens sur plusieurs colonnes avec un test sur une seule colonne
        Dim result As Double: result = 0
     
        Dim ligne As Range
        Dim colonne As Range
     
        For Each colonne In prmZoneSomme.Columns
            result = result + Application.WorksheetFunction.SumIfs( _
                                    colonne, prmZoneCritere01, prmCritere01, _
                                    prmZoneCritere02, prmCritere02, prmZoneCritere03, prmCritere03, prmZoneCritere04, prmCritere04, prmZoneCritere05, prmCritere05, prmZoneCritere06, prmCritere06, _
                                    prmZoneCritere07, prmCritere07, prmZoneCritere08, prmCritere08, prmZoneCritere09, prmCritere09, prmZoneCritere10, prmCritere10, prmZoneCritere11, prmCritere11, _
                                    prmZoneCritere12, prmCritere12, prmZoneCritere13, prmCritere13, prmZoneCritere14, prmCritere14)
        Next colonne
     
        Mon_Somme_Si_Ens = result
    End Function
    C'est simple wrappeur sur SumIfs.

    Mon problème vient de ce que l'un de mes critères est "=VRAI" or quand on passe par VBA il faut mettre "=TRUE" à la place :-( ce qui n'est pas évident pour un utilisateur ordinaire.
    De plus, je soupçonne que si j'avais utilisé une fonction de calcul, il aurait aussi fallu lui mettre son non anglais.

    Existe-t-il un moyen simple de dire à Excel d'utiliser la langue courante comme la propriété .FormulaLocal des Ranges ?

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  2. #2
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 670
    Points : 2 489
    Points
    2 489
    Par défaut
    Bonjour, à ma connaissance ce moyen n'existe pas dans ce contexte. J'ai eu le même problème dans Access que j'ai dû résoudre en passant par des variables intermédiaires de type "boolean" (traduire VRAI en TRUE à chaque passage dans la boucle).

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Je ne parviens pas à bien deviner dans quel contexte interviennent les utilisateurs (saisie de VRAI)
    Quoiqu'il en soit : je ne rencontre pas ton problème avec des VRAI en cellules et un True en critère en VBA
    Par exemple : ceci en VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.WorksheetFunction.SumIfs([A1:A3], [B1:B3], True)
    me retourne exactement la même valeur que ce que me retourne cette formule mise sous Excel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMME.SI.ENS(A1:A3;B1:B3;VRAI)
    et ceci : que une/des cellule(s) de la plage B1:B3 contiennent des VRAI saisis au clavier ou des VRAI/formule
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  4. #4
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Mon problème vient de ce que l'un de mes critères est "=VRAI"
    Essaye de remplacer "=VRAI" par VRAI() (sans guillemets).
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Désolé j'aurai du mettre en contexte.

    Ici l'usage que je fais de ma fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    =SI(CA$3<>"";
         Mon_Somme_Si_Ens(
             INDIRECT(NomFeuilleDonnees_MainOeuvre&"!"&ADRESSE(LIGNE(Donnees_MainOeuvre!$CB$28);COLONNE(Donnees_MainOeuvre!$CB$28)+(DATE(ANNEE(CA$3); MOIS(CA$3); 1)-DATE(ANNEE(CA$3);1;1)+1))&":"&ADRESSE(LIGNE(Donnees_MainOeuvre!$CB$49);COLONNE(Donnees_MainOeuvre!$CB$28)+(DATE(ANNEE(CA$4); MOIS(CA$4)+1; 0)-DATE(ANNEE(CA$4);1;1)+1)));
             Donnees_MainOeuvre!$N$28:$N$49;"=" & $B13;
             Donnees_MainOeuvre!$B$28:$B$49;"=TRUE";
             Donnees_MainOeuvre!$M$28:$M$49;"=" & $E13;
             Planification.xlsm!CodeLigne_Calendrier;"=NB_HEURE_QUOTIDIEN_SIGNE");
         "")
    Comme on peut le voir sur la ligne 4, j'aurai aimé mettre =VRAI à la place de =TRUE.

    Menhir, je vais essayer et je te reviens.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Je viens de tester et le VRAI() ne résout pas le problème.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Ce qui était trompeur, était ta phrase :
    ce qui n'est pas évident pour un utilisateur ordinaire
    alors que, s'agissant là d'une instruction écrite en VBA, ce n'est par un "utilisateur", mais le développeur lui-même, qui est concerné.
    Oui, les instructions VBA sont en notation anglaise.
    Je note à ce propos que même tes ";" devraient alors être des ","
    Mais tu ne nous montres pas la totalité de cette égalité. Que précède exactement "=SI" de ton code (le dernier montré) ?

    Je ne comprends pas ...
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 213
    Points : 311
    Points
    311
    Par défaut booléens
    bonjour,
    Sugestion : Pour les valeurs booléennes il est possible de les remplacer par
    0 pour faux
    et
    1 pour Vrai. (Dans Access Vrai à pour équivalent -1)

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Citation Envoyé par unparia Voir le message
    Ce qui était trompeur, était ta phrase :

    alors que, s'agissant là d'une instruction écrite en VBA, ce n'est par un "utilisateur", mais le développeur lui-même, qui est concerné.
    Oui, les instructions VBA sont en notation anglaise.
    Je note à ce propos que même tes ";" devraient alors être des ","
    Mais tu ne nous montres pas la totalité de cette égalité. Que précède exactement "=SI" de ton code (le dernier montré) ?

    Je ne comprends pas ...
    Je n'ai pas été clair, désolé.

    J'ai créé une fonction VBA pour l'utiliser dans une formule Excel, elle même dans une cellule donc il n'y a rien avant le =SI() de la formule que j'ai postée.
    Et cette formule est visible par mon utilisateur qui pourrait vouloir s'en resservir.

    Citation Envoyé par SR.SFC
    Suggestion : Pour les valeurs booléennes il est possible de les remplacer par
    0 pour faux
    et
    1 pour Vrai. (Dans Access Vrai à pour équivalent -1)
    Oui, je me doutais qu'on pouvait faire quelque chose comme cela mais je n'aime pas trop le "Magic Number". Mes formules sont déjà assez compliquées à comprendre comme cela.

    Je vous remercie tous de votre aide, je vais documenter ma fonction pour spécifier clairement que si on veut tester un booléen, il faut mettre =TRUE.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

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

Discussions similaires

  1. [XL-2010] VBA : Problème SOMME.SI.ENS
    Par elikoptair dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 31/05/2017, 16h14
  2. Problème avec la formule Somme.Si.Ens
    Par iamjamal dans le forum Excel
    Réponses: 11
    Dernier message: 14/01/2015, 03h51
  3. probléme macro somme.if.ens et nb.si.ens
    Par AMEDDO79 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 31/05/2014, 00h24
  4. [XL-2007] Fonction somme.si.ens (VBA)
    Par ARTETA13 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/02/2013, 10h20
  5. [XL-2010] Somme si ens en vba
    Par tompom3108 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 31/05/2012, 18h01

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