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)

Bonjour

non ce n'est pas correct

déjà tes variables ne sont pas affectés avec set devant car ce ne sont pas des variables objets

de plus tes variables étant déclarées dans une macro elles ne peuvent être lu dans les autres

don si toutes tes macros sont dans un même module déclarent tes variables en dehorsd d'une macro avec l'instruction Dim

si tes macros sont dans des modules différents il faut toujours les déclarer dans un module au début de celui-ci avnat tout code mais par Public au lieu de Dim

Et à ta place je rajouterai des parenthèses au niveau de mes calculs pour être sur

Bonne journée
 
Re : Boucle en Macro (je cale)

Merci pour les conseils!
Bon, j'ai fait des modifs!
Je précise que la première méthode, que j'appelle "Compar" permet de définir si il faut appliquer Meth1 ou Meth2... sauf que, quand je lance la compilation de VBA, ça me demande si je veux activer Meth1 ou Meth2... or je voudrais que ça me demande de choisir Compar !!! Comment faire?😕
Voilà la nouvelle version!



Dim Soprano As Byte
Dim Arte As Byte
Dim Forte As Byte
Dim Piano As Variant
Dim x As Integer
Public Sub Compar(Soprano, Arte)
Soprano = CByte(Worksheets("Feuil1").Range("A2"))
Arte= CByte(Worksheets("Feuil1").Range("H2"))
If (Soprano > Arte ) Then
Meth1
Else
Meth2
End If
End Sub


Public Sub Meth1()
Soprano = CByte(Worksheets("Feuil1").Range("A2"))
Arte = CByte(Worksheets("Feuil1").Range("H2"))
Forte = CByte(Worksheets("Feuil1").Range("AL2"))
Piano = CLng(Worksheets("Feuil1").Range("AY2"))
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()
Soprano = CByte(Worksheets("Feuil1").Range("A2"))
Arte = CByte(Worksheets("Feuil1").Range("H2"))
Forte = CByte(Worksheets("Feuil1").Range("AL2"))
Piano = CLng(Worksheets("Feuil1").Range("AY2"))
For x = -(Forte- 1) To 0
If (Soprano < Arte - (12 * x / Forte )) Then
Piano = Piano - (Piano * x / (Forte + x))
Exit For
End If
Next
End Sub



Merci encore!
 
Re : Boucle en Macro (je cale)

RE

Alors maintenant que tu as bien declaré tes variables en dehors du module tu n'as pas besoin de les réattribuer à chaque fois. Une fois suffit il va garder leur valeur

Ensuite quand veux-tu lancer ta macro ??

Tu peux soit mettre un bouton soit le faire sur un evenement
 
Re : Boucle en Macro (je cale)

en fait, je veux que ça s'applique à une case de mon tableau (et par extension, je le ferai s'appliquer à toute une colonne)! et je veux aussi que, si je modifie une valeur de mon tableau, ça modifie automatiquement la valeur renvoyée par la macro! (est-ce faisable? 😀)
 
Re : Boucle en Macro (je cale)

Re

oui c'est faisable

il suffit de la declencher sur l'evenement change de ta feuille

exemple ton tableau est de A1 à F10 tu fais dans le code de la feuille

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:F10")) Is Nothing Then compar
End Sub

par contre il faut

Public Sub Compar()

et non

Public Sub Compar(Soprano, Arte)
 
Re : Boucle en Macro (je cale)

donc, si je comprends bien, sachant que mon tableau de données va de A2 à AY9, et que je veux remplir la colonne AZ, mon programme doit se présenter ainsi?


Dim Soprano As Byte
Dim Arte As Byte
Dim Forte As Byte
Dim Piano As Variant
Dim x As Integer

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A2:AY9")) Is Nothing Then Compar
End Sub

Public Sub Compar()
Soprano = CByte(Worksheets("Feuil1").Range("A2"))
Arte= CByte(Worksheets("Feuil1").Range("H2"))
If (Soprano > Arte ) Then
Meth1
Else
Meth2
End If
End Sub

Public Sub Meth1()
Soprano = CByte(Worksheets("Feuil1").Range("A2"))
Arte = CByte(Worksheets("Feuil1").Range("H2"))
Forte = CByte(Worksheets("Feuil1").Range("AL2"))
Piano = CLng(Worksheets("Feuil1").Range("AY2"))
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()
Soprano = CByte(Worksheets("Feuil1").Range("A2"))
Arte = CByte(Worksheets("Feuil1").Range("H2"))
Forte = CByte(Worksheets("Feuil1").Range("AL2"))
Piano = CLng(Worksheets("Feuil1").Range("AY2"))
For x = -(Forte- 1) To 0
If (Soprano < Arte - (12 * x / Forte )) Then
Piano = Piano - (Piano * x / (Forte + x))
Exit For
End If
Next
End Sub


c'est bien ça? ou je me mélange les pinceaux?
 
Re : Boucle en Macro (je cale)

Bah il y toujours des trucs en trop

Dim Soprano As Byte
Dim Arte As Byte
Dim Forte As Byte
Dim Piano As Variant
Dim x As Integer

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A2:AY9")) Is Nothing Then Compar
End Sub

Public Sub Compar()
Soprano = CByte(Worksheets("Feuil1").Range("A2"))
Arte= CByte(Worksheets("Feuil1").Range("H2"))
Forte = CByte(Worksheets("Feuil1").Range("AL2"))
Piano = CLng(Worksheets("Feuil1").Range("AY2"))
If (Soprano > Arte ) Then
Meth1
Else
Meth2
End If
End Sub

Public Sub Meth1()
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()
For x = -(Forte- 1) To 0
If (Soprano < Arte - (12 * x / Forte )) Then
Piano = Piano - (Piano * x / (Forte + x))
Exit For
End If
Next
End Sub
 
Re : Boucle en Macro (je cale)

oki, j'ai fait les rectifications! maintenant, une toute petite question : pourquoi ça ne m'affiche aucun résultat? 🙁 j'ai fait un pas à pas pour une cellule, ça marche sans problème, mais ça n'affiche aucun résultat! 🙁 snif!
 
Re : Boucle en Macro (je cale)

euh... en effet 😀
je suppose que je dois mettre Print [Piano] dans la méthode Compar pour renvoyer le résultat de Piano obtenu, c'est ça? ou y'a encore autre chose à ajouter?

*désolé, je suis un peu à coté de la plaque aujourd'hui 😀*
 
Re : Boucle en Macro (je cale)

bin comme j'ai dit plus haut, je souhaite afficher le résultat dans la colonne AZ (donc pour AZ2, mettre la valeur de Piano correspondant à cette case, puis étendre aux autres cases de la colonne AZ)!

je sais, c'est compliqué ce que je demande 😱
 
Re : Boucle en Macro (je cale)

re

dans ce cas là essaies

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A2:AY9")) Is Nothing Then
Compar(target.row)
End Sub

Public Sub Compar(Maligne as integer)
Soprano = CByte(Worksheets("Feuil1").Range("A2"))
Arte= CByte(Worksheets("Feuil1").Range("H2"))
Forte = CByte(Worksheets("Feuil1").Range("AL2"))
Piano = CLng(Worksheets("Feuil1").Range("AY2"))
If (Soprano > Arte ) Then
Meth1
Else
Meth2
End If
range("AZ" & maligne)=Piano
End Sub
 
- 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