VBA trouver 3 valeurs selon conditions

Bonjour,

J'ai bien avancé dans mes constitutions de classes,notamment grâce à mon post précédent et ses réponses.

Il me reste des soucis, notamment un:

J'ai une ligne 1 avec des n° de groupes

En dessous une ligne 2 avec des chiffres 1,2 ou 3

Et enfin une ligne 3 avec des effectifs

Ca donne ça :

Colonne:  1    2    3    4    5    6    7    8    9    10    11    12    13    14    15    16    17    18    19    20    21    22    23    24    25
Ligne 1 : 1    2    2    2    3    4    4    4    5    5    5    5    5    6    7    7    7    7    8    8    8    8    9    9    9
Ligne 2 : 1    1    2    3    2    1    2    3    1    2    3    1    2    2    2    2    3    1    1    2    3    3    3    3    1
Ligne 3 : 18    35    35    30    30     34    30    27    30    30    30    30    21    31    30    35    30    35    34    17    35    35    35    27    35

J'ai 3 variables g,m et d qui ont les valeurs de la ligne 1 (de 1 à 9) et qui ont le même effectif e.

Y a-t-il un moyen simple de faire:

Trouver 3 numeros de colonnes correspondant aux valeurs de g, m et d en ligne 1 tel que les numéros en ligne 2 soit différents (l'un doit être 1, l'autre 2, l'autre 3 dans n'importe quel ordre) et e<36.

J'ai fait une boucle sur g, puis sur m, puis sur d, dans l'ordre des colonnes. Mais s'il ne trouve pas de solution, j'aimerais revenir en arrière, pour qu'il change la valeur correspondant à g pour se laisser une chance. Et ma boucle tourne alors indéfiniment...

J'ai cherché et je ne trouve pas de fonction toute faite... Ca existe peut-être!!

Thanks pour votre aide .

Et joyeuses fêtes.

Mostat

Finalement en imbriquant les 3 boucles ça va mieux.

Mais par curiosité y aurait-il une fonction qui permettent d'aller plus vite?

Bonjour Mostat,

Si tu joignais un fichier, il serait plus facile de te répondre.

Il y a certainement des possibilités pour accélérer ton code.

Cordialement

Bonjour,

Le voici

Thanks again

ok, je regarde ça demain matin car pas de dispo ce soir.

Cordialement

Bonjour,

Je suis perdu dans ta programmation. On va procéder par ordre.

1 A quoi sert ce fichier ?

2 Commence ta procédure par :

Sub Classes()
Dim a%, i%, j%, k%, e%, g%, m%, d%, w%, x%, y%, z%, s%, t%, r%, n%, o%, p%, q%, qq%, ee%, ii%

Application.ScreenUpdating = False

Range("F4:AI120").ClearContents
a = Cells(2, "E").Value
y = 25
z = 1
'-*- En remplacement de la boucle i
Cells(4, "G").Resize(1, y) = 0
'-*- pourquoi ne pas mettre des 0 directement

' en remplacement de la boucle k
Range("B3:B" & Range("B" & Rows.Count).End(xlUp).Row).Copy Range("C3")
Application.screenupdating = false

bloque momentanément la mise à jour écran ce qui va te faire déjà gagner du temps.

Cells(4, "G").Resize(1, y) = 0

ecrit une série de zéro sans avoir à faire une boucle (d'ailleurs pourquoi les effacer pour les réécrire aussitôt?)

Range("B3:B" & Range("B" & Rows.Count).End(xlUp).Row).Copy Range("C3")

cette ligne recopie en une fois la colonne au lieu de faire une boucle de recopie.

Ensuite au lieu de mettre des goto dans ton code pour faire une incrémentation de boucle préfère des

exit for

qui me semble feront la même chose.

Quand tu auras fait tout ça remets ton fichier en joint et on progressera doucement.

Explique bien ce que font les cinq boucles qui suivent.

@+

Bonjour et merci, j'apprends de nouvelles commandes.

J'ai modifié mais pas les goto, je ne vois pas quoi mettre après les exit for.

J'ai ajouté des commentaires.

Le but ultime est que la somme des non affectés (ajoutée en E18) soit minimum.

Pour cela il faut que je joue à la main sur les 1,2 et 3 de la ligne 3. Une optimisation me semble ardue avec 3^25 possibilités...

Mostat

Bonjour Mostat,

La boucle ii a quelle intérêt car je ne vois pas de différence dans les résultats.

Quand tu tapes du code, il est indispensable de faire des indentations (retrait paragraphe) pour t'y retrouver.

De même il faut commenter ta procédure pour t'y retrouver plus tard. C'est un conseil pas une obligation.

Voici une nouvelle version en supprimant la boucle ii et avec application.screenupdating=false

Les temps ont bien baissés avec la suppression de la boucle.

Ensuite si tu veux descendre encore les temps d'exécution, il faudrait faire des tableaux. Pour cela il faut bien comprendre les attendus.

J'ai l'impression d'être hermétique à ta procédure.

Je vais tout de même y regarder encore un peu.

Cordialement

Une nouvelle version en supprimant les goto.

Problème les résultats sont différents

Peux-tu contrôler le résultat de la feuille et me dire ce que tu en penses.

Cordialement

Je viens de regarder.

Les effectifs en ligne 4 sont sup à 35.

Pour expliquer ma démarche:

Il y a des triplettes en colonne A (3 spécialités numérotées de 1 à 9), choisies chacune par un certain nombre d'élèves (colonne B)

En ligne 2, en gras, j'ai 25 groupes numerotés de 1 à9 qui correspondent aux spécialités (il y a un groupe pour la spé 1, 3 groupes pour la spé2...)

En ligne 3 j'ai indiqué à la main 1,2,ou 3. Il faut que pour une triplettes (par ex 579), les élèves soient dans un groupe correspondant à la spé 5 et un groupe 7 et un groupe 9 en ligne 2, MAIS avec à chaque fois un groupe 1, un groupe 2 et un groupe 3(ligne3) .

Et les effectifs en ligne 4 doivent être max 35

Peux-tu répondre à ces questions. Informations qui constituent ta feuille.

img1

Pourquoi une colonne pour les triplettes et non trois colonnes ?

Il faut que je comprenne si je veux pouvoir t'aider!!

Oui pour les effectifs.

La colonne triplette vient d'une autre feuille de calcul où les élèves ont fait des voeux.

Je suis obligé de fonctionner avec les triplettes à cause de l'obligation de la ligne 3 (concrètement lors de la constitution des emplois de temps, j'empilerai les spécialités sur 3 créneaux).

Bonjour,

Je m'y remets.

Encore une question. D'où vient le 36 dans le code suivant:

If ((g = Cells(2, j).Value) And (Cells(4, j).Value) < (36 - e) And (m = Cells(2, q).Value) And _

(d = Cells(2, qq).Value) And (Cells(4, q).Value) < (36 - e) And (Cells(4, qq).Value) < (36 - e) _

And (n * o * p = 6)) Then

Merci pour ta réponse.

Il sert à vérifier que l'effectif (en ligne4) du groupe (en ligne2) ne dépasse pas 35.

Mais ne passe pas trop de temps là-dessus!

Thanks

Tu as raison c'est un casse tête.

J'ai mis les données en tableau pour plus de rapidité.

En fait une boucle suffit pour que les restes soient à zéro (bizarre, bizarre,...)

De ce fait les résultats ne sont pas ceux escomptés.

Regarde et dis moi.

Bonne fin de journée

L'erreur vient àmon avis de la disparition du go to s qui permet de ne pas boucler sur lamême triplette.

Le gain de temps est hallucinant!!

Je vais intégrer ma 2é boucle qui permet de gérer une triplette quand l'effectif est trop grand.

1000mercis!!

Et bon réveillon

A mon sens, remettre le goto s ne changera rien.

Le problème est ailleurs mais pour le moment je ne vois pas où.

Avant de te l'envoyer, j'ai essayé de faire la deuxième boucle. Le test if ... end if n'a pas été franchi à aucun moment.

C'est pourquoi je l'ai supprimée.

Cordialement

Je te jure, ça marche super!

je te l'envoie.

Encore 1000 mercis.

Maintenant je me lance dans l'optimisation!!

Effectivement ça fonctionne bien.

Félicitations pour l'adaptation. Tu apprends vite

IL ne faut pas mettre triplette en remarque dans la deuxième boucle. Vois le fichier en PJ.

Quand tu auras terminé, pourras tu me faire partager le résultat définitif.

Bon dimanche

Rechercher des sujets similaires à "vba trouver valeurs conditions"