XL 2016 Besoin de modification avec un formulaire

GeoffreyAbid

XLDnaute Nouveau
Bonjour voila j'ai un fichier avec un formulaire de modification et 3 feuilles , quand je sélectionne une ligne et que je clique sur modifier mon formulaire ouvre la ligne sélectionné il affiche la ligne mais je ne peux pas la modifier
J'aimerais simplement qu'on puisse modifier la ligne grâce au formulaire mais j'ai aussi un autre besoin
Il y a une colonne nommé statut cette colonne est dans chaque tableau de chaque feuille et contient le nom de la feuille dans les cellules , j'aimerais donc que lorsque je modifie par le formulaire le statut un module copie la ligne du statut modifier et la colle dans la bonne feuille
Pour être plus clair je vous donne un exemple , si je suis dans la feuille prêt le statut est égale a prêt mais si je le modifie en Doté alors la ligne modifié doit être copié et collé dans la feuille Doté
Si possible la ligne doit être supprimé
Merci d'avance et n'hésitez pas a me poser des questions si je n'ai pas été assez clair
(Le fichier est partagé en lien google drive)Fichier Excel
 

GeoffreyAbid

XLDnaute Nouveau
Super ca fonctionne nickel je vous remercie , je voulais juste savoir si il était possible de commenter un peu le code pour que je puisse comprendre un peu plus ce que chaque ligne fait car j'aimerais pouvoir le modifier sans vous demander de l'aide dans le future

Merci d'avance
 

Pièces jointes

  • Stock.xlsm
    52.9 KB · Affichages: 3

Dranreb

XLDnaute Barbatruc
Bonjour.
Vous envoyez dans le Tableau des Valeurs de la Ligne des String qu'Excel interprètera comme dates anglaises au lieu de leur conversion en date par vos soins à l'aide de la fonction CDate.
Si en plus le Label Statut2 n'est pas visible il est complètement inutile !
Comparez donc plutôt le Statut à son ancienne valeur :
VB:
Private Sub Valider_Click()
   Dim LRwDest As ListRow, RngDest As Range
   If IsNumeric(Ref_PC.Text) Then TVL(1, 1) = CDbl(Ref_PC.Text) Else TVL(1, 1) = Ref_PC.Text
   TVL(1, 2) = IPN.Value
   TVL(1, 3) = Nom.Value
   TVL(1, 4) = Site.Value
   TVL(1, 5) = Modele.Value
   TVL(1, 6) = Ace.Value
   TVL(1, 7) = Commentaire.Value
   If Not IsDate(DateLivraison.Text) Then TVL(1, 8) = Empty Else _
   TVL(1, 8) = CDate(DateLivraison.Text)
   If Not IsDate(DateMaj.Text) Then TVL(1, 9) = Empty Else _
   TVL(1, 9) = CDate(DateMaj.Text)
   TVL(1, 10) = Chipre.Text
   TVL(1, 11) = Stock.Value
   TVL(1, 12) = AD.Value
   TVL(1, 13) = TechAcc.Value
   TVL(1, 14) = Alimentation.Value
   TVL(1, 15) = Ada1.Value
   TVL(1, 16) = Ada2.Value
   TVL(1, 17) = Ada3.Value
   TVL(1, 18) = Ada4.Value
   TVL(1, 19) = Ada5.Value
   If Statut.Text <> TVL(1, 20) Then
      TVL(1, 20) = Statut.Text
      Set LRwDest = ThisWorkbook.Worksheets(Statut.Text).ListObjects(1).ListRows.Add
      Set RngDest = LRwDest.Range: RngDest.Value = TVL
      LOt.ListRows(LCou).Delete
      Application.Goto RngDest
    Else
      LOt.ListRows(LCou).Range.Value = TVL
      End If
   Unload Me
   End Sub
Oui vous pouvez commenter le code si vous voulez. Je ne vais pas le faire parce que j'estime de mon point de vu que si vous ne comprenez pas les instructions sans cela vous ne les comprendrez pas d'avantatage avec, car vous ne saurez pas pourquoi ça fait ce que j'aurais mis. Demandez moi donc plutôt maintenant ce que vous ne comprenez pas.
 

GeoffreyAbid

XLDnaute Nouveau
Alors je n'arrive pas bien a comprendre :
With ActiveCell
Set LOt = .ListObject
If Not LOt Is Nothing Then LMax = LOt.ListRows.Count: LCou = .Row - LOt.HeaderRowRange.Row
End With




Je ne comprend pas bien non plus

TVL = LOt.ListRows(LCou).Range.Value
et
If IsNumeric(Ref_PC.Text) Then TVL(1, 1) = CDbl(Ref_PC.Text) Else TVL(1, 1) = Ref_PC.Text

et

pour finir

Set LOtDst = ThisWorkbook.Worksheets(TVL(1, 18)).ListObjects(1)
Set RngDst = LOtDst.ListRows.Add.Range
RngDst.Value = TVL
LOt.ListRows(LCou).Delete
Application.Goto RngDst

Else

LOt.ListRows(LCou).Range.Value = TVL


Désolé je suis encore débutant si vous pouvez m'expliquer pour que je comprenne mieux votre code se serais super encore merci
 

Dranreb

XLDnaute Barbatruc
La propriété ListObject d'un Range est initialisée si la plage qu'elle représente a une ou plusieurs cellules en commun avec un tableau Excel. Dans ce cas elle représente ce tableau. Dans le cas contraire elle est Nothing.
La propriété ListRows d'un ListObject est une collection d'objets ListRow lesquels représentent les lignes du tableau, et une propriété HeaderRowRange qui est un Range représentant la plage de la ligne d'entêtes.
Un ListObject est aussi membre d'une collection ListObjects de l'objet Worksheet.
Tout comme la mention entre parenthèses d'un des items connu de la ListRows, sa méthode Add renvoie un ListRow représentant la ligne qu'elle vient d'ajouter. Or celui ci possède une propriété Range qui représente la plage de cellule couverte par la ligne.
La propriété Value d'un Range représentant une plage de plusieurs cellules d'un seul tenant est un tableau VBA.
Est-ce ne serait-ce qu'un tout petit peu plus clair déjà, avec tout ça ?
Sinon posez d'autres questions, de préférence une seule à la fois, que je puisse y répondre plus complètement.
 

GeoffreyAbid

XLDnaute Nouveau
J'aimerais encore votre aide pour une chose J'ai plusieurs feuilles mais je souhaite seulement quand j'ouvre le formulaire dans Préter ou Doté que la date du jour s'affiche dans dateLivraison si je ne rentre rien dans le formulaire et si je rentre une date alors celle ci s'affiche
 

GeoffreyAbid

XLDnaute Nouveau
Je vous donne mon fichier j'ai réussi a dans dateLivraison quand je ne met rien la date du jour s'affiche je souhaite juste que cette formule fonctionne dans les feuilles Prêt Doté mais qu'elle ne fonctionne pas dans les autres feuilles
Ici elle fonctionne partout
 

Pièces jointes

  • Stock.xlsm
    52.1 KB · Affichages: 3

Dranreb

XLDnaute Barbatruc
Encore une fois, convertissez en nombres ou dates les textes de contrôles qui doivent l'être, sinon Excel le fera à sa sauce à lui, et vous autrez de très mauvaises surprises !
La valeur d'une cellule n'est absolument pas ce qu'on y voit. Ce simple texte affiché résulte de la combinaison d'une donnée de type Error, Empty, Boolean, String, Double, Currency ou Date avec son format de cellule. Et encore, les deux derniers sont en réalité stockés sous forme de Double.
Alors, dans la conversion que je vous avais indiquée, et que vous devez appliquer, ne mettez Empty que si Statut.Value = "Stock", sinon mettez Date.
Vous n'avez tenu aucun compte du code de mon poste #17, en particulier la suppression pure et simple du Label Statut2 qui ne sert à rien :mad:
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
La raison essentielle c'est qu'en VBA, pour des raisons d'indépendance au pays de la macro, un texte pouvant être interprété comme une date anglaise de forme mm/jj/aaaa est convertie en date selon cette règle. De plus vous voulez assumer la date du jour quand elle n'est pas renseignée. C'est simplement Date. Surtout pas Format(Date) car ça donne un texte dont les 1er chiffres avant le '/' seront interprété comme un mois si c'est <= 12
 

GeoffreyAbid

XLDnaute Nouveau
Je le laisse ici car sinon le formulaire s'ouvre en arrière plan et comme cela ca fonctionne nickel
Si possible je voulais savoir si vous pouviez m'aider a faire un bouton ajouter qui ouvre le même formulaire que modifier mais qui ajoute juste une ligne dans la feuille sélectionner et si ce n'est pas trop vous demander un historique de ce qui ai fait
Je vous joins mon fichier j'ai déjà crée les boutons et les feuilles
 

Pièces jointes

  • Stock Test 2.xlsm
    86.7 KB · Affichages: 4

Dranreb

XLDnaute Barbatruc
Il n'y a pas de raison qu'il s'ouvre autrement si des instructions sont mises en tête de la UserForm_Activate. C'est juste que ce serait plus correct car ça n'appartient plus vraiment à l'initialisation de l'objet mais plutôt aux préalables à son affichage.
Faites une macro qui ajoute une ligne comme ça vous pourrez utiliser ensuite le même UserForm.
 

Discussions similaires

Statistiques des forums

Discussions
311 724
Messages
2 081 936
Membres
101 844
dernier inscrit
pktla