Lier données d'une feuille à une autre

Bonjour tout le monde,

Je suis novice sur Excel et j'aurais besoin de votre aide.

Je suis en train de rentrer mes recettes de cuisine dans Excel. Souvent, ce sont les même ingrédients qui reviennent et j'en ai marre du copier coller.

Du coup sur la première feuille, j'ai crée ma liste d'ingrédients, elle se présente comme ça : ingrédients - prix - poids.

En fait ce que je voudrais c'est que lorsque je suis sur une autre feuille, et que je commence à rentrer le nom de l'ingrédient, je puisse le sélectionner directement avec les valeurs que je lui ai attribué (prix, poids). (le recopier quoi ^^)

Si vous pouvez m'aider

Bonjour,

L'illustration de ton propos au moyen d'un fichier serait utile .

Cordialement.

Hello,

Je te joins un modèle j'ai fait simple mais c'est pour que tu comprennes l'idée

5test.xlsx (9.13 Ko)

Voilà une ébauche pour procéder non par inscription de l'ingrédient dans la cellule, mais clic droit sur une cellule de la colonne A, qui ouvre une liste de tes ingrédients dans laquelle tu choisis l'élément de la liste, qui s'inscrira dans les 3 cellules A, B et C de la ligne où tu as cliqué au départ.

Il va falloir te familiariser un peu avec VBA !

1er élément : on nomme ta liste d'ingrédients (là pas encore du VBA) de façon que le nom prenne en compte les ajouts que tu feras en ta liste sans que tu aies à y retoucher.

Le nom Ingrédients réfère à la plage d'ingrédients, définie au moyen d'une formule :

=DECALER(ingrédients!$A$2;;;NBVAL(ingrédients!$A:$A)-1;3)

qui lui permet de couvrir les variations de la liste.

L'opération est déclenchée par un clic doit sur une cellule, on va donc programmer l'évènement Clic Droit au niveau classeur par une procédure évènementielle placée dans le module ThisWorkbook.

Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    Dim Ingr
    Select Case Sh.Name
        Case "ingrédients"
        Case Else
            If Target.Column = 1 And Target.Row > 1 Then
                Ingr = ChoixIngrédient()
                If Ingr(1, 1) <> "" Then
                    Application.ScreenUpdating = False
                    With Target
                        .Resize(, 3).Value = Ingr
                        .Cells(1, 2).NumberFormat = "# ##0.00 €"
                        .Cells(1, 3).NumberFormat = "0"" g"""
                    End With
                End If
                Cancel = True
            End If
    End Select
End Sub

Ce qui est à noter pour cette procédure :

  • on commence par s'ssurer de la feuille sur laquelle le clic est intervenu : si c'est ingrédients on ne fait rien, s'il s'agit d'une autre feuille on s'assure que la cellule cliquée est en A (colonne 1) et à partir de la ligne 2, sinon on ne bouge pas non plus.
  • si les conditions sont réunies, on appelle une fonction : ChoixIngrédient (dont on verra ensuite comment elle procède) dont on recueille le résultat renvoyé dans une variable : ce résultat sera un tableau des 3 valeurs de la ligne relative à l'ingrédient choisi dans la liste (si on n'a pas fait de choix, ce sera un tableau vide...)
  • si un choix a été fait, on affecte ce tableau à la ligne, et on met au format voulu (qui n'est pas automatique) les cellules contenant le prix et le poids.
  • on bloque aussi l'apparition du menu contextuel dévolue habituellement au clic droit, uniquement si l'on est dans les conditions d'un choix d'ingrédient.

On a vu que la procédure faisait appel à une fonction :

Function ChoixIngrédient()
    Dim n%
    With UserForm1
        .Show
        n = .ListBox1.ListIndex + 1 S
    End With
    Unload UserForm1
    With [Ingrédients]
        If n > 0 Then
            ChoixIngrédient = .Rows(n).Value
        Else
            ChoixIngrédient = .Rows(.Rows.Count + 1).Value
        End If
    End With
End Function

Cette dernière se trouve placée dans un module standard : Module1. Elle appelle un formulaire (Userform1) qui affichera la liste dans laquelle un élément pourra être sélectionné. Si un élément est sélectionné, elle recueille le rang de l'élément et renvoie le contenu de la ligne de la plage Ingrédients sous forme de tableau. Si aucun choix n'a été fait, elle renverra un tableau vide...

Le formulaire est le support sur lequel opérer le choix : il est excessivement simple, et ne comporte qu'un seul contrôle ListBox pour afficher la liste (3 colonnes). C'est le clic de sélection d'un élément de la liste qui le fait disparaître...

Private Sub ListBox1_Click()
    Me.Hide
End Sub

La liste affichée dans la ListBox est initialisée à l'appel du Userform par la fonction. On recueille les éléments de la liste dans un tableau qu'on affecte à la ListBox.

Private Sub UserForm_Initialize()
    Dim Lst(), i%, k%
    With [Ingrédients]
        ReDim Lst(1 To .Rows.Count, 1 To 3)
        For i = 1 To .Rows.Count
            For k = 1 To 3
                Lst(i, k) = .Cells(i, k).Text
            Next k
        Next i
    End With
    ListBox1.List = Lst
End Sub

Pour accéder à l'éditeur VBA, voir le code, le modifier... raccourci clavier : Alt+F11...

Cordialement.

20laura87-test.xlsm (24.17 Ko)

C'est top !!!

Punaise merci !!! Oui je vais me plonger dedans parce que je vais devoir "automatiser" pleins d'autres choses et bon c'est vrai qu'Excel je m'en sers jamais donc je maitrise pas vraiment !

Merci encore une fois d'avoir pris le temps de t'être planché sur mon soucis !

Bonne continuation, et n'hésite pas à revenir !

Rechercher des sujets similaires à "lier donnees feuille"