SOS VBA Besoin d'aide pour un programme - VB/VBA/VBS - Programmation
Marsh Posté le 22-03-2013 à 22:31:16
Salut
Tu peux déjà poster la première partie
Spoiler : |
J'ai un peu de mal à comprendre la deuxième partie, ce n'est pas assez détaillé.
Il y a un seul virus ? Il peut se déplacer autant de fois qu'il veut ? Il se déplace jusqu'à disparaitre ? Il va aléatoirement à gauche/droite/haut/bas?
Voisinage immédiat c'est une cellule de distance ? En diagonale c'est voisinage immédiat ?
Quel est le but en fait ? Savoir le chemin qu'il a parcouru ? En combien de déplacement il disparait ?
Marsh Posté le 23-03-2013 à 09:07:23
Bonjour Kenza91 ! J'ai bien un code tout prêt (ton exercice est un classique si j'oserais) mais afin de ne pas déroger
aux règles de ce forum, oui on aimerait bien voir ton code et tes difficultés exposées …
Marsh Posté le 24-03-2013 à 19:09:36
Marc L a écrit : |
Bonjour Marc L
Oui je comprends . Alors voilà la partie que j'ai réussi à faire, elle est composée de deux procédures:
Sub ppalebis()
Dim n As Integer
n = InputBox("entrez la taille de la forêt" )
Call coloriagebis(n)
End Sub
Sub coloriagebis(ni As Integer)
Dim i As Integer
Dim j As Integer
Dim compteur As Integer
Dim test As Boolean
compteur = 0
test = False
Do
Randomize
i = Int(ni * Rnd + 1)
j = Int(ni * Rnd + 1)
If Cells(i, j).Value <> "A" Then
Cells(i, j).Value = "A"
Cells(i, j).Select
Selection.Interior.ColorIndex = 50
compteur = compteur + 1
Else
test = True
End If
Loop Until test = True
End Sub
Sub recherche_couleur()
Dim i As Integer
Dim ma_plage As Range
ma_plage.Cells(Int(Rnd * 24) + 1, Int(Rnd * 16) + 1).Select 'pour sélectionner au hasard une case dans mon tableur 16*24
Set ma_plage = Range(ActiveCell.Offset(-1, -1), ActiveCell.Offset(1, 1))
For i = 1 To 9
If i = 5 Then i = 6
If ma_plage.Cells(i).Interior.ColorIndex = RGB(255, 0, 0) Then
ma_plage.Cells(i).Select
ma_plage.Cells(i).Interior.ColorIndex = RGB(0, 102, 0)
Exit Sub
End If
End If
Next i
End Sub
Voilà j'espère que c'est suffisant pour que tu puisses m'orienter un peu vers la bonne réponse.
Il faut savoir que je suis ne suis pas du tout experte en VBA, ce n'est pas du tout quelque chose que je maîtrise vu que j'ai une formation plutôt scientifique et les cours qui nous sont donnés ne sont pas bien expliqués du tout.
Ils nous donnent des choses à faire comme celles-ci sans que nous ayons des connaissances suffisantes derrière. Donc j'ai essayé de faire de mon mieux et je suis venue sur ce forum afin qu'une âme charitable, comme toi cher Marc L, puisse me sortir de cette galère
Marsh Posté le 24-03-2013 à 19:20:39
tarteflambee a écrit : Salut
|
Bonjour!
D'abord merci pour ta réponse!
En faite il y a deux options concernant ce virus mangeur :
Option 1.
On considère que le virus est STUPIDE: il se propage de façon aléatoire dans la forêt
générée (c'est-à-dire les couleurs générées). Au départ, le virus possède une quantité d’énergie maximale ET à chaque fois qu'il
se déplace, il dépense une part de cette énergie EU. Lorsque le virus consomme toute son énergie, il meurt.
Si le virus mange un arbre, son énergie passe au maximum ET. Pour simplifier, on considère que chaque déplacement du virus sur une cellule du tableau coute une unité d’énergie EU, et ET=k EU. K est une valeur arbitraire.
Option 2.
virus INTELLIGENT: Il est capable de percevoir son environnement proche,
à savoir les 8 cellules voisines :
Voisin Voisin Voisin
Voisin Virus Voisin
Voisin Voisin Voisin
arbres et le mange
Voilà j'espère que c'est plus clair maintenant !
Marsh Posté le 24-03-2013 à 23:05:34
Bonsoir. Après une journée de "travail" (et oui même un dimanche !), levé depuis 5h et rentrant à peine (Ok fin de my life !),
je n'ai guère le courage de t'orienter didactiquement tel un professeur …
Ne doutant pas de mon état de demain, je fais donc exception à la règle en livrant mon code optimisé
mais toutefois ne tenant pas compte de ta réponse aux questions de tarteflambee,
il faudra donc peut-être t'en inspirer afin de l'adapter à ton programme,
car là c'est à ma sauce, ne correspondant pas forcément aux cours dispensés …
Précisions sur ma procédure (ColorBug) :
- à pleine vitesse, pas le temps de voir grand-chose !
J'ai donc inséré une temporisation afin d'observer le comportement erratique du virus.
Pour revenir à pleine vitesse, il suffit de mettre en commentaire la ligne n°41
et de réactiver la pause de la ligne n°29 juste pour voir le nombre de cases coloriées …
- Le virus est un poil "évolué", il ne revient pas sur ses trois derniers pas (tableau AD).
Code :
|
Marsh Posté le 25-03-2013 à 21:33:23
Je propose une approche POO pour ma part.
A toi de modifier pour avoir un virus intelligent.
Aussi mon virus stupide se cogne contre les bords.
main sub
Code :
|
module de classe "virus"
Code :
|
Marsh Posté le 26-03-2013 à 00:00:27
Marc L a écrit :
|
Bonsoir
Merci d'avoir pris la peine de m'aider même après ta grosse journée c'est vraiment très gentil de ta part ! J'ai testé ton code et il marche très bien. Tu as l'air d'être un expert confirmé en VBA et ça se voit à ton code qui est extrêmement compliqué pour moi ^^
Donc je vais essayer de m'en inspirer comme tu as dit parce que ce n'est pas du tout de mon niveau.
Merci encore!
Marsh Posté le 26-03-2013 à 00:06:08
tarteflambee a écrit : Je propose une approche POO pour ma part.
|
Bonsoir !
merci beaucoup pour ce code. J'ai essayé de le tester mais il y a toujours une erreur de compilation au niveau de la ligne n°1 de la main sub .
Tu penses que c'est dû à quoi parce que je ne vois pas où est l'erreur ?
Marsh Posté le 26-03-2013 à 01:04:14
@tarteflambee : sympa ton code mais un peu compliqué pour une débutante en VBA …
kenza91 a écrit : […] Tu as l'air d'être un expert confirmé en VBA et ça se voit à ton code qui est extrêmement compliqué pour moi ^^ |
Bonsoir ! Disons que je me débrouille un peu !
J’essaye de directement travailler avec les objets, le code en est plus concis et plus efficace …
Pour la compréhension, n'hésites pas à poser des questions en indiquant le n° de la ligne du code.
Je l'ai modifié afin de correspondre aux précisions données suite aux questions de tarteflambee
mais comme c'est ton devoir, ce serait bien de te faire progresser avant de le dévoiler …
ps: mieux vaut t'adresser à quelqu'un en citant son nom au lieu de re-poster l'intégralité d'un message
surtout avec un code long, ou sinon coupe-le …
Marsh Posté le 26-03-2013 à 06:29:53
Je pense que tu as mis le code dans la worksheet.
Crée un module (Insert>Module) pour la première partie.
Et un module de classe (Insert>Class module) nommé "virus" pour la deuxième partie.
(Au pire tu vois que c'est une constante que tu pourrais déclarer dans chaque partie)
Marsh Posté le 27-03-2013 à 21:52:50
Bonsoir !
@Marc L Merci pour le tuyau tu as dû comprendre que je n'étais pas une habituée des forums ^^ Et pour ton code il parfait, je comprends un peu le principe mais il y a beaucoup de fonctions que je connais pas donc je ne peux pas l'utiliser malheureusement
tarteflambee a écrit : Je pense que tu as mis le code dans la worksheet. |
J'ai fait ce que tu m'as dit mais ça ne marche toujours pas. Pour la sub aaa il y a un problème au niveau de la ligne n°7 :
Dim oVirus as virus ?? ma question va peut être te paraître débile mais virus c'est sensé être un type comme Integer ou String ?
Sinon peut-être que c'est trop demander mais j'ai réfléchis à une méthode assez simple mais que je n'arrive pas trop à traduire en algorithme ça serait:
Une grande boucle de 200 sauts
A l 'intérieur de cette boucle générer une direction aléatoire dans la limite de la plage
Tester si la couleur est bonne
Si c'est le cas changer la couleur
Si ca n'est pas le cas
Démarrer une sous-boucle bouclant sur les cellules adjacentes selon mes critères
changer la couleur si la couleur est trouvée
fin de sous-boucle
fin de grande boucle
Je pense que c'est l'approche la plus simple pour mon cas
Marsh Posté le 27-03-2013 à 23:04:08
oui virus c'est un objet que l'on crée via le class module. Il faut donc que le class module s'appelle virus pour que ce type personnalisé puisse être reconnu.
Marsh Posté le 28-03-2013 à 19:36:14
kenza91 a écrit : Une grande boucle de 200 sauts |
J'ai du mal avec ce scénario par rapport aux précédentes précisions …
Mais bon, avance déjà dans ton code puis, en cas de souci, soumet-le-nous en précisant la difficulté rencontrée.
Note qu'avec seulement 200 sauts, statistiquement (en fait j'ai pu le voir avec ma procédure en attente),
souvent des cases coloriées resteront …
Marsh Posté le 07-04-2013 à 15:35:53
Comme j'ai vu exactement le même énoncé sur d'autres forums et des solutions postées, voici donc ma version finale :
Code :
|
Marsh Posté le 10-04-2013 à 11:06:49
Marc L a écrit : |
Merci beaucoup !!
Marsh Posté le 22-03-2013 à 21:16:26
Salut à tous!
Voilà je dois faire un programme qui colorie en orange 20 premières lignes et colonnes d'une feuille excel de façon aléatoire sauf que la coloration du carré 20*20 s'arrête dès qu'une cellule est choisie deux fois. le programme indiquera sur la première cellule(1,1), le nombre de cellules coloriées.
Un virus est placé au hasard. Dès qu'il atteint une couleur, elle disparaît.
Ne fait rien sur une case blanche, peut se déplacer haut/bas, droite/gauche.
Si couleur à côté (voisinage immédiat), se dirige vers celle-ci.
Je suis parvenue à faire la première partie mais je bloque sur la partie "virus"
Si quelqu'un pouvait m'aider en me proposant un code ça serait vraiment gentil !