Combinaisons de lettres (toutes)

herve80

XLDnaute Occasionnel
Bonjour et bonne semaine à tous / toutes,

Vous êtes géniaux (du moins si vous m'aidez hein ;) )

Voilà le problème :
Voulant retenir une série de mots, je décide de former un mot à partir de chaque initiale des mots. Ex: AMOUR pour A comme Amitié, M comme Moi, etc ...

Donc, auriez-vous un programme pour avoir toutes les combinaisons possibles d'une série de lettres (disons 7 lettres) ?

Ex: en A1 si il y a ATB, alors A3 affiche par ex ABT
A4 TAB
A5 BTA
A6 ATB

Merci d'avance pour ce coup de main
Pascal
 

13GIBE59

XLDnaute Accro
Re : Combinaisons de lettres (toutes)

Bonjour Hervé.

A tester ce truc déniché sur internet : (un peu long, mais bon...)

Comment faire pour afficher ou calculer toutes les combinaisons et toutes les permutations ?

Un ensemble de procédures de Myrna Larson permet de faire aussi bien la liste des combinaisons que des permutations (malgré le nom de la procédure principale "ListPermutations" qui pourrait laisser croire qu'elle laisse les combinaisons de côté).

Ci-dessous le code, avec mode d'emploi, à recopier dans un module standard.

Voici une diabolique procédure pour mettre définitivement fin aux questions concernant les
listes de combinaisons ou de permutations de R éléments choisis parmi N.

Pour l'utiliser :
1. En A1, écrire c ou p ; (Combinaison ou Permutation)
2. En A2, écrire la valeur de R ;
3. Sous A2, écrire la liste des N éléments ;
4. Sélectionner A1 et activer la procédure.

'Exemple:
A1 c
A2 3
A3 1
A4 2
A5 Excel
A6 4
A7 *
A8 6

La procédure donne alors la liste de toutes les combinaisons
possibles de 3 éléments choisis parmi 6.


Option Explicit

Dim vAllItems As Variant
Dim Buffer() As String
Dim BufferPtr As Long
Dim Results As Worksheet

Sub ListPermutations()
Dim Rng As Range
Dim PopSize As Integer
Dim SetSize As Integer
Dim Which As String
Dim N As Double
Const BufferSize As Long = 4096

Set Rng = Selection.Columns(1).Cells
If Rng.Cells.Count = 1 Then
Set Rng = Range(Rng, Rng.End(xlDown))
End If

PopSize = Rng.Cells.Count - 2
If PopSize < 2 Then GoTo DataError

SetSize = Rng.Cells(2).Value
If SetSize > PopSize Then GoTo DataError

Which = UCase$(Rng.Cells(1).Value)
Select Case Which
Case "C"
N = Application.WorksheetFunction.Combin(PopSize, SetSize)
Case "P"
N = Application.WorksheetFunction.Permut(PopSize, SetSize)
Case Else
GoTo DataError
End Select
If N > Cells.Count Then GoTo DataError

Application.ScreenUpdating = False

Set Results = Worksheets.Add

vAllItems = Rng.Offset(2, 0).Resize(PopSize).Value
ReDim Buffer(1 To BufferSize) As String
BufferPtr = 0

If Which = "C" Then
AddCombination PopSize, SetSize
Else
AddPermutation PopSize, SetSize
End If
vAllItems = 0

Application.ScreenUpdating = True
Exit Sub

DataError:
If N = 0 Then
Which = "Enter your data in a vertical range of at least 4 cells. " _
& String$(2, 10) _
& "Top cell must contain the letter C or P, 2nd cell is the number" _
& "of items in a subset, the cells below are the values from which" _
& "the subset is to be chosen."
Else
Which = "This requires " & Format$(N, "#,##0") & _
" cells, more than are available on the worksheet!"
End If
MsgBox Which, vbOKOnly, "DATA ERROR"
Exit Sub
End Sub

Private Sub AddPermutation(Optional PopSize As Integer = 0, _
Optional SetSize As Integer = 0, _
Optional NextMember As Integer = 0)

Static iPopSize As Integer
Static iSetSize As Integer
Static SetMembers() As Integer
Static Used() As Integer
Dim i As Integer

If PopSize <> 0 Then
iPopSize = PopSize
iSetSize = SetSize
ReDim SetMembers(1 To iSetSize) As Integer
ReDim Used(1 To iPopSize) As Integer
NextMember = 1
End If

For i = 1 To iPopSize
If Used(i) = 0 Then
SetMembers(NextMember) = i
If NextMember <> iSetSize Then
Used(i) = True
AddPermutation , , NextMember + 1
Used(i) = False
Else
SavePermutation SetMembers()
End If
End If
Next i

If NextMember = 1 Then
SavePermutation SetMembers(), True
Erase SetMembers
Erase Used
End If

End Sub 'AddPermutation

Private Sub AddCombination(Optional PopSize As Integer = 0, _
Optional SetSize As Integer = 0, _
Optional NextMember As Integer = 0, _
Optional NextItem As Integer = 0)

Static iPopSize As Integer
Static iSetSize As Integer
Static SetMembers() As Integer
Dim i As Integer

If PopSize <> 0 Then
iPopSize = PopSize
iSetSize = SetSize
ReDim SetMembers(1 To iSetSize) As Integer
NextMember = 1
NextItem = 1
End If

For i = NextItem To iPopSize
SetMembers(NextMember) = i
If NextMember <> iSetSize Then
AddCombination , , NextMember + 1, i + 1
Else
SavePermutation SetMembers()
End If
Next i

If NextMember = 1 Then
SavePermutation SetMembers(), True
Erase SetMembers
End If

End Sub 'AddCombination

Private Sub SavePermutation(ItemsChosen() As Integer, _
Optional FlushBuffer As Boolean = False)

Dim i As Integer, sValue As String
Static RowNum As Long, ColNum As Long

If RowNum = 0 Then RowNum = 1
If ColNum = 0 Then ColNum = 1

If FlushBuffer = True Or BufferPtr = UBound(Buffer()) Then
If BufferPtr > 0 Then
If (RowNum + BufferPtr - 1) > Rows.Count Then
RowNum = 1
ColNum = ColNum + 1
If ColNum > 256 Then Exit Sub
End If

Results.Cells(RowNum, ColNum).Resize(BufferPtr, 1).Value _
= Application.WorksheetFunction.Transpose(Buffer())
RowNum = RowNum + BufferPtr
End If

BufferPtr = 0
If FlushBuffer = True Then
Erase Buffer
RowNum = 0
ColNum = 0
Exit Sub
Else
ReDim Buffer(1 To UBound(Buffer))
End If

End If

'construct the next set
For i = 1 To UBound(ItemsChosen)
sValue = sValue & ", " & vAllItems(ItemsChosen(i), 1)
Next i

'and save it in the buffer
BufferPtr = BufferPtr + 1
Buffer(BufferPtr) = Mid$(sValue, 3)
End Sub 'SavePermutation
 

Staple1600

XLDnaute Barbatruc
Re : Combinaisons de lettres (toutes)

Bonjour à tous

Voici un autre code VBA

Lancer la macro GetString
puis saisier par exemple ABCD dans l'InpuBox

source: John Walkenbach
Code:
[FONT=Courier New][COLOR=darkblue]Dim[/COLOR] CurrentRow

[COLOR=darkblue]Sub[/COLOR] GetString()
    [COLOR=darkblue]Dim[/COLOR] InString [COLOR=darkblue]As[/COLOR] String
    InString = InputBox("Enter text to permute:")
    [COLOR=darkblue]If[/COLOR] Len(InString) < 2 [COLOR=darkblue]Then[/COLOR] [COLOR=darkblue]Exit[/COLOR] [COLOR=darkblue]Sub[/COLOR]
    [COLOR=darkblue]If[/COLOR] Len(In[COLOR=darkblue]String[/COLOR]) >= 8 [COLOR=darkblue]Then[/COLOR]
        MsgBox "Too many permutations!"
        [COLOR=darkblue]Exit[/COLOR] [COLOR=darkblue]Sub[/COLOR]
    [COLOR=darkblue]Else[/COLOR]
        ActiveSheet.Columns(1).Clear
        CurrentRow = 1
        [COLOR=darkblue]Call[/COLOR] GetPermutation("", In[COLOR=darkblue]String[/COLOR])
    [COLOR=darkblue]End[/COLOR] [COLOR=darkblue]If[/COLOR]
[COLOR=darkblue]End[/COLOR] [COLOR=darkblue]Sub[/COLOR]

[COLOR=darkblue]Sub[/COLOR] GetPermutation(x [COLOR=darkblue]As[/COLOR] String, y [COLOR=darkblue]As[/COLOR] String)
[COLOR=green]'   The source of this algorithm is unknown[/COLOR]
    [COLOR=darkblue]Dim[/COLOR] i [COLOR=darkblue]As[/COLOR] [COLOR=darkblue]Integer[/COLOR], j [COLOR=darkblue]As[/COLOR] [COLOR=darkblue]Integer[/COLOR]
    j = Len(y)
    [COLOR=darkblue]If[/COLOR] j < 2 [COLOR=darkblue]Then[/COLOR]
        Cells(CurrentRow, 1) = x & y
        CurrentRow = CurrentRow + 1
    [COLOR=darkblue]Else[/COLOR]
        [COLOR=darkblue]For[/COLOR] i = 1 [COLOR=darkblue]To[/COLOR] j
            [COLOR=darkblue]Call[/COLOR] GetPermutation(x + Mid(y, i, 1), _
            Left(y, i - 1) + Right(y, j - i))
        [COLOR=darkblue]Next[/COLOR]
    End [COLOR=darkblue]If[/COLOR]
End Sub

[/FONT]
 

herve80

XLDnaute Occasionnel
Re : Combinaisons de lettres (toutes)

Magnifique. "Excel-lent" travail.
La macro prise par Staple1600 a ma préférence, mais merci quand même à 13GIBE59.

Je ne peux que vous remercier tous les deux pour vos recherches et le temps que vous avez "abandonné" volontairement et gratuitement pour moi.

Je n'ai que ma gratitude à vous donner en retour, mais soyez assurés qu'elle est sincère, et que je vais utiliser au mieux la macro "reçue".

Bonne journée à vous deux :)
Pascal
 

herve80

XLDnaute Occasionnel
Re : Combinaisons de lettres (toutes)

Staple1600,

Pourquoi t'énerver ? ;)

Tu m'as rendu service, je te suis reconnaissant.
Je ne fais pas d'ironie, de cynisme ou autre chose crois-moi.

Je souligne que c'est gratuit parce que nous ne soulignons pas assez nos "privilèges".

Amicalement,
Pascal
 

Discussions similaires

Statistiques des forums

Discussions
312 231
Messages
2 086 447
Membres
103 213
dernier inscrit
Poupoule