Boucle en Macro (je cale)

  • Initiateur de la discussion Initiateur de la discussion yakutake83
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

yakutake83

XLDnaute Occasionnel
[Résolu] Boucle en Macro (je cale)

Bonjour.
Je travaille sous Excel 2003 et j'ai un petit problème : je cherche à faire un gros calcul, et je ne trouve pas la formule qui va me servir pour le faire!
Je vous donne la formalisation mathématique, en espérant que quelqu'un pourra m'aider!

J'ai plusieurs valeurs connues (appelées ici Soprano, Arte, Forte, Piano) se trouvant dans un tableau;
et une inconnue X
Je veux faire la chose suivante:

Si Soprano > Arte
____ Pour X allant de 1 à Forte-1 faire
________ Si Soprano < Arte + (12*X/Forte) alors Piano = Piano + Piano*(Forte-X)/X puis sortir de la boucle "Pour"
________ Sinon X = X+1
____ Fin Pour
Sinon
____ Pour X allant de -(Forte-1) à 0 faire
________ Si Soprano < Arte - (12*X/Forte) alors Piano = Piano - Piano*X/(Forte+X) puis sortir de la boucle "Pour"
________ Sinon X = X+1
___ Fin Pour
Fin

Voici ce que j'ai fait sous VBA, j'aimerais savoir si c'est correct, et dans le cas contraire, ce que je dois rectifier!


Public Sub Compar()
Dim Soprano As Byte
Set Soprano = CByte(Worksheets("Sheet1").Range("A2"))
Dim Arte As Byte
Set Arte = CByte(Worksheets("Sheet1").Range("H2"))
Dim Forte As Byte
Set Forte = CByte(Worksheets("Sheet1").Range("AL2"))
Dim Piano As Variant
Set Piano = CDec(Worksheets("Sheet1").Range("AY2"))
If (Soprano > Arte) Then
____Meth1
Else
____Meth2
End If
End Sub

Public Sub Meth1()
Dim x As Byte
For x = 0 To Forte
____If (Soprano < Arte + 12 * x / Forte) Then
____Piano = Piano + Piano * (Forte - x) / x
____Exit For
____End If
Next
End Sub

Public Sub Meth2()
Dim x As Byte
For x = -ForteTo 0
____If (Soprano < Arte - 12 * x / Forte) Then
____Piano = Piano - Piano * x / (Forte + x)
____Exit For
____End If
Next
End Sub


Merci beaucoup pour votre aide!

Edit : j'ai ajouté les "Fin Pour" comme demandé par Toine!
 
Dernière édition:
Re : Boucle en Macro (je cale)

c'est fait, mais quand je veux lancer la macro, ça me propose plus Compar!
mais bon, ne perdons pas espoir....

à propos (totalement hors sujet), j'ai fait un tour sur ton blog, tes photos sont supers 🙂 bravo 😉
 
Re : Boucle en Macro (je cale)

re

Merci pour les photos

Bon le plus simple serait de dire comment ta macro doit se declencher et ce qu'elle doit faire

là j'ai bien compris le truc des 2 macros lancées en fonction dans compar

mais quand veux-tu lancer compar ?
Pour l'instant on la lance à chaque modif de ton tableau. Faut-il le lancer à d'autres moments ?
 
Re : Boucle en Macro (je cale)

ma macro doit, pour chaque ligne de mon tableau:

Vérifier si Soprano est supérieur ou inférieur à Arte
Si c'est supérieur, faire Meth1 et écrire Piano recalculé dans la case AZ de la ligne étudiée
Si c'est inférieur, faire Meth2 et écrire le Piano recalculé dans la case AZ de la ligne étudiée

De plus, si je modifie l'une des valeurs (Soprano, Arte, Forte ou Piano) sur une ligne, je voudrais que ça modifie automatiquement le Piano recalculé en AZ!

Si besoin, je peux créer une nouvelle variable (par exemple Alto) pour écrire dans AZ, au lieu de mettre la valeur recalculée de Piano (y'a peut être une incompatibilité à ce niveau)!
 
Re : Boucle en Macro (je cale)

Re

pour ta première partie crées une nouvelle macro que tu lances quand tu veux tout ton calcul pour tes lignes 2 à 9

Sub lancement()
dim x as byte
for x= 2 to 9 'pour tes lignes 2 à 9
compar(x)
next x
end sub

Pour le reste il me faudrait plus de détails sur l'arrivée de ton alto. Comment il doit agir ETC
 
Re : Boucle en Macro (je cale)

on oublie l'histoire de alto, ça marche sans apparemment! cependant...
je viens de tester ton truc, ça donne un résultat intéressant, mais.... j'obtiens la même valeur sur toutes les lignes (c'est à dire que j'obtiens le Piano recalculé de la première ligne PARTOUT)! or, je voudrais que ça me le fasse pour chaque ligne! c'est à dire

Ligne 2 : prendre Soprano de la ligne 2, Arte de la ligne 2, Forte de la ligne 2, Piano de la ligne 2, faire les calculs, et me donner la nouvelle valeur de Piano sur une autre case de la ligne 2
Ligne 3 : pareil, mais toutes les valeurs proviennent de la ligne 3
etc...

ensuite, il ne faut pas oublier que les valeurs de Soprano, Arte, Forte et Piano peuvent être modifiées manuellement à tout moment!
 
Re : Boucle en Macro (je cale)

Re

Arf j'ai oublié de changer un truc

Public Sub Compar(Maligne as integer)
Soprano = CByte(Worksheets("Feuil1").Range("A" & Maligne))
Arte= CByte(Worksheets("Feuil1").Range("H" & Maligne))
Forte = CByte(Worksheets("Feuil1").Range("AL" & Maligne))
Piano = CLng(Worksheets("Feuil1").Range("AY" & Maligne))
If (Soprano > Arte ) Then
Meth1
Else
Meth2
End If
range("AZ" & maligne)=Piano
End Sub
 
Re : Boucle en Macro (je cale)

yahouuuu!!! ça marche!!!
merci infiniment, tu m'as sorti du pétrin! franchement, t'es un super boss! 😎

bon, bin si j'ai encore des problème sur Excel, je sais où venir 🙂

merci encore de ton aide!


(y'a pas un bouton pour signaler que le problème est résolu?)
 
Re : Boucle en Macro (je cale)

yakutake83 à dit:
yahouuuu!!! ça marche!!!
merci infiniment, tu m'as sorti du pétrin! franchement, t'es un super boss! 😎

bon, bin si j'ai encore des problème sur Excel, je sais où venir 🙂

merci encore de ton aide!


(y'a pas un bouton pour signaler que le problème est résolu?)

Tes remerciements font office de [resolu] 😉
 
Re : Boucle en Macro (je cale)

ah, j'ai encore une toute petite question: au lieu de prendre en compte la lettre de la colonne, je voudrais prendre en compte le NOM que j'ai mis en première ligne de colonne! (par exemple, si la colonne AY a pour nom en première ligne Piano_col, si jamais je mets des colonnes supplémentaires entre la première et Piano_col, que la macro agisse toujours en fonction de Piano_col)...

*je sais pas si j'ai été très clair, là...*
 
Re : Boucle en Macro (je cale)

RE

Voilà une modification de compar et une petite fonction en plus et des varaibles en plus

Dim ColIntrouvable As Boolean
Dim ColSoprano As Byte
Dim ColArte As Byte
Dim ColForte As Byte
Dim ColPiano As Byte
Dim ColResultat As Byte

Public Sub Compar(Maligne As Integer)

ColSoprano = NumColumn("NomColonneSoprano") ' A adapter avec le nom en haut de ta colonne
If ColIntrouvable = True Then GoTo fin
ColArte = NumColumn("NomColonneArte") ' A adapter avec le nom en haut de ta colonne
If ColIntrouvable = True Then GoTo fin
ColForte = NumColumn("NomColonneForte") ' A adapter avec le nom en haut de ta colonne
If ColIntrouvable = True Then GoTo fin
ColPiano = NumColumn("NomColonnePiano") ' A adapter avec le nom en haut de ta colonne
If ColIntrouvable = True Then GoTo fin
ColResultat = NumColumn("NomColonneResultat") ' A adapter avec le nom en haut de ta colonne
If ColIntrouvable = True Then GoTo fin

Soprano = CByte(Worksheets("Feuil1").Cells(Maligne, ColSoprano))
Arte = CByte(Worksheets("Feuil1").Cells(Maligne, ColArte))
Forte = CByte(Worksheets("Feuil1").Cells(Maligne, ColForte))
Piano = CLng(Worksheets("Feuil1").Cells(Maligne, ColPiano))
If (Soprano > Arte) Then
Meth1
Else
Meth2
End If
Cells(Maligne, ColResultat) = Piano

Exit Sub
fin:
MsgBox "Erreur sur une colonne veuillez verifier."
End Sub


Function NumColumn(TexteRech As String) As Byte

ColIntrouvable = False
On Error GoTo erreur
NumColumn = Range("A1:IV1").Find(TexteRech, lookat:=xlWhole).Column
Exit Function
erreur:
ColIntrouvable = True

End Function
 
Re : Boucle en Macro (je cale)

euh... y'a un truc que je pige plus, là...
depuis ce matin, ma macro marche une fois sur 5 environ, et quand elle ne marche pas, elle m'indique une erreur 1004 à la ligne

Soprano = CByte(Worksheets("Feuil1").Cells(Maligne, ColSoprano))
(sur la version que tu m'as amélioré, mais ça le faisait pareil avec l'ancienne version)

tu saurais pas d'où ça peut venir? j'ai essayé en changeant le type de Soprano (en le passant en Long, en Variant, en Double, etc...) mais ça me renvoie toujours l'erreur! et quand je zappe cette erreur, ça me le fait sur la ligne suivante!
j'ai beau chercher dans l'aide, je vois vraiment pas 🙁

(j'suis désolé de t'embêter avec tout ça 😱 )
 
Re : Boucle en Macro (je cale)

nickel chrome! j'avais fais une gaffe et effacé des lignes sans le faire exprès! c'est pour ça que ça plantait!
(en fait, pour Maligne, ça commençait à zéro! c'est tout 😀)

et j'ai fait le test en ajoutant des colonnes, ça marche sans problème!
encore merci pour tout!
Bye
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
7
Affichages
454
Réponses
3
Affichages
922
Réponses
4
Affichages
732
Réponses
4
Affichages
675
Retour