vba (dictionnary ?)

Le
Blaise
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 excluraie=
nt 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 m=
ettre tout cela sous forme de chaîne est d’utiliser la fonctio=
n Instr dans une boucle.
Avez-vous une autre idée ?
On m’a parlé du Dictionnary qui peut certes éviter des do=
ublons, mais je ne vois pas trop comment l’utiliser dans ce cas-ci.

Mes meilleures salutations,
Blaise.
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Michd
Le #26455462
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
HB
Le #26455477
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
Michd
Le #26455475
Relis mon message précédent, et réponds à toutes les questions.
MichD
Michd
Le #26455479
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
Publicité
Poster une réponse
Anonyme