Microsoft 365 Excel vba : WorksheetFunction.VLookup

Aldc

XLDnaute Nouveau
Bonjour tout le monde,

J'ai créé un gestionnaire du personnel. Il y a différents boutons dans ma feuille "Menu" : Connexion, Ajout, Recherche, Modification, Suppression.
Les boutons Connexion, Recherche et Ajout fonctionnent très, les formulaires s'affichent et les données s'enregistrent dans une autre feuille "Source".

Le problème vient pour Modification et Suppression : Lorsque je clique dessus le formulaire s'affiche, mais quand je veux valider afin que cela m'ouvre un autre formulaire j'ai une erreur : "Erreur d'exécution '1004' : Impossible de lire la propriété VLookup de la classe WorkSheetFunction." et d'autre fois j'ai une erreur : "Erreur d'exécution '76' : Chemin d'accès introuvable.

J'ai cherché vraiment de partout, sur différents forum, discussions mais là je sèche complet.

Si quelqu'un veut bien m'aider, j'ai des données confidentielles donc je ne pourrais pas le diffuser sur le forum.

Merci
 
Solution
Re

C'est déjà plus simple avec le fichier ;)

1) J'ai modifié ainsi (uniquement pour test)
VB:
Private Sub UserForm_Initialize()

    'Déclaration des Variables
    Dim NomImage As String
    Dim Matricule As Integer
    Dim MaSource As Range
    Dim DossierPhoto As String
    
    'Affectation des Variables
    '''' MODIF STAPLE DossierPhoto = ThisWorkbook.Path & "\Photos\"
    Set MaSource = shData.Range("A1").CurrentRegion
    Matricule = shListe.Range("B13")
    
    Me.lblMessage = "Vous allez réaliser une " & shListe.Range("B10")
    Me.lblType = shListe.Range("B10")
    'On réaliser des RechercheV (VLookUp) dans la source
    Me.txtMatricule = Application.WorksheetFunction.VLookup(Matricule, MaSource, 1, 0)...

Staple1600

XLDnaute Barbatruc
Bonjour @Aldc, le fil

Il suffit de créer un fichier exemple (*) sans données confidentielles
Et Excel sait faire cela très rapidement (avec une petite macro) comme celle-ci par exemple
Code:
Sub Anonymiser_Données()
Range("A1:H1") = Array("ITEM_1", "ITEM_2", "ITEM_3", "ITEM_4", "ITEM_5", "ITEM_6", "ITEM_7", "ITEM_8")
Range("A2:H30").FormulaR1C1 = "=ROW()-1&REPT(CHAR(RANDBETWEEN(65,90)),3)&ROW()*COLUMN()&CHAR(RANDBETWEEN(65,90))&INT(RAND()*16)"
Cells(1).CurrentRegion = Cells(1).CurrentRegion.Value
Cells(1).CurrentRegion.Columns.AutoFit
Cells(1).CurrentRegion.Borders.Value = 1
End Sub
NB: (*) donc de partir d'un fichier vierge
Une fois les données fictives insérées, il suffit ensuite d'importer le VBA (par copier/coller et par cliquer/déposer pour les Userforms)
 

Staple1600

XLDnaute Barbatruc
Re

L'usage sur le forum, c'est que le demandeur créé un fichier exemple allégé et anonymisé
Ce fichier exemple a pour seule vocation d'illustrer la problématique rencontrée.

On ne joint jamais le fichier original tel quel.

Ici on a juste besoin de l'Userform, de la feuille de données rattachée à cet userform
et du code VBA
Sur la feuille de données, une trentaine de ligne suffisent.
 

Staple1600

XLDnaute Barbatruc
Re

C'est déjà plus simple avec le fichier ;)

1) J'ai modifié ainsi (uniquement pour test)
VB:
Private Sub UserForm_Initialize()

    'Déclaration des Variables
    Dim NomImage As String
    Dim Matricule As Integer
    Dim MaSource As Range
    Dim DossierPhoto As String
    
    'Affectation des Variables
    '''' MODIF STAPLE DossierPhoto = ThisWorkbook.Path & "\Photos\"
    Set MaSource = shData.Range("A1").CurrentRegion
    Matricule = shListe.Range("B13")
    
    Me.lblMessage = "Vous allez réaliser une " & shListe.Range("B10")
    Me.lblType = shListe.Range("B10")
    'On réaliser des RechercheV (VLookUp) dans la source
    Me.txtMatricule = Application.WorksheetFunction.VLookup(Matricule, MaSource, 1, 0)
    Me.txtNom = Application.WorksheetFunction.VLookup(Matricule, MaSource, 2, 0)
    Me.txtPrenom = Application.WorksheetFunction.VLookup(Matricule, MaSource, 3, 0)
    Me.txtAge = Application.WorksheetFunction.VLookup(Matricule, MaSource, 4, 0)
    Me.txtTel = Application.WorksheetFunction.VLookup(Matricule, MaSource, 5, 0)
    Me.txtAdresse = Application.WorksheetFunction.VLookup(Matricule, MaSource, 6, 0)
    Me.txtDateEmbauche = Format(Application.WorksheetFunction.VLookup(Matricule, MaSource, 7, 0), "DD/MM/YYYY")
    If Me.cboContrat = "CDD" Then
        Me.lblDateFinContrat.Visible = True
        Me.txtFinContrat.Visible = True
        Me.txtFinContrat = Format(Application.WorksheetFunction.VLookup(Matricule, MaSource, 9, 0), "DD/MM/YYYY")
    End If
    Me.cboContrat = Application.WorksheetFunction.VLookup(Matricule, MaSource, 8, 0)
    Me.cboTerritoire = Application.WorksheetFunction.VLookup(Matricule, MaSource, 10, 0)
    Me.txtPoste = Application.WorksheetFunction.VLookup(Matricule, MaSource, 11, 0)
    Me.cboChamp = Application.WorksheetFunction.VLookup(Matricule, MaSource, 12, 0)
    Me.txtLieu = Application.WorksheetFunction.VLookup(Matricule, MaSource, 13, 0)
    If Application.WorksheetFunction.VLookup(Matricule, MaSource, 14, 0) <> "ImageVide" Then
        Me.chkPhoto = True
    Else
        Me.chkPhoto = False
    End If
    Me.lblNomImage.Caption = Application.WorksheetFunction.VLookup(Matricule, MaSource, 14, 0)
    ''''MODIF'''STAPLE'''''''''''''''''''''''''''On affiche l'image du Salarié dans le Formulaire
    'NomImage = Me.lblNomImage.Caption
    'Me.Image1.Picture = LoadPicture(DossierPhoto & NomImage & ".jpg")
    

End Sub
J'ai saisi 2 en B13 (toujours pour test)


=> Plus d'erreur
 

Aldc

XLDnaute Nouveau
Merci beaucoup @Staple100, ça fonctionne de mon côté. Je pense que c'etait un problème de format de la cellule.

J'ai une autre question : Dans le formulaire Ajout que tu n'as pas ou dans frmSalarie, j'aimerai ajouter d'autre infos comme toutes les dotations. Le problème est que dans la feuille "Source", j'ai qu'une ligne par salarié mais il y a plusieurs dotations. J'avais essayer avec des fusions de cellules mais c'est la cata. J'ai pensé à faire une feuille à part dotation mais pareil le même problème se pose.

Aurais tu une solution ?
Et merci encore.
 

Staple1600

XLDnaute Barbatruc
Re

@Aldc
Normalement quand on utilise Excel comme base de données simple
La règle c''est
1 ligne= 1 enregistrement
Donc si tu as N dotations, alors il te faut N colonnes
Dotation_1, Dotation_2...Dotation_N

Là aussi pour cette seconde question, prends le temps de faire un nouveau fichier simple avec uniquement le nécessaire
(donc une feuille + userform Ajout+ code VBA actuel -> le tout qu'avec des données fictives)
 

Isabellisa

XLDnaute Nouveau
Re

C'est déjà plus simple avec le fichier ;)

1) J'ai modifié ainsi (uniquement pour test)
VB:
Private Sub UserForm_Initialize()

    'Déclaration des Variables
    Dim NomImage As String
    Dim Matricule As Integer
    Dim MaSource As Range
    Dim DossierPhoto As String
   
    'Affectation des Variables
    '''' MODIF STAPLE DossierPhoto = ThisWorkbook.Path & "\Photos\"
    Set MaSource = shData.Range("A1").CurrentRegion
    Matricule = shListe.Range("B13")
   
    Me.lblMessage = "Vous allez réaliser une " & shListe.Range("B10")
    Me.lblType = shListe.Range("B10")
    'On réaliser des RechercheV (VLookUp) dans la source
    Me.txtMatricule = Application.WorksheetFunction.VLookup(Matricule, MaSource, 1, 0)
    Me.txtNom = Application.WorksheetFunction.VLookup(Matricule, MaSource, 2, 0)
    Me.txtPrenom = Application.WorksheetFunction.VLookup(Matricule, MaSource, 3, 0)
    Me.txtAge = Application.WorksheetFunction.VLookup(Matricule, MaSource, 4, 0)
    Me.txtTel = Application.WorksheetFunction.VLookup(Matricule, MaSource, 5, 0)
    Me.txtAdresse = Application.WorksheetFunction.VLookup(Matricule, MaSource, 6, 0)
    Me.txtDateEmbauche = Format(Application.WorksheetFunction.VLookup(Matricule, MaSource, 7, 0), "DD/MM/YYYY")
    If Me.cboContrat = "CDD" Then
        Me.lblDateFinContrat.Visible = True
        Me.txtFinContrat.Visible = True
        Me.txtFinContrat = Format(Application.WorksheetFunction.VLookup(Matricule, MaSource, 9, 0), "DD/MM/YYYY")
    End If
    Me.cboContrat = Application.WorksheetFunction.VLookup(Matricule, MaSource, 8, 0)
    Me.cboTerritoire = Application.WorksheetFunction.VLookup(Matricule, MaSource, 10, 0)
    Me.txtPoste = Application.WorksheetFunction.VLookup(Matricule, MaSource, 11, 0)
    Me.cboChamp = Application.WorksheetFunction.VLookup(Matricule, MaSource, 12, 0)
    Me.txtLieu = Application.WorksheetFunction.VLookup(Matricule, MaSource, 13, 0)
    If Application.WorksheetFunction.VLookup(Matricule, MaSource, 14, 0) <> "ImageVide" Then
        Me.chkPhoto = True
    Else
        Me.chkPhoto = False
    End If
    Me.lblNomImage.Caption = Application.WorksheetFunction.VLookup(Matricule, MaSource, 14, 0)
    ''''MODIF'''STAPLE'''''''''''''''''''''''''''On affiche l'image du Salarié dans le Formulaire
    'NomImage = Me.lblNomImage.Caption
    'Me.Image1.Picture = LoadPicture(DossierPhoto & NomImage & ".jpg")
   

End Sub
J'ai saisi 2 en B13 (toujours pour test)


=> Plus d'erreur
J'ai suivi le même tuto que ALDC, même code et tout. Mais si on n'a pas de no de matricule, qu'on veut rechercher un employé par son nom et son prénom (2 ComboBox) pour le modifier ou le supprimer, que dois-je changer dans ce code? Pour la recherche, rien ne s'affiche dans les TextBox ou les ComboBox pour pouvoir les modifier!

J'ai cherché mais en vain. J'ai même contacté le gars qui a fait ce tuto et il m'a simplement dit de changer "Dim Matricule as Integer" par "Dim Nom as String" et ne rien changer du reste, mais ça ne fonctionne pas plus et n'a pas l'air de vouloir m'aider plus que ça!
 

Isabellisa

XLDnaute Nouveau
Bonjour le fil

@Isabellisa
Tu parles de quel tuto et de quel gars ? ;)
Parce que si c'est moi le gars en question, j'ai pas souvenir que nous ayons échangé à ce sujet ?
;)
T'inquiètes, on ne s'est jamais parlé (écrit). Le gestionnaire de personnel qu'a utilisé Aldc, est sur Youtube, j'ai utilisé le même. Le gars s'appelle Jean-Paul Bonnetto (Learnaccess). Tu recherches Gestionnaire de personnel et Learnaccess et tu le trouves facilement. Et comme cité plus haut, il ne semble pas vouloir m'aider plus qu'il ne le faut. En fait, je veut juste modifier le code qu'Aldc (puisque c'est le même que j'ai) a envoyé pour pouvoir rechercher par nom et que les infos s'affichent dans le formulaire
 

Discussions similaires

Réponses
9
Affichages
150

Membres actuellement en ligne

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa