Liste de chiffre
Résolu/Fermé
A voir également:
- Liste de chiffre
- Liste déroulante excel - Guide
- Excel trier par ordre croissant chiffre - Guide
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Liste déroulante en cascade - Guide
- Application pour écrire les chiffre en lettre - Télécharger - Outils professionnels
5 réponses
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
17 avril 2015 à 13:17
17 avril 2015 à 13:17
Bonjour tout le monde,
Comment va Le Pivert?
Un autre exemple, récursif celui-ci :
Comment va Le Pivert?
Un autre exemple, récursif celui-ci :
Dim Tb(), IndTab As Long Sub Combinaisons() Dim strTab As String 'initialisation variables Erase Tb IndTab = 0 strTab = UCase(InputBox("Saisissez les éléments : ", "Saisie", "1234")) 'lancement procédure récursive Combiner strTab, "" 'restitution des données Range("A2").Resize(UBound(Tb) + 1) = Application.Transpose(Tb) End Sub Sub Combiner(strText As String, debut As String) Dim i As Integer If Len(strText) = 1 Then ReDim Preserve Tb(IndTab) Tb(IndTab) = debut & strText IndTab = IndTab + 1 Else For i = 1 To Len(strText) Combiner Mid(strText, 2, Len(strText) - 1), debut & Mid(strText, 1, 1) strText = Mid(strText, 2, Len(strText) - 1) & Mid(strText, 1, 1) Next End If End Sub
cs_Le Pivert
Messages postés
7904
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
14 août 2024
729
17 avril 2015 à 12:09
17 avril 2015 à 12:09
Bonjour,
En vba:
En vba:
Public Sub combinaison() Dim intI1 As Integer, intI2 As Integer, intI3 As Integer Dim intI4 As Integer, intI5 As Integer, intI6 As Integer, intN As Integer Dim strTab As String Dim sngChrono As Single strTab = UCase(InputBox("Saisissez les éléments : ", "Saisie", "1234")) intI1 = 1 Do Until Cells(1, intI1).Value = "" intI1 = intI1 + 1 Loop Cells(1, intI1).Select intN = Len(strTab) ActiveCell.Value = strTab For intI1 = 1 To intN For intI2 = 1 To intN If intI2 <> intI1 Then For intI3 = 1 To intN If intI3 <> intI1 And intI3 <> intI2 Then If Len(strTab) = 3 Then ActiveCell.Value = Mid(strTab, intI1, 1) & Mid(strTab, intI2, 1) & Mid(strTab, intI3, 1) ActiveCell.Offset(1, 0).Select Else For intI4 = 1 To intN If intI4 <> intI1 And intI4 <> intI2 And intI4 <> intI3 Then If Len(strTab) > 4 Then For intI5 = 1 To intN If intI5 <> intI1 And intI5 <> intI2 And intI5 <> intI3 And intI5 <> intI4 Then If Len(strTab) > 5 Then For intI6 = 1 To intN If intI6 <> intI1 And intI6 <> intI2 And intI6 <> intI3 And intI6 <> intI4 And intI6 <> intI5 Then ActiveCell.Value = Mid(strTab, intI1, 1) & Mid(strTab, intI2, 1) & Mid(strTab, intI3, 1) _ & Mid(strTab, intI4, 1) & Mid(strTab, intI5, 1) & Mid(strTab, intI6, 1) ActiveCell.Offset(1, 0).Select End If Next Else ActiveCell.Value = Mid(strTab, intI1, 1) & Mid(strTab, intI2, 1) & Mid(strTab, intI3, 1) _ & Mid(strTab, intI4, 1) & Mid(strTab, intI5, 1) ActiveCell.Offset(1, 0).Select End If End If Next Else ActiveCell.Value = Mid(strTab, intI1, 1) & Mid(strTab, intI2, 1) & Mid(strTab, intI3, 1) & Mid(strTab, intI4, 1) ActiveCell.Offset(1, 0).Select End If End If Next End If End If Next End If Next Next End Sub
Merci beaucoup cs_Le Pivert et pijaku c'est exactement ce qu'il me fallait, il faut juste que j'arrange le code de pijaku car tu affiche la ligne dans une cellule et mois je voudrais que chaque nombre soit dans une cellule et une fois qui'il a finit de faire la ligne il passe en dessous mais merci vous m'avez été d'une grande aide
Par contre j'ai un petit problème quand je rentre 12345678 cela fonctionne parfaitement mais quand je rentre 123456789 il me met qu'il y a une comparabilité de type savez vous d'ou cela peut provenir et quand je met des lettre il trouve rien .
Par contre j'ai un petit problème quand je rentre 12345678 cela fonctionne parfaitement mais quand je rentre 123456789 il me met qu'il y a une comparabilité de type savez vous d'ou cela peut provenir et quand je met des lettre il trouve rien .
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
17 avril 2015 à 14:59
17 avril 2015 à 14:59
Pas de souci.
Suffit de Mmodifier la Sub Combinaison comme suit :
Suffit de Mmodifier la Sub Combinaison comme suit :
Sub Combinaisons() Dim strTab As String, Tab_Out(), i As Long, j As Byte 'initialisation variables Erase Tb IndTab = 0 strTab = UCase(InputBox("Saisissez les éléments : ", "Saisie", "12345")) 'lancement procédure récursive Combiner strTab, "" ReDim Preserve Tab_Out(1 To Len(strTab), 1 To IndTab) For i = 0 To UBound(Tb) For j = 1 To Len(strTab) Tab_Out(j, i + 1) = Mid(Tb(i), j, 1) Next j Next i 'restitution des données Range("A2").Resize(UBound(Tb) + 1, Len(strTab)) = Application.Transpose(Tab_Out) End Sub
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
Modifié par pijaku le 17/04/2015 à 15:28
Modifié par pijaku le 17/04/2015 à 15:28
Pour ton second souci, nous étions parti sur une procédure permettant la permutation de 4-5 chiffres...
Le nombre de permutation, si tu mets 10 caractères devient beaucoup plus important. Ce qui bloque alors c'est la méthode Transpose. Celle-ci est bloquée à un peu plus de 65000 "lignes", nombre de lignes max pour Excel < 2007.
Pour plus de permutations, il convient alors de créer ta propre petite fonction de transposition de tableau.
ATTENTION, tu seras de toutes manières limité à un certain nombre de caractères...
Comme ceci (je te remet le tout comme ça tu n'as plus qu'un copié/collé à faire) :
🎼 Cordialement,
Franck 🎶
Le nombre de permutation, si tu mets 10 caractères devient beaucoup plus important. Ce qui bloque alors c'est la méthode Transpose. Celle-ci est bloquée à un peu plus de 65000 "lignes", nombre de lignes max pour Excel < 2007.
Pour plus de permutations, il convient alors de créer ta propre petite fonction de transposition de tableau.
ATTENTION, tu seras de toutes manières limité à un certain nombre de caractères...
Comme ceci (je te remet le tout comme ça tu n'as plus qu'un copié/collé à faire) :
Dim Tb(), IndTab As Long Sub Combinaisons() Dim strTab As String, Tab_Out(), Tb_Fin(), i As Long, j As Byte 'initialisation variables Erase Tb IndTab = 0 strTab = UCase(InputBox("Saisissez les éléments : ", "Saisie", "12345")) 'lancement procédure récursive Combiner strTab, "" 'séparation des caractères ReDim Preserve Tab_Out(1 To Len(strTab), 1 To IndTab) For i = 0 To UBound(Tb) For j = 1 To Len(strTab) Tab_Out(j, i + 1) = Mid(Tb(i), j, 1) Next j Next i 'restitution des données ReDim Preserve Tb_Fin(UBound(Tb) + 1, Len(strTab)) Range("A2").Resize(UBound(Tb) + 1, Len(strTab) + 1) = Transposition(Tab_Out, Tb_Fin) End Sub Sub Combiner(strText As String, debut As String) Dim i As Integer If Len(strText) = 1 Then ReDim Preserve Tb(IndTab) Tb(IndTab) = debut & strText IndTab = IndTab + 1 Else For i = 1 To Len(strText) Combiner Mid(strText, 2, Len(strText) - 1), debut & Mid(strText, 1, 1) strText = Mid(strText, 2, Len(strText) - 1) & Mid(strText, 1, 1) Next End If End Sub Function Transposition(Tb_Out, T_Fin) As Variant Dim i As Long, j As Long For j = LBound(Tb_Out, 1) To UBound(Tb_Out, 1) For i = LBound(Tb_Out, 2) To UBound(Tb_Out, 2) T_Fin(i, j) = Tb_Out(j, i) Next i Next j Transposition = T_Fin End Function
🎼 Cordialement,
Franck 🎶
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Merci beaucoup mais j'ai peut etre trouver une alternative genre j'en calcul 2000 que je met dans la feuille et vu que j'ai des calcul a effectuer j'effectue mes calcul j'efface tout dont je n'ai pas besoin et j'en recalcul 2000 et ainsi de suit juste attend de tout finir les possiilité
cordialement
cordialement
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
17 avril 2015 à 16:29
17 avril 2015 à 16:29
Pourquoi une alternative?
Ma procédure calcule toutes les possibilités en une fois...
As tu au moins testé la dernière version?
Cela peut être un peu long, mais c'est normal au vu des combinaisons.
exemple sur ma machine :
Toutes les combinaisons de : azertyuio (9 caractères) : nb combinaisons = 362 879, en 35 secondes...
Ma procédure calcule toutes les possibilités en une fois...
As tu au moins testé la dernière version?
Cela peut être un peu long, mais c'est normal au vu des combinaisons.
exemple sur ma machine :
Toutes les combinaisons de : azertyuio (9 caractères) : nb combinaisons = 362 879, en 35 secondes...
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
>
Deudeu
17 avril 2015 à 16:45
17 avril 2015 à 16:45
Non non, tu ne te trompes pas.
Par contre, avec 20 caractères tu as 2 432 902 008 176 640 000 combinaisons. En les faisant par 2 000, ça te fais 1 216 451 004 098 320 fois à raison de 1 centièmes de secondes à chaque fois (et je compte rapide là...), cela va te prendre environ 14 millions de jours.
A moins que je ne me trompe...
Par contre, avec 20 caractères tu as 2 432 902 008 176 640 000 combinaisons. En les faisant par 2 000, ça te fais 1 216 451 004 098 320 fois à raison de 1 centièmes de secondes à chaque fois (et je compte rapide là...), cela va te prendre environ 14 millions de jours.
A moins que je ne me trompe...
Deudeu
>
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
17 avril 2015 à 17:52
17 avril 2015 à 17:52
Bah c'est un exemple 2000 en gros je veux découpez en plusieurs fois pour pourvoir effectuer toute les possibilité
Tu pense que les 20 caractère je peux tout faire d'un coût ?
Tu pense que les 20 caractère je peux tout faire d'un coût ?
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
>
Deudeu
18 avril 2015 à 09:35
18 avril 2015 à 09:35
Je penses que 20-25-26 caractères tu peux oublier VBA.
Essaye cette procédure pour chronométrer 10 caractères :
Pour t'en persuader essaye également la procédure du Pivert avec 10 caractères...
En fait, pourquoi VBA donnerai la possibilité de traiter plus de valeurs qu'il ne contient de lignes? Tu peux tester avec 9 caractères (360 000 combinaisons), le résultat sera calculé en 5-6 secondes. Pour 10 (3 600 000 combinaisons soit 3 fois plus que de lignes dans une feuille excel) la macro mettra un peu plus d'une minute.
Maintenant plus tu va augmenter le nombre de caractères plus le temps va augmenter, de manière exponentielle (12 minutes pour 11 caractères, 2h20 pour 12, 1 jour et demi pour 13, 20 jours pour 14, 10 mois pour 15, 13 ans et 4 mois pour 16, 225 ans et 3 mois pour 17 caractères (j'arrête là???), 4 054 ans et demi pour 18 caractères, etc...).
Si tu veux vraiment connaitre toutes les combinaisons d'une chaine de 25-26 caractères, il te faut :
1- envisager un autre langage de prog.
2- bosser avec un autre algo que ceux donnés ici.
3- acheter un très très très bon (puissant) ordinateur.
C'est toutefois réalisable, du moins sur le papier.
Essaye cette procédure pour chronométrer 10 caractères :
Dim Tb(), IndTab As Long Sub Combinaisons() Dim strTab As String, Tab_Out(), Tb_Fin(), i As Long, j As Byte, t As Single 'initialisation variables t = Timer Erase Tb IndTab = 0 strTab = "1234567890" 'UCase(InputBox("Saisissez les éléments : ", "Saisie", "12345")) 'lancement procédure récursive Combiner strTab, "" 'séparation des caractères ReDim Preserve Tab_Out(1 To Len(strTab), 1 To IndTab) For i = 0 To UBound(Tb) For j = 1 To Len(strTab) Tab_Out(j, i + 1) = Mid(Tb(i), j, 1) Next j Next i MsgBox Timer - t 'restitution des données 'ReDim Preserve Tb_Fin(UBound(Tb) + 1, Len(strTab)) 'Range("A2").Resize(UBound(Tb) + 1, Len(strTab) + 1) = Transposition(Tab_Out, Tb_Fin) End Sub Sub Combiner(strText As String, debut As String) Dim i As Integer If Len(strText) = 1 Then ReDim Preserve Tb(IndTab) Tb(IndTab) = debut & strText IndTab = IndTab + 1 Else For i = 1 To Len(strText) Combiner Mid(strText, 2, Len(strText) - 1), debut & Mid(strText, 1, 1) strText = Mid(strText, 2, Len(strText) - 1) & Mid(strText, 1, 1) Next End If End Sub Function Transposition(Tb_Out, T_Fin) As Variant Dim i As Long, j As Long For j = LBound(Tb_Out, 1) To UBound(Tb_Out, 1) For i = LBound(Tb_Out, 2) To UBound(Tb_Out, 2) T_Fin(i, j) = Tb_Out(j, i) Next i Next j Transposition = T_Fin End Function
Pour t'en persuader essaye également la procédure du Pivert avec 10 caractères...
En fait, pourquoi VBA donnerai la possibilité de traiter plus de valeurs qu'il ne contient de lignes? Tu peux tester avec 9 caractères (360 000 combinaisons), le résultat sera calculé en 5-6 secondes. Pour 10 (3 600 000 combinaisons soit 3 fois plus que de lignes dans une feuille excel) la macro mettra un peu plus d'une minute.
Maintenant plus tu va augmenter le nombre de caractères plus le temps va augmenter, de manière exponentielle (12 minutes pour 11 caractères, 2h20 pour 12, 1 jour et demi pour 13, 20 jours pour 14, 10 mois pour 15, 13 ans et 4 mois pour 16, 225 ans et 3 mois pour 17 caractères (j'arrête là???), 4 054 ans et demi pour 18 caractères, etc...).
Si tu veux vraiment connaitre toutes les combinaisons d'une chaine de 25-26 caractères, il te faut :
1- envisager un autre langage de prog.
2- bosser avec un autre algo que ceux donnés ici.
3- acheter un très très très bon (puissant) ordinateur.
C'est toutefois réalisable, du moins sur le papier.