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 :

VBA calculer prix d'un éléments à plusieurs valeurs


Sujet :

Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 15
    Points : 9
    Points
    9
    Par défaut VBA calculer prix d'un éléments à plusieurs valeurs
    Bonjour à tous,
    Je travaille en VBA sur un document excel de gestion d'un restaurant.
    Un formulaire me permet de créer des recettes, qui se repportent sur un tableau dans une feuille "feuil1"
    en colonne A se trouve le nom de la recette,
    en colonne B le nom des ingrédients, ex B1 : ingrédient 1, B2 : ingrédient 2 etc...
    en colonne C se trouve la quantité de chaque ingrédients
    en colonne D se trouve le prix de chaque ingrédients

    exemple :
    A B C
    Recette 1 ingrédient1 quantité1
    Recette 1 ingrédient2 quantité2
    Recette 1 ingrédient3 quantité3
    Recette 2 ingrédient 4 quantité4

    Sur une autre feuille "feuil2" se trouve une liste de recette accessible depuis la userform grâce à une combobox.
    en colonne A le nom de la recette
    en colonne B le prix de la recette

    Je voudrais pouvoir calculer le prix total par recette faire la somme de tous les éléments "feuil1" C donc la valeur en colonne A est "recette1" soit par VBA soit par rechercheV (ou par un autre moyen si vous connaissez).

    Pourriez vous m'aider ?

    Merci d'avance !

    ps : si vous souhaitez avoir accès au fichier pour une meilleure compréhension, prévenez moi !

  2. #2
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Bonjour misterW,

    Ci-dessous, je te propose une macro qui parcours une "Feuil4" dans laquelle tu as tes recettes, ingrédients et prix séparés.
    Elle va te remplir une "Feuil5" dans laquelle tu auras l'ensemble de tes recettes avec le total du prix à côté.
    Je te laisse 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    Option Explicit
     
    Sub misterW()
    Dim oTabl() As String
    Dim oDim As Integer
    Dim oBool As Boolean
    Dim oRng As Range, oCell As Range
    Dim i As Integer, j As Integer
    Dim oFin As Range
    Dim Val As Single
     
     
    With Worksheets("Feuil4")
        oDim = 1
        ReDim oTabl(1 To oDim)
        Set oRng = .Range("A1")
        For i = 1 To .Columns(1).Find("*", , , , , xlPrevious).Row - 1
            oBool = True
            For j = LBound(oTabl) To UBound(oTabl)
                If oRng.Offset(i, 0) = oTabl(j) Then
                    oBool = False
                End If
            Next j
     
            If oBool Then
                ReDim Preserve oTabl(1 To oDim)
                oTabl(oDim) = oRng.Offset(i, 0)
                oDim = oDim + 1
            End If
        Next i
     
        Set oFin = Worksheets("Feuil5").Range("A1")
        For j = LBound(oTabl) To UBound(oTabl)
            Val = 0
            Set oRng = FindAll(oTabl(j), .Columns(1), xlFormulas, xlWhole)
     
            For Each oCell In oRng
                Val = Val + oCell.Offset(0, 1) * oCell.Offset(0, 2)
            Next oCell
     
            With Worksheets("Feuil5")
                oFin.Offset(j, 0) = oTabl(j)
                oFin.Offset(j, 1) = Val
            End With
        Next j
    End With
     
    End Sub
     
    Function FindAll(What, Optional SearchWhat As Variant, _
            Optional LookIn, _
            Optional LookAt, _
            Optional SearchOrder, _
            Optional SearchDirection As XlSearchDirection = xlNext, _
            Optional MatchCase As Boolean = False, _
            Optional MatchByte, _
            Optional SearchFormat) As Range
        'LookIn can be xlValues or xlFormulas, _
         LookAt can be xlWhole or xlPart, _
         SearchOrder can be xlByRows or xlByColumns, _
         SearchDirection can be xlNext, xlPrevious, _
         MatchCase, MatchByte, and SearchFormat can be True or False. _
         Before using SearchFormat = True, specify the appropriate settings _
         for the Application.FindFormat object, e.g., _
         Application.FindFormat.NumberFormat = "General;-General;""-"""
        Dim aRng As Range
        If IsMissing(SearchWhat) Then
            On Error Resume Next
            Set aRng = ActiveSheet.UsedRange
            On Error GoTo 0
        ElseIf TypeOf SearchWhat Is Range Then
            If SearchWhat.Cells.Count = 1 Then
                Set aRng = SearchWhat.Parent.UsedRange
            Else
                Set aRng = SearchWhat
                End If
        ElseIf TypeOf SearchWhat Is Worksheet Then
            Set aRng = SearchWhat.UsedRange
        Else
            Exit Function                       '*****
            End If
        If aRng Is Nothing Then Exit Function   '*****
        Dim FirstCell As Range, CurrCell As Range
        With aRng.Areas(aRng.Areas.Count)
        Set FirstCell = .Cells(.Cells.Count)
            'This little 'dance' ensures we get the first matching _
             cell in the range first
            End With
        Set FirstCell = aRng.Find(What:=What, After:=FirstCell, _
            LookIn:=LookIn, LookAt:=LookAt, _
            SearchDirection:=SearchDirection, MatchCase:=MatchCase, _
            MatchByte:=MatchByte, SearchFormat:=SearchFormat)
        If FirstCell Is Nothing Then Exit Function          '*****
        Set CurrCell = FirstCell
        Set FindAll = CurrCell
        Do
            Set FindAll = Application.Union(FindAll, CurrCell)
            'Setting FindAll at the top of the loop ensures _
             the result is arranged in the same sequence as _
             the  matching cells; the duplicate assignment of _
             the first matching cell to FindAll being a small _
             price to pay for the ordered result
            Set CurrCell = aRng.Find(What:=What, After:=CurrCell, _
                LookIn:=LookIn, LookAt:=LookAt, _
                SearchDirection:=SearchDirection, MatchCase:=MatchCase, _
                MatchByte:=MatchByte, SearchFormat:=SearchFormat)
            'FindNext is not reliable because it ignores the FindFormat settings
        Loop Until CurrCell.Address = FirstCell.Address
    End Function
    Pour info, j'utilise la fonction "FindAll" disponible sur internet.

    N'hésite pas à revenir vers moi !

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Ok super Kimy, je décrypte ça, j'essaye de le refaire et je te dis si ça marche ! hahaha

    Merci beaucoup !

  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
    Est-ce que le prix doit être multiplié par la quantité ?

    Si ce n'est pas le cas (en supposant que le titre de la recette est en A1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMME.SI(feuil1!A1:A4;A1;feuil1!D1:D4)
    .
    Si c'est le cas, (en supposant que le titre de la recette est en A1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMME(SI(feuil1!A1:A4=A1;feuil1!C1:C4*feuil1!D1:D4;0))
    A valider comme une fonction matricielle avec Ctrl + Shift + Entrée
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Bonsoir, j'ai utilisé la technique de Kimy en la simplifiant et en me renseignant sur la technique de Kimy.

    Merci de votre aide les gars !

  6. #6
    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
    L'avantage de ma méthode, c'est qu'elle est dynamique : tout changement dans le tableau source (et le prix des ingrédients change en permanence) est immédiatement pris en compte dans le tableau destination.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Ah d'accord merci Menhir, j'avais pas pensé à ça.

    Et y a t-il une formule du même type sans passer par la VBA ? une sorte de rechercheV pour plusieurs éléments ?

    Merci !

  8. #8
    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
    La méthode que je t'ai donnée n'utilise pas de VBA.

    Cela dit, à ta place, je ne mettrais pas les prix à côté des ingrédients. Ou, plus exactement, je ne les saisirais pas à cet endroit.
    Je ferais une table supplémentaire d'ingrédients avec leurs prix (à l'unité, au kg, au litre, etc.).
    Et dans la colonne D de ta table, je mettrais une RECHERCHEV pour retrouver ce prix.
    Comme ça, si tu changes le prix d'un ingrédient, c'est toutes les recettes avec cet ingrédient qui auront leur prix modifié, en ayant besoin de ne le saisir qu'une fois.
    Et j'en profiterai pour mettre en colonne B des liste déroulantes sur le choix de l'ingrédient. Comme ça, en plus, tu éviteras les fautes de frappe.
    Tout ça ne prendra qu'une minute à mettre en place mais pourra par la suite te faire gagner beaucoup de temps et éviter des erreurs.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    J'ai utilisé la fonction "somme si" Menhir. Ca marche très bien, merci beaucoup !

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/06/2011, 13h54
  2. Fonctions en VBA à plusieurs valeurs de sortie
    Par tibaou dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/06/2011, 19h59
  3. Mapper BPEL Glassfish : ajouter plusieurs valeurs pour un élément.
    Par acromath dans le forum Glassfish et Payara
    Réponses: 0
    Dernier message: 19/07/2010, 13h04
  4. Réponses: 1
    Dernier message: 19/07/2010, 11h46
  5. Calcul du maximum entre plusieurs valeurs
    Par gastaman dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 27/11/2006, 11h07

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