VBA - Valeur pour boucle FOR
Bonjour à toutes, à tous et au forum.
J'ai posté un sujet il y a environ une à deux semaines concernant une macro pour un calcul d'EMT. Me revoilà sur le forum pour une nouvelle question.
Ma macro me permet de sortir toutes les valeurs possibles de "k" et "d" lorsque l'EMT calculé par la macro correspond à celui que je cherche. Pour cela je fais tourner mon "k" de 1 à 10 et mon "d" de 0.01 à 1.01 par pas de 0.01
Ce que je cherche dorénavant ce sont des plus petites valeurs. C'est à dire que le "k" va toujours varier de 1 à 10, tandis que "d" (La résolution de la balance) va varier de 0.0001 à 1.0001 par pas de 0.0001. Mais lorsque je fais ceci, il n'y a aucun résultat obtenu par ma macro, alors qu'il existe bel et bien des solutions. Ci-joint, ma macro :
Sub Recherche_e_k_Classe1()
Dim EMT, C, e, k, d, a, b, x As String
EMT = Range("K65")
C = Range("K66")
b = 74
For k = 1 To 10
For d = 0.0001 To 1.0001 Step 0.0001
e = k * d
a = C / e
If a <= 50000 Then
x = 1 * e
If x = EMT Then
Cells(b, 10) = k
Cells(b, 11) = d
b = b + 1
End If
ElseIf a > 50000 And a <= 200000 Then
x = 2 * e
If x = EMT Then
Cells(b, 10) = k
Cells(b, 11) = d
b = b + 1
End If
ElseIf 200000 < a Then
x = 3 * e
If x = EMT Then
Cells(b, 10) = k
Cells(b, 11) = d
b = b + 1
End If
End If
Next
End Sub
NextEst-ce que j'ai une erreur dans ma macro ? Est-ce que je demande un trop grand nombre de calcul à réaliser par la macro ? Ma macro est trop longue et prend donc trop de temps à traiter les informations ?
Merci d'avance de toutes vos propositions et éventuelles réponses.
Cordialement
bonjour,
peux-tu donner des valeurs de EMT et de C ainsi que les valeurs et k et de d pour lesquelles il existe une solution ?
En fait lorsque je lance la macro ci-dessous avec C = 10g et EMT = 0.0001
Sub Recherche_e_k_Classe1()
Dim EMT, C, e, k, d, a, b, x As String
EMT = Range("K65")
C = Range("K66")
b = 74
For k = 1 To 10
For d = 0.00001 To 1.00001 Step 0.00001
e = k * d
a = C / e
If a <= 50000 Then
x = 1 * e
If x = EMT Then
Cells(b, 10) = k
Cells(b, 11) = d
b = b + 1
End If
ElseIf a > 50000 And a <= 200000 Then
x = 2 * e
If x = EMT Then
Cells(b, 10) = k
Cells(b, 11) = d
b = b + 1
End If
ElseIf 200000 < a Then
x = 3 * e
If x = EMT Then
Cells(b, 10) = k
Cells(b, 11) = d
b = b + 1
End If
End If
Next
Next
End SubJ'obtiens les résultats suivant pour "k" et "d" :
k d
1 0,001
2 0,0005
4 0,00025
5 0,0002
10 0,0001
Mais le soucis c'est que si je repasse sur un C = 3000g et un EMT = 3g je n'ai plus aucun résultat trouvé par ma macro !
Pourtant si je modifies la macro en changeant seulement l'intervalle de "d" dans la boucle FOR, de cette manière :
Sub Recherche_e_k_Classe1()
Dim EMT, C, e, k, d, a, b, x As String
EMT = Range("K65")
C = Range("K66")
b = 74
For k = 1 To 10
For d = 0.01 To 1.01 Step 0.01
e = k * d
a = C / e
If a <= 50000 Then
x = 1 * e
If x = EMT Then
Cells(b, 10) = k
Cells(b, 11) = d
b = b + 1
End If
ElseIf a > 50000 And a <= 200000 Then
x = 2 * e
If x = EMT Then
Cells(b, 10) = k
Cells(b, 11) = d
b = b + 1
End If
ElseIf 200000 < a Then
x = 3 * e
If x = EMT Then
Cells(b, 10) = k
Cells(b, 11) = d
b = b + 1
End If
End If
Next
Next
End SubJ'obtiens les résultats suivants :
k d
3 1
4 0,75
5 0,6
6 0,5
10 0,3
Pourtant avec le premier intervalle de "d" allant de 0.00001 à 1.00001 par pas de 0.00001 je passe normalement par les mêmes valeurs que le deuxième intervalle de "d" allant de 0.01 à 1.01 par pas de 0.01....
C'est là que je ne comprend pas
demonsares a écrit :En fait lorsque je lance la macro ci-dessous avec C = 10g et EMT = 0.0001
J'obtiens les résultats suivant pour "k" et "d" :
k d
1 0,001
2 0,0005
4 0,00025
5 0,0002
10 0,0001
avec cette macro et C=10 et EMT=0.0001 je n'obtiens aucun résultat donc soit tu as une autre macro soit tu as utilisé d'autres paramètres soit j'ai raté quelque chose dans tes explications
Bonjour h2so4 et merci de t'intéresser à mon sujet.
En posant C = 10g et EMT = 0.0001 et la macro suivante :
Sub Recherche_e_k_Classe1()
Dim EMT, C, e, k, d, a, b, x As String
EMT = Range("K65")
C = Range("K66")
b = 74
For k = 1 To 10
For d = 0.00001 To 1.00001 Step 0.00001
e = k * d
a = C / e
If a <= 50000 Then
x = 1 * e
If x = EMT Then
Cells(b, 10) = k
Cells(b, 11) = d
b = b + 1
End If
ElseIf a > 50000 And a <= 200000 Then
x = 2 * e
If x = EMT Then
Cells(b, 10) = k
Cells(b, 11) = d
b = b + 1
End If
ElseIf 200000 < a Then
x = 3 * e
If x = EMT Then
Cells(b, 10) = k
Cells(b, 11) = d
b = b + 1
End If
End If
Next
Next
End SubJ'obtiens les résultats suivants :
Classe I
k d
1 0,00005
5 0,00001
Mais le soucis c'est que si je change les valeurs d'entrée tel que C = 3000g et EMT = 3g je n'ai plus aucun résultat !
POURTANT, si je change l'intervalle de "d" de la façon suivante :
Sub Recherche_e_k_Classe1()
Dim EMT, C, e, k, d, a, b, x As String
EMT = Range("K65")
C = Range("K66")
b = 74
For k = 1 To 10
For d = 0.01 To 1.01 Step 0.01
e = k * d
a = C / e
If a <= 50000 Then
x = 1 * e
If x = EMT Then
Cells(b, 10) = k
Cells(b, 11) = d
b = b + 1
End If
ElseIf a > 50000 And a <= 200000 Then
x = 2 * e
If x = EMT Then
Cells(b, 10) = k
Cells(b, 11) = d
b = b + 1
End If
ElseIf 200000 < a Then
x = 3 * e
If x = EMT Then
Cells(b, 10) = k
Cells(b, 11) = d
b = b + 1
End If
End If
Next
Next
End SubJ'obtiens les résultats suivants :
Classe I
k d
3 1
4 0,75
5 0,6
6 0,5
10 0,3
Ce que je ne comprend pas, c'est pourquoi sans réduire l'intervalle de "d" je n'obtiens pas de valeur !
Car pourtant lorsque "d" varie de 0.00001 à 1.00001 par pas de 0.00001 je passe bien par les mêmes valeurs que si "d" varie de 0.01 à 1.01 par pas de 0.01
Bonsoir,
un problème classique de conversion binaire en décimal qui provoque des erreurs de précision
voici une proposition de correction de ton code
Sub Recherche_e_k_Classe1()
Dim EMT, C, e, k, d, a, b, x As String
EMT = Range("A1")
C = Range("A2")
b = 1
For k = 1 To 10
For d = 0.00001 To 1.00001 Step 0.00001
e = k * d
a = C / e
If a <= 50000 Then
x = 1 * e
ElseIf a > 50000 And a <= 200000 Then
x = 2 * e
ElseIf 200000 < a Then
x = 3 * e
End If
If Round(x, 6) = EMT Then
Cells(b, 10) = k
Cells(b, 11) = d
b = b + 1
End If
Next
Next
End SubBonjour h2so4
Le programme que tu m'as proposé correspond exactement à ce que je voulais !
Je dois avouer que je n'ai pas tout compris dans l'article que tu m'as mis en pièce jointe... Si tu peux me donner une brève explication de pourquoi ce que j'ai fait ne marche pas et pourquoi toi cela fonctionne ce serait super sympa !
Sinon je dois adapter le code que tu m'as donné à mon fichier Excel. Mais je ne comprend pas cette partie :
If Round(x, 6) = EMT Then
Cells(b, 10) = k
Cells(b, 11) = d
b = b + 1
End IfPeux-tu me l'expliquer ?
Voici les classes des balances pour lesquelles je dois transcrire le code :
Classe I
0 ≤ m ≤ 50 000 e
50 000 e < m ≤ 200 000 e
200 000 e < m
Classe II
0 ≤ m ≤ 5 000 e
5 000 e < m ≤ 20 000 e
20 000 e < m ≤ 100 000 e
Classe III
0 ≤ m ≤ 500 e
500 e < m ≤ 2 000 e
2 000 e < m ≤ 10 000 e
Classe IV
0 ≤ m ≤ 50 e
50 e < m ≤ 200 e
200 e < m ≤ 1 000 e
EMT en service
± 1 * e
± 2 * e
± 3 * e
Voici mon code pour la classe 2 et lorsque je le lance j'ai une erreur de débogage au niveau de la ligne If Round (x,6) Then. Mais cette ligne correspond aux nombres de décimales si j'ai bien compris ! Donc je ne vois pas pourquoi cela ne fonctionne pas !
Sub Recherche_e_k_Classe2()
Dim EMT, C, e, k, d, a, b, x As String
EMT = Range("K65")
C = Range("K66")
b = 74
For k = 1 To 10
For d = 0.00001 To 1.00001 Step 0.00001
e = k * d
a = C / e
If a <= 5000 Then
x = 1 * e
ElseIf a > 5000 And a <= 20000 Then
x = 2 * e
ElseIf 20000 < a And a <= 100000 Then
x = 3 * e
End If
If Round(x, 6) = EMT Then
Cells(b, 13) = k
Cells(b, 14) = d
b = b + 1
End If
Next
Next
End SubBonjour
Enleve le as string dans l'instruction dim
Merci encore h2so4 !!
Du coup je pense c'est tout bon, tu as compris à merveille mon problème !
Merci encore, je valide et clos le sujet ! =)