Déclaration de tableau avec nombre de ligne égale à n
Bonjour à tous,
Je viens vers vous car je souhaite effectuer un planning en automatisé pour une équipe de technicien de 6 personnes donc 6 postes. Par la suite, j'évaluerai les différents éléments générés en fonction de certaines contraintes pour garder la meilleure solution. (Pour des équipes plus grandes à partir de 8 j'utiliserais des métaheuristiques je pense)
Avec l'algorithme ci-dessous je génère l'ensemble des permutations possibles. Cet algorithme n'est pas de moi hormis les parties problématiques
Merci d'avance pour votre soutien et pour votre matière grise
Sub test()
Dim Tbl()
Dim I As Integer
Dim J As Long
Dim Chaine As String
Dim Str As String
'Remplissage du tableau T() par une boucle
Dim t(0 To 6)
For I = 1 To 7
t(I - 1) = I
Next I
For I = 0 To UBound(t): Chaine = Chaine & t(I): Next I
Permuter Chaine, "", Tbl, J
Columns(1).Clear
Range(Cells(1, 1), Cells(UBound(Tbl), 1)).Value = Application.Transpose(Tbl)
'Fractionnement du texte
For I = 1 To UBound(Tbl)
For J = 1 To 7
Cells(I, J + 1) = Mid(Cells(I, 1), J, 1)
Next J
Next I
End Sub
Sub Permuter(Chaine As String, Debut As String, Tbl(), J As Long)
Dim I As Integer
If Len(Chaine) = 1 Then
J = J + 1: ReDim Preserve Tbl(1 To J)
Tbl(J) = Debut & Chaine
Else
For I = 1 To Len(Chaine)
Permuter Mid(Chaine, 2, Len(Chaine) - 1), Debut & Left(Chaine, 1), Tbl, J
Chaine = Mid(Chaine, 2, Len(Chaine) - 1) & Left(Chaine, 1)
Next
End If
End SubBonjour,
Il faut utiliser l'instruction Redim sans dimensionner au départ.
Voici un exemple :
Sub test()
Dim Tbl()
Dim I As Integer
Dim J As Long, n as long
Dim Chaine As String
Dim Str As String
n = range("A1").value '<<<< en A1, nombre de techniciens
if n < 1 then msgbox "erreur": exit sub
'Remplissage du tableau T() par une boucle
redim t(1 To n)
For I = 1 to n
t(I) = I
Chaine = Chaine & t(I)
Next I
Permuter Chaine, "", Tbl, J '<<<< J ? J vaut 0 ici...
'Permuter Chaine, "", Tbl, n '<<< essayer ça peut-être
Columns(1).Clear
Cells(1, 1).resize(n, 1).Value = Application.Transpose(Tbl)
'Fractionnement du texte
For I = 1 To UBound(Tbl)
For J = 1 To 7
Cells(I, J + 1) = Mid(Cells(I, 1), J, 1)
Next J
Next I
End Sub
Sub Permuter(Chaine As String, Debut As String, Tbl(), J As Long)
Dim I As Integer
If Len(Chaine) = 1 Then
J = J + 1: ReDim Preserve Tbl(1 To J)
Tbl(J) = Debut & Chaine
Else
For I = 1 To Len(Chaine)
Permuter Mid(Chaine, 2, Len(Chaine) - 1), Debut & Left(Chaine, 1), Tbl, J
Chaine = Mid(Chaine, 2, Len(Chaine) - 1) & Left(Chaine, 1)
Next
End If
End SubSinon, je ne suis pas certain d'avoir bien compris le code...
Cdlt,
Super merci beaucoup ça marche. C'était rapide et efficace :)
il faut adapter un peu avec le n-1 (exemple ci dessous pour une population de 5)
Tu souhaites des explications sur le code?
Sub test()
Dim Tbl()
Dim I As Integer
Dim J As Long
Dim Chaine As String
Dim Str As String
n = 5
n = n - 1
'Remplissage du tableau T() par une boucle
ReDim t(0 To n)
For I = 1 To n
t(I - 1) = I
Chaine = Chaine & t(I)
Next I
For I = 0 To UBound(t): Chaine = Chaine & t(I): Next I
Permuter Chaine, "", Tbl, J
Columns(1).Clear
Range(Cells(1, 1), Cells(UBound(Tbl), 1)).Value = Application.Transpose(Tbl)
For I = 1 To UBound(Tbl)
For J = 1 To n
Cells(I, J + 1) = Mid(Cells(I, 1), J, 1)
Next J
Next I
End Sub
Sub Permuter(Chaine As String, Debut As String, Tbl(), J As Long)
Dim I As Integer
If Len(Chaine) = 1 Then
J = J + 1: ReDim Preserve Tbl(1 To J)
Tbl(J) = Debut & Chaine
Else
For I = 1 To Len(Chaine)
Permuter Mid(Chaine, 2, Len(Chaine) - 1), Debut & Left(Chaine, 1), Tbl, J
Chaine = Mid(Chaine, 2, Len(Chaine) - 1) & Left(Chaine, 1)
Next
End If
End Sub