Aide projet VBA

Bonsoir,

J’aurais besoin de votre aide s’il vous plaît. J’ai un projet en VBA à rendre la semaine prochaine (au plus tard dans deux semaines), mais je suis complètement perdu, car j’ai beaucoup de difficultés dans cette matière et je ne sais pas du tout comment programmer en VBA.

Dans un premier temps, je dois choisir une idée de projet à réaliser en VBA. J’avais pensé à créer une interface simple dans Excel : lorsqu’on ouvre le fichier, une zone de texte s’affiche. On y renseigne un prix, puis en cliquant sur "Entrée", le programme affiche toutes les bières disponibles à ce prix-là, avec le pourcentage d’alcool pour chacune, ainsi que le nombre de verres que l’on peut acheter avec la somme entrée au début. Je vous en suplis svp de m'aider a réaliser se projet.

Bonjour et bienvenue sur le forum,

Pour commencer, il faut bien définir le problème : si on n'entre que 1 donnée (l'argent disponible), alors on risque d'avoir beaucoup de bières disponibles… On pourrait aussi entrer 2 données : le nombre de verres désirés et l'argent total disponible… Pour l'instant je continue avec votre problème initial (1 donnée).

Ensuite, il va falloir créer une petite "base de données" dans votre fichier Excel :

Faites un tableau comme celui-ci et remplissez-le.

Nom bière

Alcool %

Prix (1 verre)

Biere1

5

4,5

Quand c'est fait, veuillez joindre votre fichier si vous voulez une solution. Si vous voulez de l'aide, voilà comment j'organiserai mon code :

Je ferai une fonction qui lit la base de données ligne par ligne. Elle regarde pour chaque bière son prix : si il est inférieur ou égale à l'argent disponible, alors on peut l'acheter. Dans ce cas on calcule combien de verres on peut acheter avec notre somme. On sauvegarde notre résultat dans notre liste de "bières achetables". Sinon, la bière coute trop cher et on passe à la suivante.

Ensuite, il suffit de lire le tableau contenant les bières achetables, et de l'afficher.

Bonjour,

J’ai créé un fichier Excel contenant une sélection de 50

bières. Pour chaque bière, j’ai renseigné trois informations :

  • nom
  • % d'alcool
  • Prix de la pinte en euro

Mon objectif est d’aller un peu plus loin que cette simple liste :
J'aimerais qu'un utilisateur puisse saisir le montant qu’il souhaite dépenser (par exemple 20 €), et que le fichier affiche automatiquement, dans un tableau dédié, les bières qu’il peut acheter avec ce budget.

Le tableau de résultat devra afficher, pour chaque bière :

  • nom
  • % d'alcool
  • Prix de la pinte en euro
  • combien de fois il pourras prendre cette bière avec le budget

Mais dans l’idée, j’imaginais que lorsqu’on ouvre le fichier Excel, une interface s’affiche automatiquement pour demander à l’utilisateur de renseigner son budget.

Une fois le montant confirmé, un tableau s’afficherait alors, comme décrit précédemment.

merci de l'aide.

Bien, Clément tu trouveras ci-joint une proposition. Je n'ai aucune idée de ton niveau en VBA ni de l'objectif de ton exercice. J'ai donc commenté le code et j'ai essayé d'utiliser une résolution de "débutant" car il existe dans Excel des moyens plus rapides pour réaliser ton objectif. Cependant ça m'étonnerait que ce soit l'objectif de l'exercice.

Le code est peut-être complexe à première vue, pour comprendre : tu pars du code qui se trouve dans "ThisWorkbook" => il appelle AskAmount et WriteBierTableTo du module "interface". Ces fonctions font ensuite appel à d'autres fonctions situées dans le module "calcul". J'ai fait cela afin de bien séparer la "logique de résolution" qui se trouve dans "Calcul" de "l'interface utilisateur" qui se trouve dans "Interface".

Pense à autoriser les macros si elles sont bloquées. Si il ne se passe rien à la 1e ouverture c'est parce que les macros ont été bloquées. Autorise-les, sauvegarde, ferme et réouvre (ou lance le Sub Test du module Interface).

Code utilisé :

' Calcul.bas
' ==================
Option Explicit
Option Base 0

' Tableau bieres
' [Nom, %, €, qte]

' renvoie le tableau des bieres avec la nouvelle colonne comportant la quatite de pintes
Public Function GetOutputTable(montantTotal As Double) As Variant
  ' creation du nouveau tableau
  Dim outTbl As Variant
  ReDim outTbl(0 To 3, 0 To 0)
  outTbl(0, 0) = "Nom": outTbl(1, 0) = "Alcool(%) ": outTbl(2, 0) = "Prix pinte (€) ": outTbl(3, 0) = "Nb. pintes"

  ' tableau de base de donnees
  Dim baseTbl As Variant
  baseTbl = FeuilBDD.ListObjects(1).DataBodyRange.Value

  ' parcours des bieres et ajout si achat possible
  Dim i As Long, nbPintesI As Long
  For i = LBound(baseTbl, 1) To UBound(baseTbl, 1)
    nbPintesI = NbPintes(montantTotal, baseTbl(i, 3))
    If nbPintesI > 0 Then
      AddRowTo outTbl, baseTbl(i, 1), baseTbl(i, 2), baseTbl(i, 3), nbPintesI
    End If
  Next i

  ' renvoi
  GetOutputTable = WorksheetFunction.Transpose(outTbl)
End Function

Private Sub AddRowTo(ByRef tbl As Variant, ParamArray rowParams() As Variant)
  ' verification des infos données
  If UBound(rowParams) <> UBound(tbl, 1) Or LBound(rowParams) <> LBound(tbl, 1) Then
    MsgBox "Tableaux non compatibles !", vbCritical, "ERREUR"
    Exit Sub
  End If

  ' ajout de 1 nouvelle "ligne" a tbl (en realite c'est une colonne mais c'est une limitation vba)
  ReDim Preserve tbl(LBound(tbl, 1) To UBound(tbl, 1), LBound(tbl, 2) To UBound(tbl, 2) + 1)

  ' index de la nouvelle ligne
  Dim lastIndex As Long: lastIndex = UBound(tbl, 2)

  ' remplissage
  Dim i As Long
  For i = LBound(tbl, 1) To UBound(tbl, 1)
    tbl(i, lastIndex) = rowParams(i)
  Next i
End Sub

' calcule le nombre de pintes pour un montant donné et un prix donné
Private Function NbPintes(ByVal montantTotal As Double, ByVal prixPinte As Double) As Long
  NbPintes = CLng(WorksheetFunction.RoundDown(montantTotal / prixPinte, 0))
End Function

' ==================
' Interface.bas
' ==================
Option Explicit

' fonction de test, pour simuler workbook_open
Private Sub test()
  Interface.WriteBierTableTo Sheet1, Interface.AskAmout
End Sub

' demande du montant a l'utilisateur
Public Function AskAmout() As Double
  Dim montant As Double, validation As Boolean
  Do
    ' demande du montant
    montant = Application.InputBox("Entrez le montant dont vous disposez (€) :", "Achat de bières", 0, Type:=1)
    ' verification
    If montant >= WorksheetFunction.Min(FeuilBDD.ListObjects(1).ListColumns(3).DataBodyRange) Then
      validation = True
    Else
      If MsgBox("Aucune bière à ce prix, annulez ou entrez un montant plus important", _
        vbExclamation + vbRetryCancel, _
        "Saisie incorrecte") = vbRetry Then
        validation = False
        Else
        validation = True
      End If
  End If
  Loop Until validation

  ' si l'utilisation a rentré un montant trop petit, on le remplace par 0
  ' cela sera utile dans WriteBierTableTo pour éviter des erreurs de tableau vide
  If validation Then
    AskAmout = montant
  Else
    AskAmout = 0#
  End If
End Function

' ecriture du tableau des resultats dans la feuille donnee (en A1)
Public Sub WriteBierTableTo(destination As Worksheet, amount As Double)
  ' verification que le montant donné est valide
  If amount <= 0# Then Exit Sub

  ' calcul de la table a exporter
  Dim outputTable As Variant
  outputTable = Calcul.GetOutputTable(amount)

  With destination
    ' nettoyage feuille destination
    .Range("A1").CurrentRegion.ClearContents

    With .Range("A1").Resize(UBound(outputTable, 1), UBound(outputTable, 2))
      ' ecriture des resultats
      .Value = outputTable
      ' conversion en tableau
      destination.ListObjects.Add xlSrcRange, .Cells, , xlYes
      .Columns.AutoFit
    End With
    ' affichage
    .Activate

    ' ecriture du montant entré
    With .Range("F1:H1")
      .Value = Array("Montant disponible :", amount, "€")
      .Columns.AutoFit
    End With
  End With
End Sub

désoler d'avoir répondu aussi tard, en gros ca doit être fait avec les icone comme celle la sur vba.

capture d ecran 2025 06 12 191027

C'est ce que notre prof nous demande d'utiliser pour créer une meilleure interface, et pour que, dès qu'on lance Excel, les différentes icônes apparaissent automatiquement.

Avec cet outil, je pensais qu'on pourrait avoir une icône, comme celle que tu as créée, mais en VBA avec les icônes de VBA. En cliquant dessus, une boîte de dialogue demanderait le budget. Ensuite, une zone de texte en dessous afficherait les bières disponibles à ce prix, avec aussi des infos comme le pourcentage d'alcool, le prix, et le nombre de pintes qu’on peut acheter.

image 2025 06 12 191606665

???

Hello,

Aller une proposition

@+

14test-bieres.xlsm (28.19 Ko)

bonsoir.

merci pour votre aide c'est super c'est a peut prêt comme je voulais merci.

bonne soirée

Merci pour le retour

Il y aurait juste un dernier point : ce serait bien que, lorsque l'on ouvre le fichier Excel, l'icône 'Rentrer votre budget' apparaisse automatiquement, sans avoir besoin de cliquer dessus.

Bonjour à tous,

@daxou, un conseil si vous voulez progresser en programmation c'est d'utiliser les outils à votre disposition. Un moteur de recherche vous fournira énormément de réponses : si vous cherchez "VBA lancer macro ouverture fichier" vous aurez immédiatement la solution.

Je vous la donne ci-après pour cette fois, mais de manière générale faire vous-même une petite recherche prendra moins de temps + vous l'ajouterez à votre bagage.

Dans le code de ThisWorkbook, ajoutez ceci :

Private Sub Workbook_Open()
  LancerProposition ' ou l'autre macro de baroute selon l'UF que vous voulez afficher
End Sub

cf. Événement Workbook.Open (Excel) | Microsoft Learn

Bonne journée

Rechercher des sujets similaires à "aide projet vba"