Se connecter avec
S'enregistrer | Connectez-vous

[vba] classer par ordre alphabetique (userform)

Dernière réponse : dans Programmation

Slt cette fois j'ai une question interressante
j'ai crée un répertoire telephonique en vb avec une userform.
voila le probleme ,en fait je voudrai quand je creer un nouveau numero le mettre dans la bonne feuille excel (feuil 1 -> nom commencant par a jusqua f
feuil 2 ->nom commencant par g jusqua m
...........)
pour les classer par ordre alphabetique.
voici mon code pour l'instant:
  1. Private Sub Ajouter_Click()
  2.  
  3. Dim Cel As Range
  4. Dim Cel2 As Range
  5. Dim Cel3 As Range
  6.  
  7. If Range("A2") = "" Then
  8.  
  9. Set Cel = Range("A2")
  10. Set Cel2 = Range("A2").Offset(0, 1)
  11. Set Cel3 = Range("A2").Offset(0, 2)
  12.  
  13. Else
  14.  
  15. Set Cel = Range("A1").End(xlDown).Offset(1, 0) 'pour le nom
  16. Set Cel2 = Range("A1").End(xlDown).Offset(1, 1) 'pour le numero
  17. Set Cel3 = Range("A1").End(xlDown).Offset(1, 2) 'pour le service(bouleau)
  18.  
  19. End If
  20. 'je pense que c'est ici qu'il faut choisir sur qu'elle feuille envoyer le contenu (nom,num,service)
  21. Cel = TextBoxNom
  22. Cel2 = TextBoxNum
  23. Cel3 = ComboBoxServ
  24.  
  25. End Sub

alor quelqu'un peut-il maider ?merci
Lassé par la pub ? Créez un compte

louloukg a dit :
  1. Else
  2.  
  3. Set Cel = Range("A1").End(xlDown).Offset(1, 0) 'pour le nom
  4. Set Cel2 = Range("A1").End(xlDown).Offset(1, 1) 'pour le numero
  5. Set Cel3 = Range("A1").End(xlDown).Offset(1, 2) 'pour le service(bouleau)
  6.  
  7. End If


waou là où tu bosses ils ont des bureaux en bois massif...impressionant!

je sais pas si il existe un comparateur pour l'alphabet, mais au pire tu te fait un tableau avec tout l'alphabet.

Tu met la valeur de cel dans une variable (pour pouvoir la maltraiter).
Puis tu compare la première lettre avec toutes tes premières lettres de tes feuilles.
Une fois que tu tombes sur la bonne, tu continue jusqu'au prochain changement de première lettre (comme ca tu sauras quelle limite ne pas dépasser).
après tu fais un truc du genre:
  1. nom = right(nom, Len(nom) - i)
  2. i=i+1

comme ca tu récupère la 2ème lettre et tu recommences dans l'espace restraint que tu à créer... et ainsi de suite.
quand tu as déterminé à quel numéro de ligne ca correspond, tu insères une ligne. il me semble que c'est comme ca:
  1. rows("X:X").select //ligne que tu as déterminé
  2. selection.insert shift:=xltodown
et tu y copies tes cel, cel2, cel3
Expert Programmation

Pour récupérer les lettres d'une chaîne de caractères, utilise Left, Right et surtout Mid. En particulier, l'initiale de Nom est
  1. Left(Trim(Nom),1)

Plutôt que de t'emm..der avec toutes les autre lettres, pour avoir une liste toujours triée, ajoute le nouveau à la fin et fais un tri (Sort).

ba ebcore une ptite question .Je voudrai avoir un bouton qui me chance de feullie quand je clic dessus. moi j'ai fai ca :
  1. Private Sub CommandButtonDroite_Click()
  2.  
  3. If (Worksheets("Feuille1").Select) Then
  4. Worksheets("Feuille2").Select
  5. Exit Sub
  6. End If
  7.  
  8. If (Worksheets("Feuille2").Select) Then
  9. Worksheets("Feuille3").Select
  10. Exit Sub
  11. End If
  12.  
  13. If (Worksheets("Feuille3").Select) Then
  14. Worksheets("Feuille4").Select
  15. Exit Sub
  16. End If
  17.  
  18. If (Worksheets("Feuille4").Select) Then
  19. Worksheets("Feuille1").Select
  20. Exit Sub
  21. End If
  22. End Sub

probleme c'est que ca m'envoi toujours sur la feuille2 car quand je fais du pas a pas ca passe toujours que dans le premier if.Les conditions doivent être mauvaise mais je sais pas quoi mettre .help
Expert Programmation

  1. lcase$(chaine1$)<lcase$(chaine2$)

est vrai si chaine1$ est placé avant chaine2$, le seul problème c'est que les lettres accentuées sont considérées après toute les autres lettres de l'alphabet. mais doit y avoir une fonction en vb pour virer les accents.

Citation :
Médite la dessus:
  1. Sub PageSuivante
  2. Sheets(ActiveSheet.Index Mod Sheets.Count + 1).Select
  3. End Sub


ActiveSheet.Index -> pemiere feuille ????
Sheets.Count->nombre total de feuille
est ce que c'est ca?
et j'ai essayer avec - 1 et + 3 ( j'ai 4 feuille)ca marche pas
Expert Programmation

ActiveSheet.Index -> pemiere feuille ???? :(  Non. Feuille courante.
Sheets.Count->nombre total de feuille :)  Oui
et j'ai essayer avec - 1 et + 3 ( j'ai 4 feuille)ca marche pas :(  Meuh non. modulo n est toujours compris entre 0 et n-1. Comme les feuilles sont indicées à partir de 1, je rajoute une unité.
mod : C’est le reste de la division par un nombre ? :)  Oui.
est ce possible de faire defiler les feuilles dans l'autre sens ? :)  Oui
Expert Programmation

Défiler dans l'autre sens !
Ce n'est pas un problème de VBA mais de logique et d'algorithme :o 
Cela reste de la programmation ;) 

  1. Sub PagePrecedente
  2. Sheets((Sheets.Count + ActiveSheet.Index - 1) Mod Sheets.Count + 1).Select
  3. End Sub

et pour trier par ordre alphabetique j'ai trouvé ca :
  1. Columns("A:A").Select
  2. Range("A2:C100").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _
  3. xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
  4. DataOption1:=xlSortNormal

encore une question est ce possible de creer un tableau pour lire sur plusieur feuilles.j'y arrive que sur une feuille
  1. Worksheets("A-F").Select
  2. Dim i As Integer
  3. Dim Repertoire(0 To 100, 1 To 3) As String
  4. For i = 0 To NbreCase
  5. Repertoire(i, 1) = Range("A1").Offset(i)
  6. Repertoire(i, 2) = Range("B1").Offset(i)
  7. Repertoire(i, 3) = Range("C1").Offset(i)
  8. Next i
  9. ListBoxListeRep1.List = Repertoire


help please
Expert Programmation

Oups.
sheet est peut être un mot réservé.
Essaie plutôt

  1. Dim j as Integer 'Sheet
  2. Dim i as Integer 'Case
  3. For s = 1 to 6 do
  4. For i = 0 To NbreCase
  5. ..


C'est mieux ?

comme ca sa marchera jamais faut que je passe dans chaque feuille tu crois pas que ca marcherai mieu si je faisai un truc du genre :
for each sheet
parce que j'ai fais sa et sa marche pas
  1. Dim Repertoire11(0 To 100, 1 To 3) As String
  2. Dim i11 As Integer
  3. Dim i12 As Integer
  4. For i12 = 1 To 4
  5. For i11 = 0 To NbreCase
  6. Repertoire11(i11, 1) = Sheets(i12).Range("A1").Offset(i11)
  7. Repertoire11(i11, 2) = Sheets(i12).Range("B1").Offset(i11)
  8. Repertoire11(i11, 3) = Sheets(i12).Range("C1").Offset(i11)
  9. Next
  10. Next
  11. ListBoxListeRep1.List = Repertoire11
Expert Programmation

For Each est une bonne idée.

Mais quand tu dis que ça ne marche pas, ce n'est pas à cause de la boucle. Merci de mettre des points d'arrêt dans ton code et/ou d'afficher le contenu de Repertoire11 à la fin, et de constater que le problème vient du fait que :
1° tu écrases les données de la première feuille avec la seconde, celles de la seconde avec la troisième, etc.
2° je vérifierais le type de liste qu'attend ListBoxListeRep1.List

Concernant le point 1°, la valeur de NbreCase est-elle différente selon la feuille ?
Lassé par la pub ? Créez un compte