1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    10 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 10 677
    Points : 15 995
    Points
    15 995

    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 éclairé

    Homme Profil pro
    Inscrit en
    novembre 2013
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : novembre 2013
    Messages : 459
    Points : 716
    Points
    716

    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
    Expert éminent
    Homme Profil pro
    aucune
    Inscrit en
    avril 2016
    Messages
    4 529
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : avril 2016
    Messages : 4 529
    Points : 7 917
    Points
    7 917

    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.

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

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : juin 2007
    Messages : 8 123
    Points : 14 819
    Points
    14 819

    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
    10 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 10 677
    Points : 15 995
    Points
    15 995

    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
    10 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 10 677
    Points : 15 995
    Points
    15 995

    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
    Expert éminent
    Homme Profil pro
    aucune
    Inscrit en
    avril 2016
    Messages
    4 529
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : avril 2016
    Messages : 4 529
    Points : 7 917
    Points
    7 917

    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.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    septembre 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2012
    Messages : 26
    Points : 33
    Points
    33

    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
    10 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 10 677
    Points : 15 995
    Points
    15 995

    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, 17h14
  2. Problème avec la formule Somme.Si.Ens
    Par iamjamal dans le forum Excel
    Réponses: 11
    Dernier message: 14/01/2015, 04h51
  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, 01h24
  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, 11h20
  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, 19h01

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