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.
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).