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 :

[Debutant] somme.si perso avec de multiples criteres dans une cellule (split et find avec iteration for)


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 4
    Par défaut [Debutant] somme.si perso avec de multiples criteres dans une cellule (split et find avec iteration for)
    "Bonjour"

    je cherche a effectuer une somme si en prenant comme criteres les occurences contenus dans une chaine de caractaire d'une cellule, la fonction est censee de separer la chaine (split) puis effectuer une sorte de recherchev avec chaque resultat dans une plage definie et de renvyer une valeur d'une colonne decalee, chaque valeur doit etre additionee a la precedente etc (d'ou cette appelation somme si)

    voici le code
    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
     
    Function sumifauto(x As String)
     
    Dim a() As Variant
    Dim b As Single
    Dim c As Long
    Dim i As Single
     
    x = Application.Trim(x)
    a() = Split(x, ",")
    b = 0
    For c = 0 To UBound(a)
    b = b + Application.Find(What:=a(c), After:=Feuil4.Cells(3, 1) _
    , LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, _
    SearchDirection:=xlNext, MatchCase:=True).Offset(0, 1).Value
    Next c
    sumifauto = b
     
    End Function
    j'ai essayé egalement avec un application.worksheetfunction.vlookup mais ca ne marche pas non plus

    le resultat le plus probant que j'ai pu obtenir (un chiffre et non une erreur) avait été produit par un code a double boucle :
    - for pour l'iteration des chaines splittés
    - do loop+commande d'arret avec une sorte de comparaison linéaire et un renvoi, une alternative plutot lourde a find ou vlookup, qui comprenait une addition de stockage b=b+resultat renvoyé ( pour la somme des resultats renvoyés)
    Le truc est que ce code ne voulait pas stocker et additionner les resultats mais renvoyais un resultat (le premier ou dernier).

    J'attends une reponse avec impatiance

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Par défaut
    Bonsoir

    je verrais plutôt ça comme ça

    a adapter
    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
    25
    Function sumifauto(x As String)
     
    Dim a() As Variant
    Dim b As Long 's'il s'agit d'ajouter des entier
    Dim c As Long
    Dim i As Single
    Dim plage As Range, rngF As Range
    'remplir le tableau
    a() = Split(x, ",")
    b = 0
    'Définir la plage ou chercher
    Set plage = Worksheets("Feuil4").Range("A3:G25") 'A adapter
    'boucle dans le tableau
    For c = LBound(a) To UBound(a)
      'cherche la valeur dans la plage
      Set rngF = plage.Find(What:=Trim(a(c)), LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
      'si une occurence à été trouvé
      If Not rngF Is Nothing Then
        si c 'est un chiffre on l'additionne
        If IsNumeric(rngF.Value) Then b = b + rngF.Value
      End If
    Next c
    sumifauto = CStr(b)
     
    End Function

  3. #3
    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
    Bonjour
    à Zyhak, le code proposé va sommer seulement la première occurrence trouvée de chaque élément du tableau a. (Corrige moi)
    faudra passer par boucle avec la méthode find, jumelée avec un test sur les doublons (si x=a,b,a; il va sommer a en double)
    une sumif fera l'affaire sur une collection des éléments de x séparés par la virgule.

  4. #4
    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 on fait ainsi, j'ai bon???

    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
    Function sumifauto(x As String)
     
    Dim a() As Variant
    Dim b As Single
    Dim c As Long
    Dim i As Single
    Dim plage As Range
     
    x = Application.Trim(x)
    a() = Split(x, ",")
    b = 0
    Set plage = Cells   'la plage de cllule a évaluer
    For Each c In a
        b = b + Application.WorksheetFunction.SumIf(plage, c)
    Next c
    sumifauto = b
     
    End Function

  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
    Sumif a 3 argument, non?

  6. #6
    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
    euh oui et non, si l'on omet le troisième, il va faire la somme sur le premier

  7. #7
    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
    Une proposition
    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
    25
    26
    27
    28
    29
    Function SumIfAuto(Rng As Range, x As String, ofst As Integer) As Double
    'Rng: Plage de compraison
    'x: Mot à comparer
    'ofst: décalage par rapport de Rng de la plage à sommer
    Dim T
    Dim S As Double
    Dim c As New Collection
    Dim i As Integer
     
    Application.Volatile
    If Rng.Columns.Count = 1 And Len(x) > 0 Then
        T = Split(Trim(x), ",")
        If UBound(T) > 0 Then
            For i = LBound(T) To UBound(T)
                On Error Resume Next
                    c.Add T(i), CStr(T(i))
                On Error GoTo 0
            Next i
        Else
            c.Add x, CStr(x)
        End If
     
        For i = 1 To c.Count
            S = S + Application.WorksheetFunction.SumIf(Rng, c(i), Rng.Offset(0, ofst))
        Next i
    End If
    SumIfAuto = S
     
    End Function
    par exemple en D1 ona X,YY,X,Y
    en E1: =SumIfAuto(A4:A100;D1;6)

    le résultat attendu, la somme de G6:G100 répondant au critère

Discussions similaires

  1. [XL-2010] Insérer bouton dans une cellule et lancer macro avec l'adresse de la cellule
    Par Phifou dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/02/2014, 10h43
  2. [AC-2007] Requete avec choix des criteres dans un formulaire
    Par Tinien dans le forum Access
    Réponses: 1
    Dernier message: 16/07/2009, 09h54
  3. Probleme avec critere dans une requete sur access..
    Par emirov dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 05/04/2008, 23h11
  4. [VB6] Problème avec la touche 0 dans une MaskEdBox
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 02/03/2006, 09h47
  5. [html] insertion d 1 image dans une cellule avec taille en %
    Par hijodelanoche dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 19/01/2006, 00h50

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