[Catégorie modifiée .Net -> VBA] Boucle de comparaison

Signaler
Messages postés
5
Date d'inscription
jeudi 14 avril 2011
Statut
Membre
Dernière intervention
1 septembre 2011
-
Messages postés
5
Date d'inscription
jeudi 14 avril 2011
Statut
Membre
Dernière intervention
1 septembre 2011
-
Bonjour,

J'essai de créer une boucle qui compare une valeur A à 0 puis qui soustraire la valeur B d'une autre cellule de mon tableau a A si la valeur A > 0. Cette opérature doit s'effectuer tant que le résultat n'est pas négatif.

J'ai commencé à utiliser visual basic aujourd'hui.

Sub Calcul()

Dim A As String
Dim I As Integer


A = Cells(L, 2).Value

For I = 1 To 10
If A(I) > 0 Then
A(I) = Cells(L, 2).Value - Cells(L, 3).Value
End If
A(I)= Cells(L, 2).Value
Next I

End Sub

Merci d'avance

15 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut

Catégorie de la question modifiée - prends en note pour la prochaine fois.

Si tu déclares A comme une String, que représentes pour toi A(I) ?
Que vaut "L" qui, comme il est écrit, est une variable et pas la colonne "L".
Pourquoi une boucle ? Que veux-tu parcourir ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Et quel est ton problème, à part le traditionnel "ça marche pas" qui n'explique rien.
Messages postés
5
Date d'inscription
jeudi 14 avril 2011
Statut
Membre
Dernière intervention
1 septembre 2011

Pour moi A(I) représente une variable intermédiaire qui sert uniquement au calcul . J'ai mis sa car j'ai de très vague souvenir de matlab ou on faisait comme sa pour simplifier les calculs.

L correspond à la colonne.

En fait je ne parcours rien , plus simplement mon calcul doit me permettre de calculer une distance mini.

Exemple : J'ai deux pièces de 715 mm de long. Elles sont dans un four qui les déplacent par PAS de 200mm. J'aimerai que mon programme soustraire autant de fois que nécessaire le PAS à la longueur de ma pièce :

715 - 200 515 > 0 donc comme le résultat est supérieur à 0 le calcul doit recommencer jusqu'a obtenir 515-200-200-200 -85 .

Cette valeur correspond à la distance minimal qui peut séparé les deux pièces.

Pour en revenir à mon programme, lorsque je le lance, il blic et me marque "tableau attendu".
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Bonjour,
A = Cells(L, 2).Value

ne peut avoir un sens que si L est une variable contenant une valeur numérique représentant un entier compris entre 1 et le nombre maximum (Rows.count) de lignes.

A(I)

ne peut avoir de sens, puisque A est un String et I un Integer, que si A est déclaré comme un tableau dynamique (et dans ton cas, puisque tu écris for i = 1 to 10, d'au moins 11 items) !


Ce sont carrément les bases, qui manquent cruellement, là !
On ne peut, pour coder, écrire n'importe quoi, tout et rien ...
Il est absolument indispensable de commencer par les fondements mêmes .


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
5
Date d'inscription
jeudi 14 avril 2011
Statut
Membre
Dernière intervention
1 septembre 2011

Dans ce cas comment arriver à faire une boucle sur un seul terme?
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Ah, voilà des explications précises.

On suppose donc que la valeur de L est définie ailleurs dans le code.
Méfie-toi, si L = 0 --> Erreur

En fait, or mis le plaisir de faire du programme, il existe une fonction toute faite : Mod
Mod te renverra le reste de la division d'un chiffre par un autre.
Exemple, bien sûr :
maDistance = 715
monIntervale = 200
DistanceRestante = maDistance Mod monIntervale
NombreIntervales = Fix(maDistance / monIntervale)

Si tu veux poursuivre le problème de ton code :
Si A est définit comme String, il ne peut plus changer de type ensuite, A(I) voudrait dire que tu indexes la variable nommée A = tableau de vraiables.
Première chose : modifier le nom de ta variable A.

L'indexation n'apporte rien.
Dans ta boucle actuelle, après le For, tu lis le contenu de A(x). Or, le tableau n'existe pas ou ne contient rien.
Ce qui t'intéresse, c'est de stocker le contenu de ta cellule avant calcul, puis de lui soustraire progressivement des valeurs.

Problème de type :
Tu as définis A comme une String; chaine. Oui, c'est une bonne chose au cas où il y ait autre chose qu'un chiffre dans ta cellule : évite les erreurs de code.
Par contre, ensuite, tu dois t'en servir comme d'un chiffre.
VBA sait faire la conversion implicite des variables, mais je te le déconseille fortement; mieux vaut dimensionner proprement les variables en fonction de l'usage.
Je pense qu'il serait plus judicieux de définir A comme un Single = chiffre à virgule et de lire le contenu de ta cellule en utilisant une fonction de conversion :
Dim A As Single
A = Val(Cells(...).Value)

Si tu as des soucis de reconnaissance du point comme séparateur décimal, fais des recherches de ce problème parmi les précédentes questions du forum; c'est un problème récurrent qui n'a pas besoin d'être approfondi ici.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
"Cette valeur (-85) correspond à la distance minimal qui peut séparé les deux pièces"
Non, c'est la distance qu'il manque pour qu'une nouvelle pièce soit placée.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Ta boucle (*) :
(*) Pense à utiliser le coloriage syntaxique (3ème icone à droite) = plus facile à relire et conserve l'indentation du code (espaces en tête de ligne)
Revoilà ton code commenté.
Tu verras que quelque chose ne va pas :
For I = 1 To 10
    ' Si A > 0, on retranche la cellule 3 de la cellule 2
    ' et on place le résultat dans A
    If A > 0 Then
        A = Cells(L, 2).Value - Cells(L, 3).Value
    End If
    ' On range le contenu de la cellule 2 dans A
    A= Cells(L, 2).Value
Next I

Quelques secondes de réflexion ...



Tu ne vois pas ?
Lis mieux




Si à chaque tout de ta boucle, tu remets le contenu de ta cellule dans ta variable A, le calcul précédent ne sert à rien.


Deuxième chose :
A a été initialisé avant la boucle. Parfait.
Ensuite, dans ton calcul, il ne doit y avoir que A qui soit lu, sinon Cellule 2 - Cellule 3 donnera toujours le même résultat et ta boucle ne sert à rien.
Ton calcul doit donc être
        A = A - Cells(L, 3).Value

Voir aussi Exit For dans l'aide afin de sortir dès que tu en as besoin
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
le fait que le demandeur parle de "boucle sur un seul terme" (sic) me fait ne pas écarter une hypothèse (bien que rien ne soit dit à ce propos par le demandeur).
A valyus :
Veux-tu bien répondre avec précision à cette question très précise :
Que penses-tu qu'est A et quel est/sont, dans ton esprit, la/les valeur(s) qu'est censé contenir A ?
Cette réponse, à elle seule, a de fortes chances de nous éclairer sur certains aspects dont tu n'as pas parlé.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
A Jack (et à lui seul) :
ce qui me met la puce à l'oreille est la comparaison de ceci :
For I = 1 To 10 
' (donc "10 éléments")
avec cela :
A = Cells(L, 2).Value '


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
5
Date d'inscription
jeudi 14 avril 2011
Statut
Membre
Dernière intervention
1 septembre 2011

Quand j'ai fais le programme pour moi A devait servir à "stocker" le résultat de mon calcul pour ne pas affecter mes autres valeurs. Mais en vous lisant je me suis rendu compte qu'elle ne servait à rien

Un collège qui à quelques connaissance en visual m'a refait mon programme :

Sub Calcul()

Dim TaillePiece As Integer
Dim Pas As Integer
Dim i As Integer

ThisWorkbook.Sheets("Feuil1").Activate
TaillePiece = Range("H1").Value
Pas = Cells(3, 3).Value

For i = 1 To 10
If TaillePiece > 0 Then
TaillePiece = TaillePiece - Pas
Else
Range("C4") = -TaillePiece
Exit Sub
End If
Next

Même si il fonctionne j'aimerai avoir votre avis sur sa réalisation
End Sub
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
For i = 1 To 10
  If TaillePiece > 0 Then
    TaillePiece = TaillePiece - Pas
  Else
    Range("C4") = -TaillePiece
    Exit Sub
  End If
Next 

Ce que nous en pensons ?
Cette boucle sur I qui n'utilise pas I est pour le moins "étrange".




____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Et comme te l'a déjà dit jack, elle est remplaçable par cette seule ligne ;
taillepiece = taillepiece mod pas 



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Mais ceci ne doit pas te priver de répondre à la question que je t'ai posée.
Et ce : d'autant que je vois que tu as, en plus, tenté de modifier le "code de ton collègue" par cette boucle :
For I = 1 To 10
  If A(I) > 0 Then
    A(I) = Cells(L, 2).Value - Cells(L, 3).Value
  End If
   A(I)= Cells(L, 2).Value
Next I 

Quelle est la raison qui t'y a poussé ?
Réponds s'il te plait à cette question (dont je devine qu'elle "rejoint" celle que je t'ai posée plus haut et que tu as laissée sans réponse)
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
5
Date d'inscription
jeudi 14 avril 2011
Statut
Membre
Dernière intervention
1 septembre 2011

Dsl je me suis absenté. Si j'ai répondu : pour moi A devait servir à "stocker" le résultat de mon calcul pour ne pas affecter mes autres valeurs si j'ai pas bien répondu c'est que je comprend pas la question. Sinon je n'ai pas modifié le code de mon collègue car il me la fais après avoir vu ce que j'ai fais.

Même si ce code peut être remplacé par une seule ligne, je le fais pour apprendre à utilisé visual car je me dis que cela pourra me servir dans l'avenir0