XL 2021 Alimenter une ComboBox dans l'ordre décroissant

murainesouspatate

XLDnaute Occasionnel
Bonjour à tous et à toutes,

Je cherche à alimenter un ComboBox dans l'ordre décroissant. J'ai beau regarder sur le forum mais ne comprends pas très bien comment modifier mon code.
J'alimente mon ComboBox4 avec la colonne A de ma feuille " Enregistrement Facture" et cela m'affiche toujours dans l'ordre croissant mes N° de factures.

Auriez-vous l'amabilité de m'indiquer comment modifier le code .

Je place en pièce jointe les images de ma ComboBox4 avec son code , ainsi que celle de ma feuille Enregistrement Facture.

Je vous remercie par avance de votre aide et vous souhaite de bonnes fêtes de fin d'année.

Cordialement.
 

Pièces jointes

  • UserForm4.jpg
    UserForm4.jpg
    141.1 KB · Affichages: 11
  • Feuille enregistrement Facture.jpg
    Feuille enregistrement Facture.jpg
    300.3 KB · Affichages: 11

murainesouspatate

XLDnaute Occasionnel
Re @murainesouspatate :),

Dans mon précédent message, je m'étais fait plaisir en rajoutant le numéro de ligne dans la ComboBox1.

Mais il a une solution plus directe (et plus simple mais moins drôle) qui ne nécessite pas la modification de remplissage de la ComboBox1.

En fait à chaque fois qu'on a besoin de lire ou d'écrire des données de la facture sélectionnée dans ComboBox1, on redétermine le numéro de cette ligne (dans la feuille "Enregistrement Facture" repérée par F). Ainsi même si quelqu'un entre temps a mélangé ou trié les lignes de F, on a toujours la bonne ligne pour la facture sélectionnée.

Pour cela, on va utiliser le principe de la formule Excel EQUIV(). On recherche le numéro de facture sélectionnée (NumFact = Combobox1) dans la première colonne de F. EQUIV() va directement nous donner le bon numéro de ligne =EQUIV(numfact , F.Columns("a:a") , 0).

Mais il se peut que la ligne de la facture n'existe plus ou bien qu'aucune facture n'est été sélectionnée. Dans ce cas, EQUIV(...) renverra une erreur. Pour éviter de renvoyer une erreur, on englobe EQUIV(...) dans un SIERREUR(EQUIV(...), 0 ) qui renverra 0 dans le cas où la ligne n'a pas été trouvée. Ce qui donne pour la formule :
=SIERREUR( EQUIV(NumFact , F.Columns("a:a") , 0), 0 )

Mais cette formule est une formule EXCEL et non pas VBA.
La conversion pour VBA est relativement simple (mais en anglais car VBA est d'origine US). EQUIV correspond à Match et SIERREUR correspond à IfError. Cela donne :
VB:
   NumFact = Me.ComboBox1                            ' le numéro de facture cliqué dans ComboBox1
   Set F = Sheets("Enregistrement Facture")                         ' feuille "Enregistrement Facture"
   For i = 1 To 6: Me.Controls("Textbox" & i) = "": Next i      ' Effacement des TextBox de 1  à 6
   ' ligne de la facture sélectionnée dans "Enregistrement Facture"
   ligne = Application.IfError(Application.Match(NumFact, F.Columns("a:a"), 0), 0)

Donc ligne est soit le numéro de ligne de NumFact soit vaut 0 si la facture n'a pas été trouvée.

On peut donc ensuite agir dans chacun des cas :
VB:
   If ligne = 0 Then    ' la ligne de la facture n'existe pas ou n'existe plus
      ' action pas facture
      ...
   Else                 ' la ligne de la facture n'existe pas ou n'existe plus plus
      ' action quand la ligne de la facture existe
      ...
   End If

Voir le code complet commenté de Userform4 dans le classeur joint.

nota : j'ai supprimé le fond de page de la feuille 'Accueil" qui alourdissait (inutilement) le classeur à pratiquement la limite maximum autorisée pour la taille des fichiers sur XLD (soit 1 Mo).
Merci beaucoup
 

Discussions similaires

Réponses
10
Affichages
715
Réponses
4
Affichages
711

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
315 246
Messages
2 117 750
Membres
113 300
dernier inscrit
faby79