2 userform similaire dans le même fichier
Bonjour le forum,
Je souhaiterai avoir 2 userform dans mon fichier qui gère 2 onglets différent de celui-ci.
Le Userform1 est déjà en place (encore merci pour l'aide fournie pour celui-la) mais j'ai un soucis pour le second.
J'ai renommé tous les text et combo box (ajouté la dizaine et regardé qu"il n'y ai pas de doublon, idem pour les boutons mais apparemment je rate un truc.
Voici mon fichier, pouvez-vous me dire ce que je fait mal svp.
Merci d'avance
Bonjour,
Tous les objets (TextBox, Combo... ) ont été renommé différemment.
A+
Bonjour le Forum, je viens encore de passer quelques temps à regarder et tester certaines choses mais je ne vois/comprend pas mon erreur...
Bonjour Heavy_B,
Étant donné que le nombre de "Controls" du "Userform2" est plus petit que 12 ...
'Implémentation des rapports box/cellules
Private Sub UserForm_Initialize()
Dim I As Integer
Dim ctrls As Variant
Set ws2 = Sheets("Rejected deliveries overview")
ctrls = Array(Me.TextBox11, _
Me.TextBox12, _
Me.ComboBox16, _
Me.TextBox13, _
Me.ComboBox13, _
Me.ComboBox110, _
Me.TextBox16)
For I = 1 To 7 '<< 7 controls au leu de 12
ctrls(I - 1).Value = ""
Next I
...
...
...Bizz
Bonjour,
tu devrais nommer de façon parlante tes objets.
Par exemple cbx_listeTitre au lieu de Combobox1.
Ca t'évitera ce style de soucis où tu te perds, ça auto-documente le code et tu te diras merci quand tu te repencheras dessus dans 6 mois.
eric
Bonjour à tous,
En complément de ce qu'il à déjà été dit, j'ajouterais:
- VBA n’empêche pas les doublons des noms de contrôles sur deux formulaires différents.
- Puisque apparemment 365 est utilisé, pourquoi ne pas profiter de la puissance des fonction d'Excel :
- Un remplissage des listes déroulantes avec un .List = Evaluate("=TRIER(UNIQUE(Table1[Designer]))") par exemple sera plus efficace et plus parlant.
- Bien sûr on aura pris le temps de nommer ses tableaux aussi correctement que ses contrôles.
- Est-il bien utile d'utiliser deux formulaires pour aller chercher les informations de deux feuilles différentes ? un TabStrip aurait été suffisant.
- Est-il bien utile est nécessaire d'utiliser une variable publique ws pour affecter un variable Sheets.
- Pourquoi utiliser Sheets alors que c'est une Worksheet qui est appelée, Excel ne le saura qu'au dernier moment.
- Pourquoi ne pas utiliser la puissance des tableaux structurés ?
- For I = 3 To Sheets("PN request overview").Range("G65536").End(xlUp).Row. Ceci ne devrait pas exister avec des tableaux structurés.
- Découper autant que possible le code en petites fonctions réutilisables, rendra le code plus performant , plus lisible.
- L'utilisation de Byte et Integer est contre-productif sur des ordinateurs récents.
- Prendre l'habitude d'exécuter une condition au lieu de sortir d'une procédure
- If Me.ComboBox1.ListIndex = -1 Then Exit Sub Then Exit Sub ceci peu être efficacement remplacé par :
- If Me.ComboBox1.ListIndex > -1 Then...
- Le fait de décharger, puis de recharger un formulaire pour le mettre à jour démontre que le code est mal conçu. Utiliser plutôt un fonction pour mettre à jour celui-ci.
Bonjour à tous,
Pour ma part cela fonctionne... avec le code suivant. Par contre JEAN-PAUL merci pour tes explications.
Option Explicit 'Activation de la déclaration explicite des variables
Dim ws2 As Worksheet 'Variable pour un Objet Worksheet en PUBLIC pour tous les Controls de cet UserForm
Private Sub UserForm_Initialize()
Dim I As Integer
Dim ctrls As Variant
Set ws2 = Sheets("Rejected deliveries overview")
ctrls = Array(Me.TextBox11, _
Me.TextBox12, _
Me.ComboBox16, _
Me.TextBox13, _
Me.ComboBox13, _
Me.ComboBox110, _
Me.TextBox16)
For I = 1 To 7
ctrls(I - 1).Value = ""
Next I
'Recherche par PN
For I = 3 To Sheets("Rejected deliveries overview").Range("B65536").End(xlUp).Row
ComboBox11 = Sheets("Rejected deliveries overview").Range("B" & I)
If ComboBox11.ListIndex = -1 Then ComboBox11.AddItem Sheets("Rejected deliveries overview").Range("B" & I)
Next I
Me.ComboBox11 = ""
End Sub
Private Sub ComboBox11_Change()
Dim Ligne As Long
Dim I As Integer
Dim ctrls As Variant
If Me.ComboBox11.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox11.ListIndex + 3
ctrls = Array(Me.TextBox11, _
Me.TextBox12, _
Me.ComboBox16, _
Me.TextBox13, _
Me.ComboBox13, _
Me.ComboBox110, _
Me.TextBox16)
For I = 1 To 7
ctrls(I - 1).Value = ws2.Cells(Ligne, I)
Next I
End SubBonjour tout le monde,
@Bizarre,
Merci pour la correction, je débute en VBA et je n'ai pas encore toutes les connaissances/reflex pour avoir vu mon erreur. Merci.
@eriiic
Je vais suivre ton conseil et renommer mes box, merci.
@Jean-Paul
Merci pour ces précisions et astuces, je ne vais pas prétendre avoir tout compris comment faire mais je vais tenir un oeil sur ton poste et faire quelques essais. Merci.
@et1000lio
Merci aussi pour le test (en encore merci pour le code de la premiere partie).
Bref, un grand merci a vous tous pour votre aide si précieuse.