Probleme avec utilisation de cell.value avec la boucle for each

Bonjour,

J'ai une équation que je ne peux résoudre analytiquement pour trouver un paramètre (que j'appelle ici "b"). Je dois donc faire une itération à partir de plusieurs valeurs de b que je fixe dans un tableau (tableau d'une colonne qui contient 30 éléments).

le problème est que j'utilise "cell.value" pour définir les différents éléments du tableau mais quand je lance le programme je constate que seule la dernière valeur du tableau est prise en compte dans tous le tableau (tous les autres éléments du tableau sont remplacés par cette valeur).

le but de ce que je fais est de récupérer la valeur b du tableau qui me permet d'avoir l'écart minimum entre une fonction f(b) qui dépend de b et une constante z.

Si quelqu'un a une suggestion par rapport à la boucle que j'utilise ou à la variable cell.value... Ce sera la bienvenue.

Merci d'avance !

Dim i As Integer
Dim z, f As Double
Dim b As Double
Dim t As WorksheetFunction

Dim cell As Range

Set t = Application.WorksheetFunction

For Each cell In Range("A2:A30")

z = 1.4 * Log(8) + 1.9 * Log(20) 'je définis z qui est une constante

f = t.Min(Abs(((cell.value + 1.9 * Log((20 / cell.value) - 1)) - z) / z)) 'je définis f qui est l'écart minimum entre f(cell.value) et z 
Range("B2:B302").Value = Format(((cell.value + 1.9 * Log((20/ cell.value) - 1)) - z) / z, "0.0000")
Range("D2:D302").Value = Format(cell.value, "0.00")

Next cell

For Each cell In Range("A2:A30")

If (z * (f + 1) = cell.value + 1.9 * Log((20 / cell.value) - 1)) Then 'je pose la condition si pour retrouver la valeur cell.value qui me donne l'écart minimum entre f(cell.value) et z

b = cell.value 

Else

b = 0

End If

Next cell

Bonsoir Bil1989,

Pour une meilleur compréhension de ton problème peux tu joindre un fichier stp.

Sub test()
    Dim i As Integer
    Dim z As Double, f As Double, b As Double
    Dim t As WorksheetFunction
    Dim cell As Range

    Set t = Application.WorksheetFunction
    z = 1.4 * Log(8) + 1.9 * Log(20) 'je définis z qui est une constante

    For Each cell In Range("A2:A30")
        f = t.Min(Abs(((cell + 1.9 * Log((20 / cell) - 1)) - z) / z)) 'je définis f qui est l'écart minimum entre f(cell.value) et z

        ' A Chaque execution de la boucle tu viens ecraser tes anciennes Datas
        ' Ou est l'intérêts ?

        Range("B2:B302").Value = Format(((cell + 1.9 * Log((20 / cell) - 1)) - z) / z, "0.0000")
        Range("D2:D302").Value = Format(cell.Value, "0.00")
    Next cell

    For Each cell In Range("A2:A30")
        ' Tu renseignes une Variable "b" qui n'est pas executer par la suite
        ' Si tu veux la recupérer il faut l'inscire dans une cellule de ton classeur
        If (z * (f + 1) = cell.Value + 1.9 * Log((20 / cell.Value) - 1)) Then 'je pose la condition si pour retrouver la valeur cell.value qui me donne l'écart minimum entre f(cell.value) et z
            b = cell.Value
        Else
            b = 0
        End If

    Next cell
End Sub

Bonjour,

Pourquoi VBA plutôt qu'Excel ?

Bonjour Patrice33740,

Merci pour ce msg. Je m'intéresse à VBA car après je souhaite intégrer ce code dans une userform...Enfin je trouve que c'est la meilleure solution.

Salut !

Re,

Je m'intéresse à VBA car après je souhaite intégrer ce code dans une userform...Enfin je trouve que c'est la meilleure solution.

Dans ce cas il faudra penser à préciser les parents des objets Excel.

Ceci mis à part, je pense que résoudre le problème sur une feuille de calcul avec des formules serait un excellent préambule pour concevoir la macro équivalente.

Bonjour Florian53,

J'ai joints à ce message le fichier que j'utilise.

Je vais également jeter un oeil à tes remarques...

Merci beaucoup !

9vba-sans-usf.xlsm (45.39 Ko)

Re,

Dans ce cas il faudra penser à préciser les parents des objets Excel.

Ceci mis à part, je pense que résoudre le problème sur une feuille de calcul avec des formules serait un excellent préambule pour concevoir la macro équivalente.

Ok... a vrai dire je n'ai pas souvent fais des micro programme qui nécessitent l'utilisation des boucles directement sur les feuilles de calcul. Mais j'ai tenté de bidouiller quelque chose pour vérifier le résultat que devrais me fournir la macro sur VBA...

Bonjour,

Par exemple, sans écrire sur la feuille :

Option Explicit
Sub Exemple()
Dim ƒ As WorksheetFunction
Dim i As Integer
Dim z As Double, f As Double
Dim b As Variant
Dim r As Variant
  Set ƒ = Application.WorksheetFunction
  b = Application.Transpose(Worksheets("Feuil1").Range("A2:A31").Value)
  ReDim r(LBound(b) To UBound(b))
  z = 1.4 * Log(8) + 1.9 * Log(20)
  For i = LBound(b) To UBound(b)
    r(i) = Abs(((b(i) + 1.9 * Log((20 / b(i)) - 1)) - z) / z)
  Next i
  f = ƒ.Min(r)
  MsgBox "f = " & Format(f, "0.0000")
End Sub

Bonjour,

Par exemple, sans écrire sur la feuille :

Bonjour, Patrice3370

Merci pour ton retour, je viens de vérifier ton code et il marche super bien. J'ai tenté de rajouter la boucle "if" pour extraire le paramètre b mais sans succès (car au final il faut que j'arrive à extraire de b(i) la valeur de b qui me donne f). Je me remets dessus pour tenter de trouver quelque chose.

Merci encore !

Re,

Il faut chercher l'index où se trouve f dans r puis prendre la valeur correspondante de b :

Option Explicit
Sub Exemple()
Dim ƒ As WorksheetFunction
Dim i As Integer
Dim z As Double, f As Double
Dim b As Variant
Dim r As Variant
Dim x As Variant
  Set ƒ = Application.WorksheetFunction
  b = Application.Transpose(Worksheets("Feuil1").Range("A2:A31").Value)
  ReDim r(LBound(b) To UBound(b))
  z = 1.4 * Log(8) + 1.9 * Log(20)
  For i = LBound(b) To UBound(b)
    r(i) = Abs(((b(i) + 1.9 * Log((20 / b(i)) - 1)) - z) / z)
  Next i
  f = ƒ.Min(r)
  i = ƒ.Match(f, r, 0)
  x = b(i)
  MsgBox "f = " & Format(f, "0.0000") & vbCrLf & _
         "b = " & Format(x, "0.00")
End Sub

Re,

Il faut chercher l'index où se trouve f dans r puis prendre la valeur correspondante de b :

Bonjour Patrice33740 super, le code marche très bien. J'arrive a obtenir exactement ce que je veux.... . J'étais parti sur une boucle sans pouvoir désigner l'indice or la fonction "Match" est bien celle qui fallait...

Grand merci !

Re,

Il faut chercher l'index où se trouve f dans r puis prendre la valeur correspondante de b :

Bonjour Patrice33740 super, le code marche très bien. J'arrive a obtenir exactement ce que je veux.... . J'étais parti sur une boucle sans pouvoir désigner l'indice or la fonction "Match" est bien celle qui fallait...

Grand merci !

Rechercher des sujets similaires à "probleme utilisation value boucle each"