VBA - Recherche/Modification/Enregistrer
Bonjour,
J'ai une des dernières versions excel (je précise)
Je rencontre un problème avec un de mes userform, je souhaiterais que celui me permette de faire une recherche, modifier ou ajouter mon parc de véhicule au nécessaire,
Cependant, lorsque je fais la recherche cela ne fonctionne pas, et pire, lorsque je clique sur modifier, cela me modife ma ligne du dessous ce qui efface les données d'un de mes véhicules que je dois resaisir à la main..
Voici l'image du l'userform pour avoir une meilleure idée :
Et voici les codes que j'ai saisie :
Private Sub Annuler_Click()
'Annuler la saisie ou modification
Unload FrmParcVehicules
FrmParcVehicules.Show
End Sub
Private Sub Enregistrer_Click()
'Enregister les données
If TypeVehicule.Value = "" Then
MsgBox "Veuillez renseigner le champs 'Type "
Else
If societe.Value = "" Then
MsgBox "Veuillez renseigner le champs 'Société"
Else
If immatriculation.Value = "" Then
MsgBox "Veuillez renseigner le champs 'Immatriculation"
Else
If assureurs.Value = "" Then
MsgBox "Veuillez renseigner le champs 'Assureurs"
Else
'Enregister les données du formulaire sur la feuille
Dim ligne As Integer
Worksheets("ParcVehicule").Select
ligne = Sheets("ParcVehicule").Range("A456541").End(xlUp).Row + 1
'Enregistrer les données dans les cellules
Cells(ligne, 1) = TypeVehicule.Value
Cells(ligne, 2) = societe.Value
Cells(ligne, 3) = immatriculation.Value
Cells(ligne, 4) = marque.Value
Cells(ligne, 5) = modele.Value
Cells(ligne, 6) = utilisateur.Value
Cells(ligne, 7) = achat.Value
Cells(ligne, 8) = sortie.Value
Cells(ligne, 9) = assureurs.Value
Cells(ligne, 10) = contrat.Value
Cells(ligne, 11) = assurance.Value
Cells(ligne, 13) = ct.Value
Cells(ligne, 16) = cp.Value
Cells(ligne, 19) = identification.Value
Cells(ligne, 20) = commentaire.Value
Sheets("Accueil").Select
MsgBox "Votre enregistrement a été réalisé"
Unload FrmParcVehicules
FrmParcVehicules.Show
End If
End If
End If
End If
End Sub
Private Sub Modifier_Click()
'Code pour le bouton Modifier
Dim modif As Integer
If Not immatriculation.Value = "" Then
Sheets("parcvehicules").Select
modif = immatriculation.ListIndex + 2
Cells(modif, 1) = TypeVehicule.Value
Cells(modif, 2) = societe.Value
Cells(modif, 3) = immatriculation.Value
Cells(modif, 4) = marque.Value
Cells(modif, 5) = modele.Value
Cells(modif, 6) = utilisateur.Value
Cells(modif, 7) = achat.Value
Cells(modif, 8) = sortie.Value
Cells(modif, 9) = assureurs.Value
Cells(modif, 10) = contrat.Value
Cells(modif, 11) = assurance.Value
Cells(modif, 13) = ct.Value
Cells(modif, 16) = cp.Value
Cells(modif, 19) = identification.Value
Cells(modif, 20) = commentaire.Value
MsgBox ("Modification effectuer")
Else
MsgBox ("Veuillez sélectionné l'immatriculation à modifier")
Exit Sub
End If
Unload FrmParcVehicules
FrmParcVehicules.Show
End Sub
Private Sub Recherche_Click()
'Code pour le bouton Recherche
If Not immatriculation.Value = "" Then
Dim no_ligne As Integer
no_ligne = immatriculation.ListIndex + 2
TypeVehicule.Value = Cells(no_ligne, 1).Value
societe.Value = Cells(no_ligne, 2).Value
immatriculation.Value = Cells(no_ligne, 3).Value
marque.Value = Cells(no_ligne, 4).Value
modele.Value = Cells(no_ligne, 5).Value
utilisateur.Value = Cells(no_ligne, 6).Value
achat.Value = Cells(no_ligne, 7).Value
sortie.Value = Cells(no_ligne, 8).Value
contrat.Value = Cells(no_ligne, 10).Value
assurance.Value = Cells(no_ligne, 11).Value
ct.Value = Cells(no_ligne, 13).Value
cp.Value = Cells(no_ligne, 16).Value
identification.Value = Cells(no_ligne, 19).Value
commentaire.Value = Cells(no_ligne, 20).Value
Else
End If
End SubMerci d'avance,
Cordialement
Bonjour,
Avec un fichier ce serait beaucoup plus simple pour nous, là on ne peut ni tester, in exécuter en pas à pas, ni poser d'espions sur les variables pour les suivre...
Par un truc simple:
Si ça modifie la ligne en dessous de celle voulue, le problème vient à coup sûr de l'initialisation du numéro de ligne pour modifier la valeur
modif = immatriculation.ListIndex + 2sûrement à remplacer par:
modif = immatriculation.ListIndex + 1Il faut probablement faire ça pour la recherche aussi comme j'ai vu une ligne de code très similaire.
no_ligne = immatriculation.ListIndex + 2qui doit être écrit:
no_ligne = immatriculation.ListIndex + 1D'ailleurs si tu veux réduire la taille de ton code, la modification et l'ajout se ressemblent beaucoup, la seule chose qui change c'est le numéro de ligne sur lequel tu écris, donc faire une procédure exprès pour l'export avec une variable ligne en entrée peut être utile, tout ce que tu aurais à faire avec tes boutons ajouter et modifier, c'est initialiser la variable et appeler la procédure d'export. Le code en doublon ça complique la lecture et rend la maintenance du code plus difficile également.
Je recommande également de faire vérifier l'orthographe à quelqu'un car j'ai vu des fautes trainer.
Bonjour merci beaucoup,
J'ai modifié ce que vous m'avez dit, je pense que le problème vient de ma recherche
Lorsque je clique sur le bouton cela m'enleve l'immatriculation que j'ai séléctionné et ne me mets aucune information de ce fait, mais je ne sais pas comment résoudre ça
Private Sub Recherche_Click()
'Code pour le bouton Recherche
If Not immatriculation.Value = "" Then
Dim no_ligne As Integer
no_ligne = immatriculation.ListIndex + 1
TypeVehicule.Value = Cells(no_ligne, 1).Value
societe.Value = Cells(no_ligne, 2).Value
immatriculation.Value = Cells(no_ligne, 3).Value
marque.Value = Cells(no_ligne, 4).Value
modele.Value = Cells(no_ligne, 5).Value
utilisateur.Value = Cells(no_ligne, 6).Value
achat.Value = Cells(no_ligne, 7).Value
sortie.Value = Cells(no_ligne, 8).Value
contrat.Value = Cells(no_ligne, 10).Value
assurance.Value = Cells(no_ligne, 11).Value
ct.Value = Cells(no_ligne, 13).Value
cp.Value = Cells(no_ligne, 16).Value
identification.Value = Cells(no_ligne, 19).Value
commentaire.Value = Cells(no_ligne, 20).Value
Else
End IfJe pense que ça vient des 3 premières ligne le "If not" ou quelque chose du style
Bonjour,
Le test avec le If est bon, il vérifie que la Liste ne soit pas vide pour ensuite charger les informations.
Je pense que le problème vient soit de la ligne, soit de la feuille, mais sans fichier je ne peux que spéculer...
Deux possibilités pour que le chargement se passe mal:
Le numéro de ligne n'est pas le bon, pour savoir s'il est bon, on prépare une expérience: on regarde où se trouve la ligne qui correspond à la première valeur de la liste, on note son numéro, on prend la première valeur de la liste, et on regarde si c'est le bon numéro.
Si une fois que la ligne est OK, il y a toujours un problème, c'est peut-être à cause de la feuille Active.
Je m'explique:
Quand on écrit
Cells(no_ligne, 1).Valueça veut dire:
ActiveSheet.Cells(no_ligne, 1).ValueQuand on ne précise pas dans quelle feuille se trouve la cellule que l'on veut utiliser, ça prend par défaut la feuille affichée dans le classeur, si ce n'est pas celle qui contient la donnée, il faut alors préciser la feuille où elle est.
J'avoue pas trop avoir compris, j'ai réussi a vous isoler la partie du fichier concerné,
Je vous le mets ci-joint
Merci beaucoup de votre aide en tout cas !
Je pense avoir réparé la recherche.
C'était une histoire de feuille + la liste qui était mal initialisée, j'ai mis à jour la plage qui l'alimente, mis à jour l'initialisation du numéro de ligne, et mis à jour la partie qui charge les informations pour préciser la feuille.
Super merci énormément, tout fonctionne parfaitement !
Pas de souci,
merci d'avoir passé le sujet en résolu