@Ronan
j'ai fini plus tôt que prévu. :) merci pour ton retour. :)
pour apprendre le VBA, regarde ici : lien1 ; lien2
--------------------------------------------------------------------------------------------------------------
feuille "Paramètres" (partie 2)
en colonne D, il y a donc la liste des vins disponibles ; il n'y a aucune formule,
c'est uniquement des données ; tout le problème sera de la mettre à jour,
et surtout, plus exactement, aux bons moments.
dans le code VBA de Module1, c'est la sub LVD() qui écrit la liste ; mais c'est
inutile de détailler le code pour les explications.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
voici quand même le nouveau code VBA :
Sub LVD(b%) 'Liste des Vins Disponibles
Dim T, m&, n&: m = Rows.Count
With F01
n = .Cells(m, 1).End(3).Row: If n = 1 Then Exit Sub
T = .Range("A2:J" & n): n = n - 1
End With
Dim d&, r&, i&: Application.ScreenUpdating = 0
With F05
d = .Cells(m, 4).End(3).Row: r = 2
If d > 1 Then .Range("D2:D" & d).ClearContents
For i = 1 To n
If T(i, 10) > 0 Then .Cells(r, 4) = T(i, 1): r = r + 1
Next i
.Range("D2:D" & r - 1).Sort .[D2], 1
End With
End Sub
tu remarqueras que je n'utilise plus le nom des feuilles mais le CodeName ;
car bizarrement, avec Worksheets("Paramètres"), ça causait un plantage
alors que d'habitude, ça ne pose pas de problème.
F01 : feuille "Achats" ; F05 : feuille "Paramètres".
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
mais revenons à nos moutons. ;) dans ThisWorkbook, il y a :
Private Sub Workbook_Open()
LVD 0
End Sub
ainsi, dès l'ouverture du classeur, c'est cette sub qui appelle LVD() pour
écrire la liste ; mais ensuite ? quand donc est-il nécessaire de mettre
la liste à jour ?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
d'abord sur la feuille "Achats", quand tu saisis ou changes un nombre
en colonne G "NOMBRE DE BOUTEILLES ACHETÉES" ; d'où ce code
VBA du module de la feuille "Achats" :
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim col%
With Target
If .CountLarge > 1 Then Exit Sub
If .Row = 1 Then Exit Sub
col = .Column
If col = 1 Then
Application.EnableEvents = 0: .Value = Trim$(.Value)
Application.EnableEvents = -1: Exit Sub
End If
End With
If col = 7 Then LVD 0
End Sub
le bloc « If col = 1 Then .. End If » ne concerne pas la liste : c'est ce qui
enlève les espaces en trop dans le nom saisi en colonne A.
bien sûr le nom doit être écrit correctement pour que la mise à jour
fonctionne correctement ; sinon, c'était le cas du "Bellissima " ; ou
ça aurait été le cas pour "Naudé 23" au lieu de "Naudé-23".
j'ai préféré éviter de faire une mise à jour de la liste en cas de
changement du nom car c'est une liste des vins disponibles,
donc c'est dépendant de la quantité restant en stock.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
au cas où tu saisis un nom erroné comme "Naudé 23" : commence par
le remplacer par "Naudé-23" ; va sur la cellule G de la même ligne.
a) si la cellule est vide, saisis un nombre ; b) s'il y a déjà un nombre correct,
appuie sur les touches F2 puis Entrée : c'est comme si tu re-saisis le même
nombre ; c) si le nombre est incorrect, remplace-le par le bon nombre.
c'est a) ou b) ou c) qui va mettre à jour la liste ; sinon, ça se fera lors de la
prochaine ouverture du classeur, via la sub Workbook_Open().
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pour la colonne i "NOMBRE DE BOUTEILLES CONSOMMÉES" :
si tu saisissais ou modifiais le nombre, c'est à ce moment que j'aurais fait
aussi une mise à jour de la liste ; mais comme il y a une formule ça n'est
pas possible ; c'est pourquoi la suite est sur la feuille "Dégusté_le".
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
en colonne B "Millésime", il y a une liste déroulante qui doit montrer unique-
ment les vins disponibles ; donc pour cela, j'ai choisi de faire une mise à jour
de la liste des vins de la feuille "Paramètres" quand tu saisis ou modifies une
date en colonne A ; c'est donc une liste avant retrait des bouteilles dégustées.
bien sûr, après saisie ou modification d'un nombre en colonne C "Nombre",
il faut aussi mettre à jour la liste des vins disponibles.
les 2 paragraphes qui précèdent font que voici le code VBA du module de
la feuille "Dégusté_le" :
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .CountLarge > 1 Then Exit Sub
If .Row = 1 Then Exit Sub
If .Column = 1 Or .Column = 3 Then LVD 0
End With
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
voilà pourquoi je tenais vraiment à t'en parler ; pour ce qui est de l'utilisation,
mais aussi pour que tu saches que ce n'est pas seulement dans Module1
qu'il y a du code VBA ; il y en a aussi dans ThisWorkbook et le module
des 2 feuilles "Achats" et "Dégusté_le".
--------------------------------------------------------------------------------------------------------------
pour tous les tris, le code VBA correspondant est uniquement dans
Module1 ; c'est tout ceci :
Option Explicit
Private Sub Tri(sh As Worksheet, plg$, cel$)
Dim d&: Application.ScreenUpdating = 0
With sh
d = .Cells(Rows.Count, 1).End(3).Row
If d > 2 Then
If sh.CodeName = "F04" Then F04.Unprotect
.Range(plg & d).Sort .Range(cel), 1
If sh.CodeName = "F04" Then F04.Protect
End If
End With
End Sub
Sub TTN()
If ActiveSheet.CodeName = "F04" Then Tri F04, "A2:D", "B2"
End Sub
Sub TTD()
If ActiveSheet.CodeName = "F04" Then Tri F04, "A2:D", "A2"
End Sub
Sub TAP()
If ActiveSheet.CodeName = "F05" Then Tri F05, "A2:A", "A2"
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
attention : si un jour tu vas protéger la feuille "Tarif" avec un mot de passe,
par exemple "loup", il faudra que tu l'ajoutes sur 2 lignes de code VBA :
If sh.CodeName = "F04" Then F04.Unprotect "loup"
If sh.CodeName = "F04" Then F04.Protect "loup"
si tu oublieras de le faire, ça va planter ! :(
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TTN : Tri Tarifs par Noms (en feuille Tarif)
TTD : Tri Tarifs par Dates (en feuille Tarif)
TAP : Tri des APpellations (en feuille Paramètres)
ces 3 subs appellent la sub Tri() avec différents paramètres,
puis c'est la sub Tri() qui fait tout le boulot réel du tri. ;)
F04 : CodeName de la feuille "Tarif"
F05 : CodeName de la feuille "Paramètres"
--------------------------------------------------------------------------------------------------------------
si tu as des questions, n'hésite pas. :)
rhodo