XL 2010 vba userform copies des données

jokerfidelio

XLDnaute Occasionnel
Bonjour a tous,

Concernant ce bout de code, une anomalie se produit a la copie des données sur les feuilles.
au lieu d’être copié comme indiqué sur le code sur l'onglet "BD" les données sont copiés sur l'onglet qui est actif !
Pouvez vous m'aider ?

VB:
Private Sub CommandButton1_Click()

Dim L As Integer

 If MsgBox("Confirmez-vous l'insertion de ce nouveau contact ?", vbYesNo, "Demande de confirmation d'ajout") = vbYes Then
     L = Sheets("BD").Range("a65536").End(xlUp).Row + 1 'Pour placer le nouvel enregistrement à la première ligne de tableau non vide

     Range("A" & L).Value = TextBox_date
     Range("B" & L).Value = TextBox_nom
     Range("C" & L).Value = TextBox_prenom
     Range("D" & L).Value = TextBox_infolog
     Range("E" & L).Value = ComboBox_chef
     Range("G" & L).Value = ComboBox_certification
     Range("H" & L).Value = ComboBox_montage
     Range("J" & L).Value = TextBox_observation
      End If

End Sub

D’avance merci a vous
 

Dranreb

XLDnaute Barbatruc
La programmation du UserForm est à peu près toujours la même, seuls les détail dans la UserForm_Initialize sont à adapter :
VB:
Option Explicit
Private WithEvents CL As ComboBoxLiées, CA As ControlsAssociés, LCou As Long, TVL()
Private Sub UserForm_Initialize()
   Set CL = Création.ComboBoxLiées: CL.Plage WshBD
   Set CA = Création.ControlsAssociés: Set CA.Colonnes = CL.Colonnes
' Mettez ici une série d'instructions de la forme :
'   C?.Add Control, Colonne
' Avec:
'     C?: CA ou CL. CL doit être pris seulement pour une ComboBox dont la liste doit être
'        constituée dynamiquement en fonction de ce qui existe dans la base et de ce que
'        l'utilisateur aura déjà mis dans d'autres, semblables.
'     Control: le nom d'un contrôle. Mettre Me. devant peut vous aider à le retrouver.
'     Colonne: Le numéro d'ordre de la colonne est accepté, mais si vous avez fait subir à votre
'       plage une mise sous forme de tableau, vous pouvez spécifier le titre de la colonne.
   CL.CouleurSympa
   CL.Actualiser
   End Sub
Private Sub CL_Change(ByVal Complet As Boolean, ByVal NbrLgn As Long)
   If NbrLgn = 0 And Complet Then
      CBnValider.Enabled = True: CBnValider.Caption = "Ajouter": CBnSuppr.Enabled = False
   ElseIf NbrLgn = 1 Then
      CBnValider.Enabled = True: CBnValider.Caption = "Modifier": CBnSuppr.Enabled = True
   Else
      CBnValider.Enabled = False: CBnValider.Caption = "…": CBnSuppr.Enabled = False
      End If
   LCou = 0
   ReDim TVL(1 To 1, 1 To CL.Colonnes.Count)
   CA.ValeursDepuis TVL
   End Sub
Private Sub CL_BingoUn(ByVal Ligne As Long)
   LCou = Ligne
   TVL = CL.Lignes(LCou).Range.Value
   CA.ValeursDepuis TVL
   End Sub
Private Sub CBnEchap_Click(): If CL.ChangéÀLEchap Then Exit Sub
   CL.Nettoyer
   End Sub
Private Sub CBnValider_Click()
   CA.ValeursVers TVL
   If LCou = 0 Then
      CL.ValeursVers TVL
      CL.Lignes.Add.Range.Value = TVL
      CL.Actualiser
   Else
      CL.Lignes(LCou).Range.Value = TVL
      End If
   End Sub
Private Sub CBnSuppr_Click()
   If LCou = 0 Then Exit Sub
   If MsgBox("Êtes-vous sûr de vouloir supprimer cet élément ?", vbExclamation + vbYesNo _
      + vbDefaultButton2, Me.Caption & "— Supprimer") = vbNo Then Exit Sub
   CL.Lignes(LCou).Delete
   CL.Actualiser
   End Sub
Attention les propriétés Lignes et Colonnes ne sont applicable que si un ListObject a été détecté, c'est à dire si la plage à mettre à jour a fait l'objet d'une mise sous forme de tableau régi par Excel, à références structurées. À défaut la propriété Range CL.PlgTablo peut être utilisée, mais est moins pratique d'emploi.
 
Dernière édition:

jokerfidelio

XLDnaute Occasionnel
Par ailleurs j'ai l'impression que vous allez revoir l'UserForm suite au constat que tout peut se gérer dans la même feuille. Alors je joins aussi mon générateur d'UserForm.
Bonsoir, je test les fichiers depuis 1H et je m'arrache les cheveux, tres loin de mes connaissances (hélas) j arrive a creer un userform avec le generateur pas de souci ensuite pour gerer le code bah.... rien a faire je nage.... et le fichier CBxLCtlA j'essaye de comprendre la marche a suivre mais je nage completement....

Vraiment desolé pas a la hauteur de votre travail....
 

Dranreb

XLDnaute Barbatruc
Si vous y avez déjà collé le code du poste #17, joignez le classeur, que je puisse vous dire ce qui manque.
N'oubliez pas de cocher la référence CLsCAs (Alt+OR sous VBE). Si le projet n'est plus ouvert, alors, d'abord, coté Excel cette fois :
1572878634732.png

bon j'arrive a lancer mon userform en changeant ceci
Private Sub UserForm_Initialize() par le nom de mon userform Private Sub UserForm1_Initialize()
Pas bon, ça. Devient une procédure ordinaire qui n'est jamais exécutée puisque jamais invoquée. Le noyau générateur d'évènements MSForms s'appelle toujours UserForm dans tous les UserForm quels que soient leurs noms.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Ça démarre donc. Ah oui j'avais oublié. J'ai renommé WshBD l'objet Workseet Feuil1, ici, qui représente la feuille "BD" (je mets toujours des noms mnémoniques commençant par un trigramme correspondant à leurs types à tous les objets) Il reste à mettre la plage sous forme de tableau (menu Accueil, groupe Styles, commande Mettre sous forme de tableau), puis à faire les C?.Add Me.Control, Colonne.
Par exemple pour le dernier: CA.Add Me.TBxObserv, "OBSERVATION"
Mais il faut au moins une: CL.Add Me.CBxQuelqueChose pour pouvoir le faire fonctionner.
Et même plusieurs pour profiter pleinement de ses capacités. Des CBxNom et CBxPrénom me sembleraient des cibles de choix.
CL ne doit prendre en charge que les CBx dont les listes doivent être constituées dynamiquement. CA peut prendre en charge celles qui ont des listes fixes prises d'ailleurs que dans la base.
 
Dernière édition:

jokerfidelio

XLDnaute Occasionnel
Je me rapproche ou toujours aussi nul ? je suis juste partri sur le premier TextBox 'TBxDate'

VB:
Private Sub UserForm1_Initialize()
   Set CL = Création.ComboBoxLiées: CL.Plage WshBD
   Set CA = Création.ControlsAssociés: Set CA.Colonnes = CL.Colonnes
' Mettez ici une série d'instructions de la forme :
'   C?.Add Control, Colonne
' Avec:
'     C?: CA ou CL. CL doit être pris seulement pour une ComboBox dont la liste doit être
'        constituée dynamiquement en fonction de ce qui existe dans la base et de ce que
'        l'utilisateur aura déjà mis dans d'autres, semblables.
'     Control: le nom d'un contrôle. Mettre Me. devant peut vous aider à le retrouver.
'     Colonne: Le numéro d'ordre de la colonne est accepté, mais si vous avez fait subir à votre
'       plage une mise sous forme de tableau, vous pouvez spécifier le titre de la colonne.
CBL.Plage BD.Rows(2)
CBL.Add Me.TBxDate, "A"
CA.Add Me.TBxObserv, "DATE"
   CL.CouleurSympa
   CL.Actualiser
   End Sub
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Heu… Ça avance, c'est sûr. Mais contrairement à ce qui est cité dans l'aide à titre d'exemple, l'objet ComboBoxLiées central de l'affaire a été appelé ici CL, et non CBL (voir instruction Private WithEvents CL en tête du module). Par ailleurs il n'accepte que des ComboBox.
Mais vous pouvez mettre sa propriété ShowDropButtonWhen à 0 si vous voulez que la ComboBox apparaisse comme une TextBox, ce n'est pas un problème.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Même si l'élément d'identification principal de la ligne est la date, je vous conseille quand même d'en mettre aussi pour le nom et le prénom. Ça permettra de limiter la recherche d'une date à une personne spécifique en les renseignant d'abord. Et c'est même nécessaire, pour les distinguer, d'avoir d'autre ComboBox que la date s'il peut y avoir plusieurs ligne de la base qui ont la même date. (Enfin, non, on pourrait aussi s'arranger autrement, avec des boutons pour naviguer de l'un à l'autre, ou même une ListBox qui les montre toutes, d'ou on pourrait sélectionner celle qu'on veut modifier ou supprimer)
Juste une question: pourquoi n'avez vous pas gardé la disposition des contrôles telle qu'elle est fixée par mon générateur ?
Si c'est pour une question de présentation par rubriques à renseigner, on peut lui demander d'implanter le prochain contrôle tout à gauche et en dessous de tous les autres en intercalant devant un Code "●Don".
 
Dernière édition:

jokerfidelio

XLDnaute Occasionnel
encore un essai

VB:
Private Sub UserForm1_Initialize()
   Set CL = Création.ComboBoxLiées: CL.Plage WshBD
   Set CA = Création.ControlsAssociés: Set CA.Colonnes = CL.Colonnes
' Mettez ici une série d'instructions de la forme :
'   C?.Add Control, Colonne
' Avec:
'     C?: CA ou CL. CL doit être pris seulement pour une ComboBox dont la liste doit être
'        constituée dynamiquement en fonction de ce qui existe dans la base et de ce que
'        l'utilisateur aura déjà mis dans d'autres, semblables.
'     Control: le nom d'un contrôle. Mettre Me. devant peut vous aider à le retrouver.
'     Colonne: Le numéro d'ordre de la colonne est accepté, mais si vous avez fait subir à votre
'       plage une mise sous forme de tableau, vous pouvez spécifier le titre de la colonne.
Set CL = CLsCAs.Création.ComboBoxLiées: Set CA = CLsCAs.Création.ControlsAssociés
CL.Plage ExpressionRangeReprésentantLa1èreLigneDeVotreTableau: Set CA.Colonnes = CL.Colonnes
CL.Add Me.CBxChef, T
CL.Add Me.CBxCertif, U
CL.Add Me.CBxMontg, V
CA.Add Me.TBxDate, A
CA.Add Me.TBxNom, B
CA.Add Me.TBxPrénom, C
CA.Add Me.TBxInfLog, E
CA.Add Me.TBxCombi, H
CA.Add Me.TBxNoComb, I
CA.Add Me.TBxObserv, J
    CL.CouleurSympa
    CL.Actualiser
   End Sub
 

Dranreb

XLDnaute Barbatruc
Si vous refusez obstinément de mettre vos données sous forme de tableau, essayez en mettant les entêtes de colonnes entre doubles apostrophes. Remarque: il y a longtemps que je n'ai plus essayé ça, je ne sais plus si ça marche encore.
Le CL.Plage WshBD ne peut pas marcher non plus, même si vous avez bien renommé comme ça l'objet Worksheet qui représente la feuille, parce que si on ne spécifie que cet objet il assume automatiquement WshBD.ListObjects(1).DataBodyRange.
Le reste aussi doit être réécrit en conséquence parce que les propriétés Lignes et Colonnes des deux objets ne seront pas initialisées.

Édition: Et, LOL, je n'avais même pas vue: il faut bien évidemment remplacer ExpressionRangeReprésentantLa1èreLigneDeVotreTableau par une expression Range représentant la première ligne de votre tableau ! (comme la blague "Dites moi quelque chose", "— Quelque chose !")
À part ça, entre temps j'ai vérifié, des constantes String valant les entêtes de colonnes devraient toujours marcher. Mais ce serait quand même plus facile à maintenir, si vous décidiez par la suite d'ajouter des colonnes ou d'en changer l'ordre, si vous pouviez spécifier les titres du tableau, non ? Je vous ai déjà dit ce qu'il fallait faire pour cela.
N'avez vous pas vu que des Set CL et Set CA étaient déjà écrits au début ? Vous pouvez certes ajouter le nom de projet CLsCAs devant .Création si vous voulez, ça n'en sera que plus clair.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Aïe ! L'objet ComboBoxLiées accepte les entêtes de colonnes, mais pas l'objet ControlsAssociés, plus récent. Lui n'accepte que les numéros d'ordre des colonnes ou les titres d'un tableau. Il ne peut pas bien accepter autre chose car il ne connait actuellement pas la plage, c'est l'objet ComboBoxLiées qui la détient. Il peut en revanche retrouver les ListColumn d'un tableau d'après leurs titres grâce à sa propriété Colonnes, récupérée de celle de l'objet ComboBoxLiées tout au début.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Vous n'avez pas tout laissé tomber au moins, j'espère ?
Je vois que vous ne vous en sortez pas alors je joins quelque chose.
Beaucoup de choses me paraissent très étrange dans tout ça, à commencer par la disposition des contrôles.
Mais bon, je n'ai aucune idée de ce à quoi tout ça va servir ni comment ça doit fonctionner. Je n'ai fait que suivre ce que vous aviez commencé. J'ai mis une sécurité pour que vous ne puissiez pas saisir d'information associées avant d'avoir défini l'identification de la ligne (elles auraient été effacées de toute façon quand vous auriez spécifiés de nouveaux éléments d'identification).
 

Pièces jointes

  • CBxLCtlAAppliStd.xlsm
    31.4 KB · Affichages: 8

jokerfidelio

XLDnaute Occasionnel
bonjour non toujours présent juste pas le temps cette semaine fini les vacances !
je test des que possible
j'essaye de faire avec le tres peu de connaissance, quasi nul faut bien l'avouer,
félicitation pour les fichiers donnés plus haut, c'est du bon travail
 

Discussions similaires

Statistiques des forums

Discussions
311 711
Messages
2 081 796
Membres
101 817
dernier inscrit
carvajal