OVH Cloud OVH Cloud

vba (dictionnary ?)

4 réponses
Avatar
Blaise
Bonjour,

Le programme =C2=AB g=C3=A9n=C3=A8re =C2=BB une suite de 9 nombres (de 1 =
=C3=A0 68) tous diff=C3=A9rents, par exemple 1 11 23 2 15 ...=20
Au fur et =C3=A0 mesure de la g=C3=A9n=C3=A9ration, je dois exclure celles =
contenant de plus petites suites (contenues dans un tableau) qui peuvent =
=C3=AAtre de 2 nombres ou plus. Par exemple 11 23 ou 23 2 15 qui excluraie=
nt la suite en exemple plus haut.
Le probl=C3=A8me est que la quantit=C3=A9 =C3=A0 traiter est =C3=A9norme et=
que je cherche donc une m=C3=A9thode rapide.
La seule id=C3=A9e qui m=E2=80=99est venue =C3=A0 l=E2=80=99esprit est de m=
ettre tout cela sous forme de cha=C3=AEne est d=E2=80=99utiliser la fonctio=
n Instr dans une boucle.
Avez-vous une autre id=C3=A9e ?
On m=E2=80=99a parl=C3=A9 du Dictionnary qui peut certes =C3=A9viter des do=
ublons, mais je ne vois pas trop comment l=E2=80=99utiliser dans ce cas-ci.

Mes meilleures salutations,
Blaise.

4 réponses

Avatar
Michd
Bonjour,
Afin de mieux comprendre, dis-nous :
A ) où sont ces suites de nombres? Dans une plage de cellules? Comment cette
plage de cellules est organisée?
Si je comprends la donne du problème, tu veux exclure toutes les suites
qui n'auraient pas 9 nombres?
Est-ce qu'une suite particulière est dans la même cellule ou chaque
nombre de la suite dans des cellules différentes?
B ) Pour illustrer la chose, tu peux utiliser le site web "Cjoint.com" pour
publier, illustrer la donne du problème.
Comme tu veux une solution avec Excel, tu dois définir ton problème
tel qu'il se pose dans Excel.
MichD
Avatar
HB
Bonjour,
Si j'ai bien compris
Il y a qqpart un tableau avec des suites de 2 à 8 nombres distincts
choisis (préalablement, donc) entre 1 et 68.
- Où ? sur une feuille du classeur
La suite de 9 nb à générer ne doit contient aucune de ces sous-suites...
Soit.
Faut-il seulement "une suite qui convient" ou bien faut-il pouvoir
générer au hasard une suite parmi les suites valides ?
Les suites pré-existantes peuvent être stockées sous forme de
chaînes de texte ( "11;23" "23;2;15" ...)
Supposons qu'il y ait 100 sous-suites à éviter
On peut les stocker dans un tableau
DIM SUITES(99) as STRING
Ensuite pour chaque suite de 9 nb notée dans le même format,
et si cette suite générée au hasard est elle aussi fabriquée
avec la même syntaxe, une bête boucle avec inStr
va dire si cette nouvelle suite est valide ou non...
S'agissant de la suite à tester, j'imagine que la mise au point d'un
"tirage sans remise" ne posera pas de problème...
sinon ... il faut le dire ;o)
Cordialement,
HB
Le 10/12/2017 à 18:37, Blaise a écrit :
Bonjour,
Le programme « génère » une suite de 9 nombres (de 1 à 68) tous différents, par exemple 1 11 23 2 15 ...
Au fur et à mesure de la génération, je dois exclure celles contenant de plus petites suites (contenues dans un tableau) qui peuvent être de 2 nombres ou plus. Par exemple 11 23 ou 23 2 15 qui excluraient la suite en exemple plus haut.
Le problème est que la quantité à traiter est énorme et que je cherche donc une méthode rapide.
La seule idée qui m’est venue à l’esprit est de mettre tout cela sous forme de chaîne est d’utiliser la fonction Instr dans une boucle.
Avez-vous une autre idée ?
On m’a parlé du Dictionnary qui peut certes éviter des doublons, mais je ne vois pas trop comment l’utiliser dans ce cas-ci.
Mes meilleures salutations,
Blaise.

---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus
Avatar
Michd
Relis mon message précédent, et réponds à toutes les questions.
MichD
Avatar
Michd
Je te donne un exemple de code de ce qu'il est possible de faire.
En colonne A1:Ax , des nombres de n chiffres séparés par un point-virgule
Seul le contenu des cellules ayant une suite de 9 nombres est mis dans le
tableau T() et le contenu du tableau T() est recopié dans la feuille de
calcul si besoin.
À 2 endroits dans la procédure, tu adaptes le nom de la feuille.
Tu dois aussi adapter la plage de cellules où sont ces données
'-----------------------------------------------------
Sub test()
Dim T(), Rep As String
Dim Rg As Range, C As Range
'séparateur de nombre
Rep = ";"
Application.EnableEvents = False
Application.ScreenUpdating = False
With Worksheets("Feuil1")
Set Rg = .Range("A1:A" & .Range("A" & .Rows.Count).End(xlUp).Row)
End With
For Each C In Rg
x = Split(C.Value, Rep)
'égale 8 plutôt que 9 car split()
'retourne un tableau de base 0
If UBound(x) = 8 Then
a = a + 1
ReDim Preserve T(1 To a)
'Dans le tableau les nombres seront séparés
'par des espaces, tu peux remplacer l'espace
'par le caractère de ton choix.
T(a) = Join(x, " ")
End If
Next
'pour copier le résultat du tableau dans excel
With Worksheets("feuil1").Range("C1")
.Resize(UBound(T)) = Application.Transpose(T)
.EntireColumn.AutoFit
End With
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
'-----------------------------------------------------
MichD