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

Next

Est-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 Sub

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

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 Sub

J'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 Sub

J'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 Sub

J'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 Sub

Bonjour 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 If

Peux-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 Sub

Bonjour

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 ! =)

Rechercher des sujets similaires à "vba valeur boucle"