'Cette macro se déclanche à chaque fois qu'une cellule change de valeur.
'La cellule qui vient de changer de valeur est "Target"
Private Sub Worksheet_Change(ByVal Target As Range)
Dim numLigne As Long, numColonne As Long, feuilleBDD As Worksheet, cellule As Range, mem As Long
'définir la feuille BDD
Set feuilleBDD = ThisWorkbook.Sheets("BDD")
'si la cellule qui vient de changer est B1 (sélection du service)
If Not Application.Intersect(Target(1, 1), Range("B1")) Is Nothing Then
'## on va donc charger depuis la BDD les données correspondantes au service sélectionné
'rechercherr la cellule correspondante au service dans la première ligne de la BDD
Set cellule = feuilleBDD.Range("1:1").Find(Range("B1"), , xlValues, xlWhole)
'si la cellule a bien été trouvée
If Not cellule Is Nothing Then
'récupérer son numéro de colonne
numColonne = cellule.Column
'récupérer les données de cette colonne en B3:B12 (désactiver la gestion des évènements pour cette opération)
mem = Application.EnableEvents: Application.EnableEvents = False
Range("B3").Value = feuilleBDD.Range("A2").Offset(0, numColonne - 1).Value
Range("B4").Value = feuilleBDD.Range("A3").Offset(0, numColonne - 1).Value
Range("B5").Value = feuilleBDD.Range("A4").Offset(0, numColonne - 1).Value
'...
Application.EnableEvents = mem
'sinon, afficher un message d'erreur et quitter la macro
Else
MsgBox "Le service correspondant n'a pas été trouvé dans la BDD.", , "Erreur"
Exit Sub
End If
'sinon, si la cellule qui vient de changer est dans la zone B3:B12
ElseIf Not Application.Intersect(Target(1, 1), Range("B3:B12")) Is Nothing Then
'## on va charger dans la BDD la valeur qui vient de changer
'rechercherr la cellule correspondante au service dans la première ligne de la BDD
Set cellule = feuilleBDD.Range("1:1").Find(Range("B1"), , xlValues, xlWhole)
'si la cellule a bien été trouvée
If Not cellule Is Nothing Then
'récupérer son numéro de colonne
numColonne = cellule.Column
End If
'rechercherr la cellule correspondante à la catégorie (à gauche de la cellule qui vient de changer) dans la première colonne de la BDD
Set cellule = feuilleBDD.Range("A:A").Find(Target(1, 1).Offset(0, -1), , xlValues, xlWhole)
'si la cellule a bien été trouvée
If Not cellule Is Nothing Then
'récupérer son numéro de ligne
numLigne = cellule.Row
End If
'si la ligne et la colonne on bien été trouvés
If numLigne * numColonne <> 0 Then
'écrire dans la cellule de la BDD la valeur saisie dans Target
feuilleBDD.Cells(numLigne, numColonne).Value = Target(1, 1).Value
'sinon, afficher un message d'erreur et quitter la macro
Else
MsgBox "Le cellule correspondante (Service/Catégorie) n'a pas été trouvée dans la BDD.", , "Erreur"
Exit Sub
End If
End If
End Sub