RECETTES de CUISINE gérées sous EXCEL
Il s'agit tout simplement de pouvoir gérer, consulter, modifier vos propres recettes de cuisine par l’intermédiaire d'Excel et tout ceci à l'aide d'un formulaire dont les principes de base ont été évoqués sur ce blog.
Donc si vous le souhaitez, nous allons créer ce fichier pas à pas.
Créez un dossier sur votre bureau ou dans répertoire de votre ordinateur que vous nommerez comme bon vous semble (Ex. Mes recettes)
Dans ce même dossier créez un sous dossier nommé "IMAGES"
Cliquez sur le lien ci-dessous pour télécharger un fichier excel qui va nous servir de base de travail.
FICHIER DE BASE de travail. (Disponible en cliquant sur ce lien)
Dans ce fichier Excel nous avons deux onglets :
a) "RECETTES" composé d'une liste de recettes qui va dans le temps au fil devenir assez importante en fonction des créations et/ou modifications.
b) "LISTE" composé d'informations qui nous seront utiles plus tard pour la composition de notre formulaire d'accès aux recettes.
CONSTRUCTION DU FORMULAIRE
Pour accéder au projet - VBAProject, cliquez simultanément sur Alt + f11
Cet écran apparaît :
Nous allons maintenant insérer un Userform, via le menu Insertion et ensuite Userform, ce qui vous donneras ceci :
Nommez vos Userform1 respectivement dans Caption GESTION DES RECETTES
Maintenant insérez (comme expliquez "Créer dans son formulaire" dans le présent blog) :
* Deux ComboBox
* Dix TextBox
* Trois CommandButton
* Treize Label
avec la Boîte à outils :
Nommez vos Label respectivement dans Caption :
* SELECTION DE LA RECETTE => Label1
* Label2 => Pas de caption
* Type de plat : => Label3
* Nombre de personne : => Label4
* Coût : => Label5
* Temps de préparation : => Label6
* Temps de cuisson : => Label7
* Conseil VIN : => Label8
* INGREDIENTS : => Label9
* PREPARATION : => Label10
* Mes observations : => Label11
* Remarque(s) : => Label12
* Historique invités : => Label7
Nommez vos CommandButton respectivement dans Caption :
* QUITTER => CommandButton1
* Modifier ou insérer des annotations => CommandButton2
* Nouvelle RECETTE => CommandButton3
* Insérer RECETTE => CommandButton4
* Pas de caption => CommandButton5
* Pas de caption => CommandButton6
Puis pour terminer insérez 2 blocs IMAGES de la manière suivante :
* Image1
* Image2
Et disposez l'ensemble des éléments comme ceci comme ceci, si possible ou suivant votre idée de visualisation de votre formulaire.
Mainteant téléchargez ces six images :
DIFFICILE
MOYEN
FACILE
TIRAMISU
MADELEINE AU MIEL
INEXISTANTE
A ce stade créez un dossier sur votre ordinateur et ajoutez-y votre fichier Excel et toutes les images.
Ce sera plus facile pour la programmation car tous les éléments seront dans le même dossier donc un chemin identique.
PROGRAMMATION DU FORMULAIRE
Accédez au projet - VBAProject, cliquez simultanément sur Alt + f11
Cliquez deux fois sur le formulaire et ajoutez le code suivant dans un premier temps
Option Explicit
Dim Ws As Worksheet
Dim NbLignes As Integer
Private Sub UserForm_Initialize()
Set Ws = Worksheets("RECETTES")
NbLignes = Ws.Range("A65536").End(xlUp).Row
With Me.ComboBox2
.ColumnCount = 2
.ColumnWidths = "-1;0"
End With
InitCombo1 'Lance le programme InitCombo1 développé ci-desous
End Sub
A savoir un choix dans la 1ère liste déroulante pour le type de choix de plat et ensuite le nom du plat.
Cela s'appelle un choix en "Cascade" mais faut-il encore rédiger la programmation.
Donc voici celle de la Combobox1 (A ajouter) :
Sub InitCombo1()
Dim J As Long
Dim Mondico As Object
Set Mondico = CreateObject("Scripting.dictionary")
For J = 2 To NbLignes
Mondico(Ws.Range("A" & J).Value) = ""
Next J
With Me.ComboBox1
.Clear
If Mondico.Count > 0 Then
.List = Application.Transpose(Mondico.keys)
End If
End With
End Sub
Private Sub ComboBox1_Change()
Dim J As Long
Nettoyage 'Lance le programme Nettoyage
Me.ComboBox2.Clear 'Efface les données de la combobox2
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
With Me.ComboBox2
For J = 2 To NbLignes
If Ws.Range("A" & J) = Me.ComboBox1 Then
.AddItem Ws.Range("B" & J)
.List(.ListCount - 1, 1) = J
End If
Next J
End With
End Sub
Après le choix dans la Combobox1 effectué, le programme liste toutes les données dans la combobox2 en fonction du critère choisi dans la Combobox1 (Exemple : Liste tous les "entrées froides" dans la Combobox2)
Dès lors que le choix s'effectue dans la Combobox2 (programme suivant : à ajouter), le formulaire se remplie en fonction du choix.
Private Sub ComboBox2_Change()
Dim Ligne As Long
Dim I As Integer
Nettoyage 'Lance le programme Nettoyage
If Me.ComboBox2.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox2.List(Me.ComboBox2.ListIndex, 1)
For I = 1 To 10
Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 2)
Next I
End Sub
Vous avez peut être remarque dans la programmation Combobox2_Change la phrase suivante :
Nettoyage
Ce mot "Nettoyage" va lancer la programmation suivante à savoir effacer toutes les données de toutes les texbox du formulaire.... cela évite d'énumérer ceci : Texbox1 ="" et ainsi de suite,
Cette programmation englobe toutes les textbox via le Me.Controls
'Programmation de Nettoyage en effaçant les données de toutes les textbox
Sub Nettoyage()
Dim I As Integer
For I = 1 To 10
Me.Controls("TextBox" & I) = ""
Next I
End Sub
On pourrait aussi programmer toutes les combobox soit Me.Controls("Combobox"&2) = "" mais là n'est pas le sujet mais simplement l'explication.
Donc déjà à ce stade vous pouvez déjà effectuer un tri entre tous les types de plat et choisir votre plat et les informations remontent dans le formulaire....
1) CommandButton1
2) CommandButton2
Le Label2 ne doit contenir aucun nom dans Caption
Ajoutez le texte suivant dans la programmation Private Sub ComboBox2_Change() : (Programmé précédemment)
Label2 = Textbox2
Et voici le résultat
Pour l'instant le formulaire fonctionne uniquement avec un fichier "pré-rempli", donc insérer des nouvelles recettes et aussi apporter des modifications à celles exisantes.
Puis pour terminer insérez 2 blocs IMAGES de la manière suivante :
* Image1
* Image2
Et disposez l'ensemble des éléments comme ceci comme ceci, si possible ou suivant votre idée de visualisation de votre formulaire.
Mainteant téléchargez ces six images :
DIFFICILE
MOYEN
FACILE
TIRAMISU
MADELEINE AU MIEL
INEXISTANTE
A ce stade créez un dossier sur votre ordinateur et ajoutez-y votre fichier Excel et toutes les images.
Ce sera plus facile pour la programmation car tous les éléments seront dans le même dossier donc un chemin identique.
PROGRAMMATION DU FORMULAIRE
Accédez au projet - VBAProject, cliquez simultanément sur Alt + f11
Cliquez deux fois sur le formulaire et ajoutez le code suivant dans un premier temps
Option Explicit
Dim Ws As Worksheet
Dim NbLignes As Integer
Private Sub UserForm_Initialize()
Set Ws = Worksheets("RECETTES")
NbLignes = Ws.Range("A65536").End(xlUp).Row
With Me.ComboBox2
.ColumnCount = 2
.ColumnWidths = "-1;0"
End With
InitCombo1 'Lance le programme InitCombo1 développé ci-desous
End Sub
PROGRAMATION des listes déroulantes (COMBOBOX)
Cette petite programmation va initialiser la programmation de recherche via deux listes déroulantes.
A savoir un choix dans la 1ère liste déroulante pour le type de choix de plat et ensuite le nom du plat.
Cela s'appelle un choix en "Cascade" mais faut-il encore rédiger la programmation.
Donc voici celle de la Combobox1 (A ajouter) :
Sub InitCombo1()
Dim J As Long
Dim Mondico As Object
Set Mondico = CreateObject("Scripting.dictionary")
For J = 2 To NbLignes
Mondico(Ws.Range("A" & J).Value) = ""
Next J
With Me.ComboBox1
.Clear
If Mondico.Count > 0 Then
.List = Application.Transpose(Mondico.keys)
End If
End With
End Sub
Private Sub ComboBox1_Change()
Dim J As Long
Nettoyage 'Lance le programme Nettoyage
Me.ComboBox2.Clear 'Efface les données de la combobox2
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
With Me.ComboBox2
For J = 2 To NbLignes
If Ws.Range("A" & J) = Me.ComboBox1 Then
.AddItem Ws.Range("B" & J)
.List(.ListCount - 1, 1) = J
End If
Next J
End With
End Sub
Après le choix dans la Combobox1 effectué, le programme liste toutes les données dans la combobox2 en fonction du critère choisi dans la Combobox1 (Exemple : Liste tous les "entrées froides" dans la Combobox2)
Dès lors que le choix s'effectue dans la Combobox2 (programme suivant : à ajouter), le formulaire se remplie en fonction du choix.
Private Sub ComboBox2_Change()
Dim Ligne As Long
Dim I As Integer
Nettoyage 'Lance le programme Nettoyage
If Me.ComboBox2.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox2.List(Me.ComboBox2.ListIndex, 1)
For I = 1 To 10
Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 2)
Next I
End Sub
Vous avez peut être remarque dans la programmation Combobox2_Change la phrase suivante :
Nettoyage
Ce mot "Nettoyage" va lancer la programmation suivante à savoir effacer toutes les données de toutes les texbox du formulaire.... cela évite d'énumérer ceci : Texbox1 ="" et ainsi de suite,
Cette programmation englobe toutes les textbox via le Me.Controls
'Programmation de Nettoyage en effaçant les données de toutes les textbox
Sub Nettoyage()
Dim I As Integer
For I = 1 To 10
Me.Controls("TextBox" & I) = ""
Next I
End Sub
On pourrait aussi programmer toutes les combobox soit Me.Controls("Combobox"&2) = "" mais là n'est pas le sujet mais simplement l'explication.
Donc déjà à ce stade vous pouvez déjà effectuer un tri entre tous les types de plat et choisir votre plat et les informations remontent dans le formulaire....
PROGRAMATION des boutons de commande (CommandButton)
1) CommandButton1
A ce stade sélectionnez le CommandButton1 et
nommez le "QUITTER" (si vous ne l'avez pas effectuer précédemment)
Ensuite Double-cliquez sur ce bouton et
ajouter dans la programmation le texte ci-après en vert
Private
Sub CommandButton1_Click()
Unload Me
End
Sub
Sélectionnez le CommandButton2 et
nommez le "Modifier ou insérer des annotations" (si vous ne l'avez pas effectuer précédemment)
Ensuite Double-cliquez sur ce bouton et
ajouter dans la programmation le texte ci-après en vert
Private
Sub CommandButton2_Click()
If MsgBox("Etes-vous certain de vouloir modifier cette recette ?", vbYesNo, "Demande de confirmation") = vbYes Then
Dim Ligne As Long
Dim I As Integer
If Me.ComboBox2.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox2.List(Me.ComboBox2.ListIndex, 1)
For I = 1 To 10
If Me.Controls("TextBox" & I).Visible = True Then
Ws.Cells(Ligne, I + 2) = Me.Controls("TextBox" & I)
End If
Next I
End If
Dim Ligne As Long
Dim I As Integer
If Me.ComboBox2.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox2.List(Me.ComboBox2.ListIndex, 1)
For I = 1 To 10
If Me.Controls("TextBox" & I).Visible = True Then
Ws.Cells(Ligne, I + 2) = Me.Controls("TextBox" & I)
End If
Next I
End If
End
Sub
PROGRAMATION des intitulés (Label)
Ajoutez le texte suivant dans la programmation Private Sub ComboBox2_Change() : (Programmé précédemment)
Label2 = Textbox2
ce qui aura pour conséquence de nommer le Label2 avec les informations contenus les texbox2 dès lors que la sélection sera faite dans la Combobox2.
TEXTBOX INVISIBLE
Sélectionnez la Textbox2 et dans propriétés "Visible" mettez sur la même ligne False au lieu de True.
Pour la rendre visible au lancement d'une programmation via un bouton ou autre, il suffira de mettre dans cette programmation :
Textbox2.visible = True
sans pour autant modifier les paramètre des propriétés de la Texbox en question.
Chemin = ThisWorkbook.Path & "\IMAGES\"
ThisWorkbook.path suivi de &"\IMAGES`" ... renvoie le répertoire où sont stockées vos images.
Pour informations
La propriété ThisWorkbook.FullName retourne le chemin complet du fichier ActiveWorkbook.Name
La propriété ThisWorkbook..Path retourne uniquement le chemin du dossier
Il faut paramétrer les textbox de façon que tout le texte soit visible à l'intérieur, donc :
a) Agrandir la Textbox concernée.
b) Dans propriétés de la Texbox au niveau :
* de la case Multiline choississez True au lieu de False
* de la case ScrollBars choisissez 2-fmScrollBarsVertical
Cadrage des visuels dans les images :
En effet les images que vous avez stockées dans le dossier Images n'ont pas forcément le même format en pixel et uniformiser celles-ci avec un logiciel adéquat va vous demander beaucoup de temps. Ce n'est pas nécessaire de passer par cette étape.
Pour la rendre visible au lancement d'une programmation via un bouton ou autre, il suffira de mettre dans cette programmation :
Textbox2.visible = True
sans pour autant modifier les paramètre des propriétés de la Texbox en question.
AJOUTER UNE IMAGE ou DES IMAGES DANS UN FORMULAIRE
Pour ajouter une image sur votre
formulaire, rien de plus simple.
Dans la boite à outils, sélectionnez le
bouton image et insérer le bloc sur votre formulaire.
Ensuite pour y ajouter une image :
* selectionnez votre bloc image (nommé normalement Image1 si c'est la
première image)
* dans le menu propriétés du bloc image,
allez à la ligne "Picture" et sélectionnez la case adjacente.
* à la selection un bouton avec 3 petits
points apparaît
* cliquez sur ce bouton pour aller
chercher l'image que vous souhaitez voir apparaître dans le bloc image.
A ce stade nous avons une image fixe dans
le bloc image, mais il y a moyen de changer l'image dans le bloc en fonction du
paramètre qui est dans une Combobox, Textbox ou label etc.
Donc vous avez déjà inséré dans votre
formulaire un bloc image Image1, Image2
Nous allons effectuer la relation entre
Image1 et Image2, et combobox2 et la
Textbox2
Insérer les lignes suivantes dans la
programmation Combobox2_Change()
'programmation pour l'affichage des images dans l'userform :
Adresse à modifier si besoin
Dim MyImage As String
Dim MyImage2 As String
Dim Chemin As String
Dim MyImage2 As String
Dim Chemin As String
Chemin = ThisWorkbook.Path & "\IMAGES\"
ThisWorkbook.path suivi de &"\IMAGES`" ... renvoie le répertoire où sont stockées vos images.
Pour informations
La propriété ThisWorkbook.FullName retourne le chemin complet du fichier ActiveWorkbook.Name
La propriété ThisWorkbook..Path retourne uniquement le chemin du dossier
MyImage = ComboBox2.Value
Image1.Picture = LoadPicture(Chemin & MyImage & ".jpg") 'Modifiez le CHEMIN par le chemin
exacte où se trouve l'image (Ex. : f:\recettes\
)
MyImage = TextBox2.Value
Image2.Picture = LoadPicture("CHEMIN" & MyImage &
".jpg")
Explication :
1) on définit la variable MyImage
par Dim
MyImage As String
2) on définit MyImage pour chaque bloc image
EX : MyImage = ComboBox2.Value
MyImage prend la valeur de la
Combobox2
3) On va cherche l'image à l'endroit ou
celle-ci est stockée
Ex. : Chemin
4) Attention le nom de l'image doit être
à l'identique que le nom dans la liste de la Combobox2
TIRAMISU = TIRAMISU.jpg
DIFFICILE = DIFFICILE.jpg
Maintenant dès lors que vous alllez
effectuer votre choix dans la Combobox2, les images remonterons dans les blocs
images.
1er TEST
Sélection le formulaire et appuyez sur la touche F5.
Le formulaire s'ouvre, et maintenant faites votre choix exemple :
1ère liste déroulante = DESSERT
2ème liste déroulante = MADELEINE AU MIEL
Vous devez obtenir ce résultat.
Pour l'instant tout fonctionne,mais il y encore des imperfections....du style
Nous allons y remédier.
Les textes non visilbles :1er TEST
Sélection le formulaire et appuyez sur la touche F5.
Le formulaire s'ouvre, et maintenant faites votre choix exemple :
1ère liste déroulante = DESSERT
2ème liste déroulante = MADELEINE AU MIEL
Vous devez obtenir ce résultat.
Pour l'instant tout fonctionne,mais il y encore des imperfections....du style
Nous allons y remédier.
Il faut paramétrer les textbox de façon que tout le texte soit visible à l'intérieur, donc :
a) Agrandir la Textbox concernée.
b) Dans propriétés de la Texbox au niveau :
* de la case Multiline choississez True au lieu de False
* de la case ScrollBars choisissez 2-fmScrollBarsVertical
Cadrage des visuels dans les images :
En effet les images que vous avez stockées dans le dossier Images n'ont pas forcément le même format en pixel et uniformiser celles-ci avec un logiciel adéquat va vous demander beaucoup de temps. Ce n'est pas nécessaire de passer par cette étape.
Sélectionner votre bloc image et dans la propriété de bloc image à la ligne PictureSizeMode choisir dans la liste déroulante juxtaposé 1-fmPictureSizeModeStretch
Les images seront automatiquement recadrées au format du bloc image.
Et voici le résultat
Pour l'instant le formulaire fonctionne uniquement avec un fichier "pré-rempli", donc insérer des nouvelles recettes et aussi apporter des modifications à celles exisantes.
MODIFICATION d'une RECETTE via le FORMULAIRE
Pour ce faire nous allons ajouter la programmation au bouton Modifier ou insérer des annotations => CommandButton2 "
Double cliquez sur ce CommandButton et insérer le programme suivant entre :
Private Sub CommandButton2_Click()
End Sub
Ajouter le texte ci-après :
If MsgBox("Etes-vous certain de vouloir modifier cette recette ?", vbYesNo, "Demande de confirmation") = vbYes Then
Dim Ligne As Long
Dim I As Integer
If Me.ComboBox2.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox2.List(Me.ComboBox2.ListIndex, 1)
For I = 1 To 10
If Me.Controls("TextBox" & I).Visible = True Then
Ws.Cells(Ligne, I + 2) = Me.Controls("TextBox" & I)
End If
Next I
End If
Double cliquez sur ce CommandButton et insérer le code suivant entre :
Private Sub CommandButton3_Click()
End Sub
Ajouter le texte ci-après :
Sheets("RECETTES").Activate 'Active la la feuille "RECETTES"ComboBox1.Visible = False 'Rend invisible la ComboBox1 => .visible = FalseComboBox2.Visible = False
ComboBox3.Visible = True 'Rend visible la ComboBox3 => .visible = TrueTextBox12.Visible = True
TextBox2.Visible = True
CommandButton5.Visible = False
CommandButton6.Visible = True
2) Ajouter une nouvelle Combobox ==> Combobox3
a) Rendre invisible cette Combobox (Même principe que la TexBox ... voire explications ci-dessus)
Positionnez cette ComboBox sur la ComboBox1
b) Dans le programme Private Sub UserForm_Initialize() ajoutez les lignes de codes suivants correspondant à l'alimentation automatique de la liste déroulante (informations collectées sur la feuille "LISTE" en colonne A)
Dim I As Integer
For I = 2 To Sheets("LISTE").Range("A65536").End(xlUp).Row
ComboBox3 = Sheets("LISTE").Range("A" & I)
If ComboBox3.ListIndex = -1 Then ComboBox3.AddItem Sheets("LISTE").Range("A" & I)
Next I
3) Insérer un nouveau CommandButton ==> CommandButton4
a) Nommez Insérer RECETTE => CommandButton4
b) Double cliquez sur ce CommandButton et insérer le programme suivant entre :
Private Sub CommandButton4_Click()
End Sub
Ajouter le texte ci-après :
Dim L As Integer
If MsgBox("Etes-vous certain de vouloir INSERER cette nouvelle recette ?", vbYesNo, "Demande de confirmation") = vbYes Then
L = Sheets("RECETTES").Range("a65536").End(xlUp).Row + 1 'Permet de se positionner sur la dernière ligne de tableau NON VIDE
Range("A" & L).Value = ComboBox3 'Insère la donnée de la liste déroulante dans la colonne A
Range("B" & L).Value = TextBox12 'Insère la donnée de la textbox1 dans la colonne B
'et à suivre....
Range("C" & L).Value = TextBox1.Value
Range("D" & L).Value = TextBox2
Range("E" & L).Value = TextBox3
Range("F" & L).Value = TextBox4
Range("G" & L).Value = TextBox5
Range("H" & L).Value = TextBox6
Range("I" & L).Value = TextBox7
Range("J" & L).Value = TextBox8
Range("K" & L).Value = TextBox9
Range("L" & L).Value = TextBox10
Range("M" & L).Value = TextBox11
End If
MsgBox ("La nouvelle recette est insérée") 'Vous informe que le présent contact est insérer dans votre tableau Excel.
Unload Me 'Ferme le formulaire
UserForm1.Show 'Ouvre le formulaire
Donc maintenant votre formulaire peut :
1) Créer une nouvelle recette
2) Modifier une recette
3) Rechercher toutes les recettes une à une.
C'est déjà le TOP..... mais on va encore améliorer ce programme.
Vous avez pu le constater, copier du texte dans les Textbox "INGRÉDIENTS" et "PRÉPARATION" est chose facile mais à la modification c'est pas compliqué mais il faut se servir des ascenseurs pour voire le texte si celui-ci est important.
Donc nous allons y remédier et créer un autre formulaire simple mais qui va nous servir à modifier très simplement le texte mais aussi à autre chose.... Surprise !!!
Donc maintenant insérer un deuxième formulaire (UserForm2)
Insérer dans ce formulaire :
* Une TextBox
* Quatre CommandButton
Nommez vos CommandButton respectivement dans Caption :
* Validation INGREDIENTS => CommandButton1
* Validation PREPARATION => CommandButton2
* AJOUTER à la LISTE DES COURSES => CommandButton3
* FERMER => CommandButton4
Private Sub CommandButton2_Click()
End Sub
Ajouter le texte ci-après :
If MsgBox("Etes-vous certain de vouloir modifier cette recette ?", vbYesNo, "Demande de confirmation") = vbYes Then
Dim Ligne As Long
Dim I As Integer
If Me.ComboBox2.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox2.List(Me.ComboBox2.ListIndex, 1)
For I = 1 To 10
If Me.Controls("TextBox" & I).Visible = True Then
Ws.Cells(Ligne, I + 2) = Me.Controls("TextBox" & I)
End If
Next I
End If
INSERER une nouvelle RECETTE via le FORMULAIRE
1) Pour ce faire nous allons ajouter la programmation au bouton Nouvelle RECETTE => CommandButton3Double cliquez sur ce CommandButton et insérer le code suivant entre :
Private Sub CommandButton3_Click()
End Sub
Ajouter le texte ci-après :
Sheets("RECETTES").Activate 'Active la la feuille "RECETTES"ComboBox1.Visible = False 'Rend invisible la ComboBox1 => .visible = FalseComboBox2.Visible = False
ComboBox3.Visible = True 'Rend visible la ComboBox3 => .visible = TrueTextBox12.Visible = True
TextBox2.Visible = True
CommandButton5.Visible = False
CommandButton6.Visible = True
2) Ajouter une nouvelle Combobox ==> Combobox3
a) Rendre invisible cette Combobox (Même principe que la TexBox ... voire explications ci-dessus)
Positionnez cette ComboBox sur la ComboBox1
b) Dans le programme Private Sub UserForm_Initialize() ajoutez les lignes de codes suivants correspondant à l'alimentation automatique de la liste déroulante (informations collectées sur la feuille "LISTE" en colonne A)
Dim I As Integer
For I = 2 To Sheets("LISTE").Range("A65536").End(xlUp).Row
ComboBox3 = Sheets("LISTE").Range("A" & I)
If ComboBox3.ListIndex = -1 Then ComboBox3.AddItem Sheets("LISTE").Range("A" & I)
Next I
3) Insérer un nouveau CommandButton ==> CommandButton4
a) Nommez Insérer RECETTE => CommandButton4
b) Double cliquez sur ce CommandButton et insérer le programme suivant entre :
Private Sub CommandButton4_Click()
End Sub
Ajouter le texte ci-après :
Dim L As Integer
If MsgBox("Etes-vous certain de vouloir INSERER cette nouvelle recette ?", vbYesNo, "Demande de confirmation") = vbYes Then
L = Sheets("RECETTES").Range("a65536").End(xlUp).Row + 1 'Permet de se positionner sur la dernière ligne de tableau NON VIDE
Range("A" & L).Value = ComboBox3 'Insère la donnée de la liste déroulante dans la colonne A
Range("B" & L).Value = TextBox12 'Insère la donnée de la textbox1 dans la colonne B
'et à suivre....
Range("C" & L).Value = TextBox1.Value
Range("D" & L).Value = TextBox2
Range("E" & L).Value = TextBox3
Range("F" & L).Value = TextBox4
Range("G" & L).Value = TextBox5
Range("H" & L).Value = TextBox6
Range("I" & L).Value = TextBox7
Range("J" & L).Value = TextBox8
Range("K" & L).Value = TextBox9
Range("L" & L).Value = TextBox10
Range("M" & L).Value = TextBox11
End If
MsgBox ("La nouvelle recette est insérée") 'Vous informe que le présent contact est insérer dans votre tableau Excel.
Unload Me 'Ferme le formulaire
UserForm1.Show 'Ouvre le formulaire
Donc maintenant votre formulaire peut :
1) Créer une nouvelle recette
2) Modifier une recette
3) Rechercher toutes les recettes une à une.
C'est déjà le TOP..... mais on va encore améliorer ce programme.
Vous avez pu le constater, copier du texte dans les Textbox "INGRÉDIENTS" et "PRÉPARATION" est chose facile mais à la modification c'est pas compliqué mais il faut se servir des ascenseurs pour voire le texte si celui-ci est important.
Donc nous allons y remédier et créer un autre formulaire simple mais qui va nous servir à modifier très simplement le texte mais aussi à autre chose.... Surprise !!!
Donc maintenant insérer un deuxième formulaire (UserForm2)
Insérer dans ce formulaire :
* Une TextBox
* Quatre CommandButton
Nommez vos CommandButton respectivement dans Caption :
* Validation INGREDIENTS => CommandButton1
* Validation PREPARATION => CommandButton2
* AJOUTER à la LISTE DES COURSES => CommandButton3
* FERMER => CommandButton4
Agrandisser un maximum votre formulaire et ajuster votre TextBox1 presque au format du formulaire pour donner ceci approximativement, avec les CommandButton tout en bas.
Exemple :
Exemple :
Programmation des CommandButton :
a) CommandButton1 => Validation INGREDIENTS
Double cliquez sur ce CommandButton et insérer le programme suivant entre :
Private Sub CommandButton1_Click()
End Sub
Ajouter le texte ci-après :
Unload Me 'Ferme le formulaire
UserForm1.TextBox6 = TextBox1 'Les données de la TextBox6 de l'UserForm1 seront égales à celles de la Textbox1 du présent formulaire (UserForm2)UserForm1.Show 'Ouvre le l'UserForm1
b) CommandButton2 => Validation PREPARATION
Double cliquez sur ce CommandButton et insérer le programme suivant entre :
Private Sub CommandButto21_Click()
End Sub
Ajouter le texte ci-après :
Unload Me 'Ferme le formulaire
UserForm1.TextBox7 = TextBox1 'Les données de la TextBox7 de l'UserForm1 seront égales à celles de la Textbox1 du présent formulaire (UserForm2)
UserForm1.Show 'Ouvre le l'UserForm1
c) CommandButton4 => Validation PREPARATION
Double cliquez sur ce CommandButton et insérer le programme suivant entre :
Private Sub CommandButto21_Click()
End Sub
a) CommandButton1 => Validation INGREDIENTS
Double cliquez sur ce CommandButton et insérer le programme suivant entre :
Private Sub CommandButton1_Click()
End Sub
Ajouter le texte ci-après :
Unload Me 'Ferme le formulaire
UserForm1.TextBox6 = TextBox1 'Les données de la TextBox6 de l'UserForm1 seront égales à celles de la Textbox1 du présent formulaire (UserForm2)UserForm1.Show 'Ouvre le l'UserForm1
b) CommandButton2 => Validation PREPARATION
Double cliquez sur ce CommandButton et insérer le programme suivant entre :
Private Sub CommandButto21_Click()
End Sub
Ajouter le texte ci-après :
Unload Me 'Ferme le formulaire
UserForm1.TextBox7 = TextBox1 'Les données de la TextBox7 de l'UserForm1 seront égales à celles de la Textbox1 du présent formulaire (UserForm2)
UserForm1.Show 'Ouvre le l'UserForm1
c) CommandButton4 => Validation PREPARATION
Double cliquez sur ce CommandButton et insérer le programme suivant entre :
Private Sub CommandButto21_Click()
End Sub
Ajouter le texte ci-après :
Unload Me 'Ferme le formulaire
UserForm1.Show 'Ouvre le l'UserForm1
d) Pour le CommandButton3 => AJOUTER à la LISTE DES COURSES nous y reviendrons plus tard
Maintenant retourner dans l'Userform1 et placer deux CommandButton à côté de la TextBox6 et la TextBox7 pour faire en sorte que :
a) CommandButton5 à côté de la TextBox6
b) CommandButton6 à côté de la TextBox7
Comme ceci :
Programmation des CommandButton :
a) CommandButton5
Double cliquez sur ce CommandButton et insérer le programme suivant entre :
Private Sub CommandButton5_Click()
End Sub
Ajouter le texte ci-après :
Me.Hide
UserForm2.TextBox1 = TextBox6
UserForm2.Caption = "INGREDIENTS"
UserForm2.CommandButton2.Visible = False
UserForm2.Show
b) CommandButton6
Double cliquez sur ce CommandButton et insérer le programme suivant entre :
Private Sub CommandButton6_Click()
End Sub
Ajouter le texte ci-après :
Me.Hide
UserForm2.TextBox1 = TextBox7
UserForm2.Caption = "PREPARATION"
UserForm2.CommandButton1.Visible = False
UserForm2.CommandButton3.Visible = False
UserForm2.Show
Maintenant en cliquant, dans l'UserForm1, sur les CommandButton5 et 6 vous accéderez sur l'UserForm2 avec tout le texte accessible ou pour y ajouter, ou modifier le texte.
Dans l'UserForm2, en cliquant sur les boutons "Validation ..." les informations de cette UserForm seront insérés dans les textbox respectives dans l'Userform1.
Après avoir effectuer ces manipulations n'oubliez pas de cliquer sur le bouton "MODIFIER" dans l'UserForm1.
Maintenant "CERISE sur le GÂTEAU" ==> Programmation du CommandButton3 => AJOUTER à la LISTE DES COURSES
1) Insérer un nouvel onglet dans votre fichier Excel et nommez le "LISTE DES COURSES"
* Insérer en cellule A1 le texte suivant : LISTE DES COURSES :
* Insérer en cellule A2 un espace.
* Sélectionnez la cellule A3, puis :
a) "Click Droit" et choisissez "Format Cellule"
b) Dans l'onglet "Nombre", choisissez "Personnalisée"
c) Dans "Type" ajoutez @*. (Point inclu, ceci permettra de remplir les espaces vides par des points dans la totalité de la cellule après le texte)
* Sélectionnez la cellule B3, puis :
a) Insérez la formule suivante =SI(A3="";"";"r")
b) Choisissez le type de caractère Wingdings taille 14.
Incrémentez les cellules A3 et B3 vers le base de la feuille et arrêtez vous à la ligne que vous souhaitez.
Une fois paramétrer de la sorte ceci devrait vous donner le résultat suivant :
Sélectionnez maintenant l'UserForm2 et double-cliquez sur le bouton CommandButton3 => AJOUTER à la LISTE DES COURSES et insérer le programme suivant entre :
Private Sub CommandButton3_Click()
End Sub
Ajouter le texte ci-après :
'Copie la valeur de la textbox1 dans le presse papier
With TextBox1
.SelStart = 0
.SelLength = Len(TextBox1)
.Copy
End With
'Sélectionne l'onglet "LISTE DES COURSES"
Sheets("LISTE DES COURSES").Activate'Selectionne la première cellule du tableau
Range("a1").Select'Fait jusqu'à ce que la celluleactive soit vide (=true)
'Descend d'une ligne (mais reste dans la même colonne)
'Sinon recommence
Do Until IsEmpty(ActiveCell) = True
ActiveCell.Offset(1, 0).Activate
Loop'Copie en conservant uniquement le texte.
ActiveSheet.PasteSpecial FORMAT:="Texte Unicode", Link:=False, DisplayAsIcon:=False, NoHTMLFormatting:=True
Unload Me 'Ferme le formulaire
Donc quand :
1) vous cliquez sur le CommandButton5 de l'UserForm1 vous listez les ingrédients dans l'UserForm2
2) vous cliquez sur le CommandButton3 de l'UserForm2 vous listez tous les ingrédient dans l'onglet LISTE DES COURSES
Maintenant imprimez cette feuille et vous êtes prêt pour faire vos courses.
Amusez-vous et bon appétit !!
Unload Me 'Ferme le formulaire
UserForm1.Show 'Ouvre le l'UserForm1
d) Pour le CommandButton3 => AJOUTER à la LISTE DES COURSES nous y reviendrons plus tard
Maintenant retourner dans l'Userform1 et placer deux CommandButton à côté de la TextBox6 et la TextBox7 pour faire en sorte que :
a) CommandButton5 à côté de la TextBox6
b) CommandButton6 à côté de la TextBox7
Comme ceci :
Programmation des CommandButton :
a) CommandButton5
Double cliquez sur ce CommandButton et insérer le programme suivant entre :
Private Sub CommandButton5_Click()
End Sub
Ajouter le texte ci-après :
Me.Hide
UserForm2.TextBox1 = TextBox6
UserForm2.Caption = "INGREDIENTS"
UserForm2.CommandButton2.Visible = False
UserForm2.Show
b) CommandButton6
Double cliquez sur ce CommandButton et insérer le programme suivant entre :
Private Sub CommandButton6_Click()
End Sub
Ajouter le texte ci-après :
Me.Hide
UserForm2.TextBox1 = TextBox7
UserForm2.Caption = "PREPARATION"
UserForm2.CommandButton1.Visible = False
UserForm2.CommandButton3.Visible = False
UserForm2.Show
Maintenant en cliquant, dans l'UserForm1, sur les CommandButton5 et 6 vous accéderez sur l'UserForm2 avec tout le texte accessible ou pour y ajouter, ou modifier le texte.
Dans l'UserForm2, en cliquant sur les boutons "Validation ..." les informations de cette UserForm seront insérés dans les textbox respectives dans l'Userform1.
Après avoir effectuer ces manipulations n'oubliez pas de cliquer sur le bouton "MODIFIER" dans l'UserForm1.
Maintenant "CERISE sur le GÂTEAU" ==> Programmation du CommandButton3 => AJOUTER à la LISTE DES COURSES
1) Insérer un nouvel onglet dans votre fichier Excel et nommez le "LISTE DES COURSES"
* Insérer en cellule A1 le texte suivant : LISTE DES COURSES :
* Insérer en cellule A2 un espace.
* Sélectionnez la cellule A3, puis :
a) "Click Droit" et choisissez "Format Cellule"
b) Dans l'onglet "Nombre", choisissez "Personnalisée"
c) Dans "Type" ajoutez @*. (Point inclu, ceci permettra de remplir les espaces vides par des points dans la totalité de la cellule après le texte)
* Sélectionnez la cellule B3, puis :
a) Insérez la formule suivante =SI(A3="";"";"r")
b) Choisissez le type de caractère Wingdings taille 14.
Incrémentez les cellules A3 et B3 vers le base de la feuille et arrêtez vous à la ligne que vous souhaitez.
Une fois paramétrer de la sorte ceci devrait vous donner le résultat suivant :
Sélectionnez maintenant l'UserForm2 et double-cliquez sur le bouton CommandButton3 => AJOUTER à la LISTE DES COURSES et insérer le programme suivant entre :
Private Sub CommandButton3_Click()
End Sub
Ajouter le texte ci-après :
'Copie la valeur de la textbox1 dans le presse papier
With TextBox1
.SelStart = 0
.SelLength = Len(TextBox1)
.Copy
End With
'Sélectionne l'onglet "LISTE DES COURSES"
Sheets("LISTE DES COURSES").Activate'Selectionne la première cellule du tableau
Range("a1").Select'Fait jusqu'à ce que la celluleactive soit vide (=true)
'Descend d'une ligne (mais reste dans la même colonne)
'Sinon recommence
Do Until IsEmpty(ActiveCell) = True
ActiveCell.Offset(1, 0).Activate
Loop'Copie en conservant uniquement le texte.
ActiveSheet.PasteSpecial FORMAT:="Texte Unicode", Link:=False, DisplayAsIcon:=False, NoHTMLFormatting:=True
Unload Me 'Ferme le formulaire
Donc quand :
1) vous cliquez sur le CommandButton5 de l'UserForm1 vous listez les ingrédients dans l'UserForm2
2) vous cliquez sur le CommandButton3 de l'UserForm2 vous listez tous les ingrédient dans l'onglet LISTE DES COURSES
Maintenant imprimez cette feuille et vous êtes prêt pour faire vos courses.
Amusez-vous et bon appétit !!
Bonsoir, j'ai essayer de refaire comme vous et j'ai pas réussis.
RépondreSupprimerComment faire
Bonjour,
RépondreSupprimerSi vous avez suivi scrupuleusement les étapes cela devrait fonctionner.
Envoyez moi votre fichier à l'adresse suivante : blog.cellulexcel@gmail.com
je vous communiquerai votre erreur éventuelle.
A bientôt
Emile
Olala c'est magnifique tout ça.
RépondreSupprimerJe vais voir si j'y arrive.
Mon but est de faire un userform dans mon tableur D'inventaire pour créer une recette l'utilisateur aura des étapes pas à pas et le prix des matières premières j'espère que ça va marcher
premier problème:
RépondreSupprimerPrivate Sub ComboBox1_Change()
Sub InitCombo1()
Dim J As Long
Dim Mondico As Object
Set Mondico = CreateObject("Scripting.dictionary")
For J = 2 To NbLignes
Mondico(Ws.Range("A" & J).Value) = ""
Next J
With Me.ComboBox1
.Clear
If Mondico.Count > 0 Then
.List = Application.Transpose(Mondico.keys)
End If
End With
End Sub
erreur end sub attendu
variable non définie pour ce code
RépondreSupprimerPrivate Sub CommandButton3_Click()
Sheets("RECETTES").Activate 'Active la la feuille "RECETTES"ComboBox1.Visible = False 'Rend invisible la ComboBox1 => .visible = FalseComboBox2.Visible = False
ComboBox3.Visible = True 'Rend visible la ComboBox3 => .visible = TrueTextBox12.Visible = True
TextBox2.Visible = True
CommandButton5.Visible = False
CommandButton6.Visible = True
End Sub
Bonsoir Julien,
SupprimerAie je ne vous suis pas dans votre progammation qui je pense est basée sur la mienne mais les données et les objets doivent être différents.
Vous pouvez m'envoyer votre fichier via l'adresse indiquée dans l'onglet CONTACT
Excusez moi mais je n'y arrive pas ! Ceci ne fonctionne pas avec Windows 10 ! excusez moi !
RépondreSupprimerMerci quand même.
Tatiana
Cela n'a rien à voir avec Window10 bien au contraire. Il doit y avoir un problème dans votre programmation.
SupprimerFaites moi parvenir votre fichier via la page CONTACT sur le présent blog
Bonsoir, dans votre tuto, vous avez omis d'indiquer comment gérer le cas d'une recette sans image alors que l'image inexistante fait partie des images à télécharger. Pouvez-vous compléter votre tutoriel ?
RépondreSupprimerMerci d'avance pour votre aide
Bonjour,
SupprimerSuper travail d'Emile
Je n'ai fait que rajouter quelques lignes dans le cas d'une recette sans image.
Le chemin est à adapter
MyImage = ComboBox2.Value
If Dir("F:\Mes recettes\IMAGES\" & ComboBox2.Value & ".jpg") = "" Then
Image1.Picture = LoadPicture("F:\Mes recettes\IMAGES\inexistante.jpg")
Else
Image1.Picture = LoadPicture("F:\RECETTES\Mes recettes\IMAGES\" & MyImage & ".jpg")
End If
Qu'en pensez-vous?
Cordialement,
Guy
C'est bon car dès lors que le chemin est ciblé et que l'image ou les images s'y trouvent.
SupprimerPour ma part je préfère mettre les images dans le même dossier que le fichier Excel d'où le code ThisWorkbook.path
Exemple :
Chemin = ThisWorkbook.Path & "\" 'ThisWorkbook.path ... renvoi le répertoire ou est stocké le classeur contenant ton code.
'La propriété .FullName retourne le chemin complet du fichier ActiveWorkbook.Name
'La propriété .Path retourne uniquement le chemin du dossier
'Chemin2 = ThisWorkbook.FullName
MyImage = ComboBox2.Value
If Dir(Chemin & MyImage & ".jpg") = "" Then 'Si une erreur (image non présente)
Image1.Picture = LoadPicture(Chemin & "inexistante.jpg")
Me.Repaint
Else
Image1.Picture = LoadPicture(Chemin & MyImage & ".jpg")
Me.Repaint
End If
Merci pour ces précisions.
SupprimerEncore bravo pour ton blog !!!
Bonjour Emile, super travail ! ...en tant que cuisinier c'est ce que je rechercher depuis longtemps ! ... petite question tout de même : pourquoi ne pas partager le fruit de ton travail en y joignant le fichier avec tous les codes ? cdlt
RépondreSupprimerBonjour Géraldine,
SupprimerPour bénéficier du fichier, contactez moi via l'onglet contact. Merci
Bonjour Géraldine
SupprimerSi tu relis cette page, saches que le fichier est cours d'évolution vers approche professionnelle.
J'ai un internaute qui m'aide à comprendre votre métier (et qui est le sien) et les subtilités des recettes, semainier des menus, coures et cacule autotmatique des denrées suivant le nombre de personne prévue et etc....
Bonjour,
RépondreSupprimerMerci pour ce jolie VBA ! Jolie travail !!
N'y aurait-il pas un problème dans votre tuto ? Je ne trouve pas à quoi correspond "Private Sub CommandButto21_Click()" idem pour "Range("B" & L).Value = TextBox12 '" et "Range("M" & L).Value = TextBox11".
Sachant que dans votre tuto il n'y a que 10 Textbox ?
Merci d'avance :)
Salut Emile,
RépondreSupprimerJe viens d'avoir une nouvelle idée, toujours aussi Dé..le. Et pourquoi pas insérer nos vidéo dans nos recettes?
Mais la question pour moi est toujours la même:
-"Comment faire?"
Et bien si tu l'acceptes, voilà, pour toi une nouvelle mission.
Bonne soirée en attendant
Salut
Jean-Marie
bonjour,
RépondreSupprimerje n'arrive pas à programmer correctement les données. le premier problème vient du "nettoyage". il m'indique que "l'objet spécifié est introuvable" et quand je clique sur débogage, il me surligne " Me.Controls("TextBox" & I) = "" ". j'ai pourtant bien copié et collé toutes les informations que vous avez transmises...
Merci pour votre réponse
Bonjour Emile,
RépondreSupprimerBravo et merci pour ce blog et cette idée de livre de recette numérique, que j'adore :D
Cela fait quelques semaines que j'avance petit à petit sur le tuto, je n'ai pas une grande maitrise de VBA, mais je me suis lancée dans vos indications car je rêve de mettre en place cet outil, je suis à présent arrêtée à "Textbox invisible" où j'ai voulu effectuer un test sans succès.
J'ai une Erreur de compilation : membre de méthode ou de données introuvable.
Pourriez vous m'aider à débloquer ce problème ?
Merci !
Clem
Bonjour,
RépondreSupprimerJe n'ai pu finir le programme étant stoppé par l'insertion des images !
Merci si vous pouvez m'envoyer votre programme qui est bien fait !
Cordialement !
Bonjour
SupprimerVous pouvez me contacter via l'onglet CONTACT
A vous relire
Bonjour, je rencontre un souci au niveau des images qui ne s'affiche pas pour la bonne recettes , de plus quand les ComboBox son vide l'image reste. Cordialement,
RépondreSupprimerBonjour
RépondreSupprimerVous pouvez m'envoyer votre fichier (adresse mail dans onglet CONTACT) et je vous ferai un retour sur les éventuelles erreurs dans votre programmation
Cordialement
Bonjour , et t'il possible d'avoir le fichier que vous avez créer , je n'y comprend rien … Cordialement
RépondreSupprimerBonjour Envoyez-moi un mail à l'adresse mentionnée dans l'onglet CONTACT... Merci
SupprimerBonjour,
RépondreSupprimerJe profite du confinement pour organiser mon bureau.
Votre blog tombe à pic pour la gestion de mes recettes et je vos remercie pour le partage de vos connaissances.
Après enregistrement à la lettre de a procédure, lors du premier test, rien ne s'affiche dans la combobox 2.
Pouvez-vous me venir en aide ? SVP
Re :-)
SupprimerJ'ai résolu le problème précédent :-)
Mais je rencontre un autre problème.
Après voir introduis le commandButton4 et le texte de programmation un message d'erreur apparaît :
[erreur de compilation / Variable non définie] et le me met TextBox12 en surbrillance.
Merci de bien vouloir me venir en aide. SVP
bonsoir,
RépondreSupprimerBeau travail, mais ça ne marche pas. trop d'erreurs dans le tuto? exemple : la textbox 11 n'exsiste pas. Donc ça bug ! et ce n'est pas le seul bug
Dès le départ, l'ordre des textbox ne correspond pas à ce qui s'affiche. Il faut les déplacer manuellement.
Pas de remise à blanc du formulaire quand on veut créer une recette après avoir consulté des recettes existantes.
Dommage. j'aimerais bien recevoir un fichier qui fonctionne SVP