* Bug affichage ComboBox suite effacement *

David69400

XLDnaute Junior
Bonsoir/Bonjour

selon l'heure à laquelle vous lirer le message.:p

C'est un petit post simple qui j'espère attirera l'attention d'un membre du forum:

Quand j'efface une combobox1 dans mon UF "Modification Magasin Existant", j'ai les entêtes de mes sources des listes des autre combobox qui apparaissent...
cf Image jointe pour mieux saisir.

Bug COMBOBOX effacé 2105.jpg

Comment éviter cela ?:confused:

Merci d'avance pour l'attention que vous porterez à ma demande

David

fichier joint
 

Pièces jointes

  • 2 UF 220514.xlsm
    158.8 KB · Affichages: 31
  • 2 UF 220514.xlsm
    158.8 KB · Affichages: 33
  • 2 UF 220514.xlsm
    158.8 KB · Affichages: 37

Robert

XLDnaute Barbatruc
Repose en paix
Re : * Bug affichage ComboBox suite effacement *

Bonsoir David, Zeltron, bonsoir le forum,

J'ai rajouté ces quelques lignes de code dans la procédure Change de la ComboBox1
Code:
Dim CTRL As Control 'déclare la variable CTRL (ConTRôLe)

If Me.ComboBox1.Value = "" Then 'condition : si la CombObox1 est vide
    For Each CTRL In Me.Controls 'boucle sur tous les contrôle de l'UserForm
        'si le contrôle est une combobox ou une textbox, vide le contrôle
        If TypeOf CTRL Is MSForms.TextBox Or TypeOf CTRL Is MSForms.ComboBox Then CTRL.Value = ""
    Next CTRL 'prochain contrôle de la boucle
    Exit Sub 'sort de la procédure
End If 'fin de la condition
Le code complet :
Code:
Private Sub ComboBox1_Change() ' #CHOIX d'un magasin existant
Dim CTRL As Control 'déclare la variable CTRL (ConTRôLe)

If Me.ComboBox1.Value = "" Then 'condition : si la CombObox1 est vide
    For Each CTRL In Me.Controls 'boucle sur tous les contrôle de l'UserForm
        'si le contrôle est une combobox ou une textbox, vide le contrôle
        If TypeOf CTRL Is MSForms.TextBox Or TypeOf CTRL Is MSForms.ComboBox Then CTRL.Value = ""
    Next CTRL 'prochain contrôle de la boucle
    Exit Sub 'sort de la procédure
End If 'fin de la condition
LI = Me.ComboBox1.ListIndex + 3 'définit la ligne LI sur la base du choix du magasin existant
LII = DL + 1 'définit la ligne LII comme nouvel ligne après la dernière ligne
Me.TextBox1.Value = Me.ComboBox1 ' la Tebox1 recoit la valeur sélectionnée dans la ComboBox1 dans la colonne A
For I = 2 To 4 'boucle sur les comboboxes 2 à 4
    'récupère la donnée correspondante pour les COmboBox 2 à 4 dans les colonnes B à E
    Me.Controls("ComboBox" & I).Value = O.Cells(LI, I).Value
Next I 'prochaine combobox de la boucle
End Sub
Comme tu remarqueras, utuliser me.Controls("ComboBox" & i)... n'est intéressant que si on boucle sur les contrôles. Sinon autant simplifier par me.ComboBox1...
Ton fichier simplifié :
 

Pièces jointes

  • David_v02.xlsm
    132.8 KB · Affichages: 32

David69400

XLDnaute Junior
Re : * Bug affichage ComboBox suite effacement *

Bonjour Zeltron et Robert,

Merci à vous deux pour la contribution qui a résolu ma demande !!!

La solution de Zeltron était très pragmatique et l'ajout de Robert a fortifié le tout.


Merci bien a Robert d'avoir repris le code de cet UF, j'ai vu que vous avez simplifier pas mal de lignes.
Avec tout le respect que je vous prie de croire, je vous écris les remarques qui me sont venues à l'esprit en lisant ces modifications.

J'ai bien noté que
utuliser me.Controls("ComboBox" & i)... n'est intéressant que si on boucle sur les contrôles. Sinon autant simplifier par me.ComboBox1...
; je suis vraiment débutant en VBA et j'ai une approche empirique.
Il me semblait que sortir le "I" avait le défaut d'allonger le code mais d'en faciliter la modification ie simplement changer Le I en début de ligne, et pas aller chercher dans les lignes inférieures

ex : dans le code ci-dessous, je change 1 fois le i pour les lignes en dessous..

i = 1
If Not IsDate(Me.Controls("Textbox" & i).Value) Then
MsgBox "Le format de la date est incorrect ou la date est manquante, veuillez la saisir de la manière suivante: JJMMAA ", vbExclamation
Me.Controls("Textbox" & i).Value = ""
Cancel = True
Exit Sub
End If


Ensuite, je suis conscient que j'avais un style de code "aéré" avec des sauts de lignes et tabulations, mais comme je suis novice, cela me permet de bien lire le code et la descente avec les tabulations..
j'ai remarqué que Robert, vous avez plutôt un style plus "dense" qui a l'avantage de tenir moins de place, mais pour moi en tout cas, plus difficile de lecture...
Une question : est que les lignes "vides'' et les tabulations ralentissent la lecture du code lors de l’exécution du programme ?


J'ai aussi remarqué que Robert, vous avez sorti
Private I As Byte 'déclare la variable I
en déclaration de début de code.
Est ce que
Dim CTRL As Control 'déclare la variable CTRL (ConTRôLe)
pourrait aussi se déclarer en début, comme une liste de course pour toute la page ?


Voilà, merci encore pour votre aide et avec plaisir pour échanger


DAvid (apprentiVBA)
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : * Bug affichage ComboBox suite effacement *

Bonjour le fil, bonjour le forum,

Non, je te rassure David, le style aéré ne ralenti pas le code mais c'est juste que moi je perds beaucoup de temps à parcourir le code alors je condense. Mais fait comme toi tu préfères !

Pour la déclaration des variables, Je les place en haut du module en Private quand elles sont est utilisées par plusieurs procédures du module. Par exemple, à l'initialisation d'une Userform, je définis la variable O (Onglet) par :
Code:
Set O = Sheets("Feuil1")
Le fait de l'avoir déclarée en haut de module avec :
Code:
Private O as Object
me permet, dans n'importe quelle procédure, d'utiliser O, à la place de Sheets("Feuil1")...
Je place aussi en haut de module des variables qui sont utilisées souvent dans le code et réinitialisées à chaque fois. La plupart du temps dans des boucles :
Private I as Integer me permet de boucler sur une variable dans plusieurs porcédures For I= 1 to ... sans avoir à la déclarer dans chaque procédure.
j'ai plus ton fichier en tête mais si la variable CTRL n'est utilisée que dans une seule procédure ou si elle n'est pas réinitialisée il vaut mieux la déclarer dans la procédure avec Dim...
 
Dernière édition:

Statistiques des forums

Discussions
312 196
Messages
2 086 102
Membres
103 117
dernier inscrit
augustin.morille