Formule - macro
RésoluDans la colonne N de ma feuille1 que j’ai nommée Produits j’ai cette formule,
=SI(NB.VIDE(I2)=1;"";SI(I2/G2<0.97;"NCR";"OK"))
J’aurais voulu savoir si c’était possible de mettre cette formule dans une macro ?
Et quel serait le code a mettre si tel est le cas ?
Merci de votre aide…
Configuration: Windows 2000 Internet Explorer 6.0
35 réponses
La problématique porte sur l’intégration d’une formule dans une macro Excel pour automatiser son calcul dans une colonne lors de l’insertion de données dans une feuille. Plusieurs réponses proposent d’utiliser Range.Formula pour appliquer la même condition sur une plage jusqu’à 15000 lignes, avec des ajustements selon que le calcul se fasse dans la feuille ou dans la macro. Des échanges évoquent aussi le besoin que le calcul s’effectue automatiquement lors de l’insertion via un UserForm, et non pas uniquement lorsque les données existent déjà en cellule. En cas de difficultés, des précisions sur les opérateurs et les cas NCR apparaissent, et des tests montrent que la macro peut nécessiter des ajustements selon les valeurs vides et les cas d’erreur.
-
Je suis vraiment nul...
Des on cherche compliqué quand c'est tout simple....
Il y avait juste à mettre les "" autour des "0", maintenant ça fonctionne parfaitement...
Encore merci à toi pour toute ton aide! -
ContributeurJe n'ai pas réalisé plutôt, mais quand tu modifie la ligne ...
If Cells(lig, 7).Value >= "0" And Cells(lig, 9).Value >= "0" Then
Réfléchi un tout.. tout...tout petit peu...
La condition où il n'y à rien dans aucune des cellules ne se produira jamais car tu met (c'est toi qui modifie)
7=>0 et 9=>0 CE SERRA TOUJOURS VRAI, cogite la-dessus et tu trouverras une solution. Si pas ont en rediscuterras.
A+
PS: Il faut aussi que tu réfléchisse un peu et jusque maintenant je n'ai fait que te PONDRE la solution ce qui n'était pas te rendre service.
-
Non, quand il y a "0" en quantité ok, il y a NCR. ça on est d'accord.
Par contre s'il il n'y a pas de quantité ok, s'il il n'y a rien d'écrit, si la case est vide quoi, là il ne devrait rien y avoir.
tu comprends mieux ce que je veux dire? -
ContributeurTu dit.....
Donc j'ai essayé, ça marche quand je rentre mes données avec le USF, par contre même problème qu'auparavant, si la quantité ok est "0" , il n'y a rien qui s'affiche.
Avec ce code aussi , lorsqu'il n'y a pas de quantité OK en "9", ça m'inscrit "NCR".
Décide une bonne fois pour toute Grrrrr -
Avec ce code aussi , lorsqu'il n'y a pas de quantité OK en "9", ça m'inscrit "NCR".
En fait ce qu'il faut c'est que quand "9" = 0 il y ait NCR
et que quand "9" est vide, il n'y ait rien qui ne s'affiche -
ContributeurCa devrait aller avec...
Sub Resultat() Dim Lig As Long Dim Col As Long Sheets("Produits").Select For Lig = 2 To Range("G65536").End(xlUp).Row If Cells(Lig, 7) > 0 Then If Cells(Lig, 9) = "" Or Cells(Lig, 9) = 0 Then Cells(Lig, 14) = "NCR" ElseIf (Cells(Lig, 9) / Cells(Lig, 7)) < 0.97 Then Cells(Lig, 14) = "NCR" Else Cells(Lig, 14) = "OK" End If Else Cells(Lig, 14) = "" End If Next Lig End Sub
A+
-
Ok donc ce code fonctionne maintenant parfaitement lorsque je fait les saisie avec le USF, par contre quand je fait un calcul total de la feuille avec ce code, si j’ai une valeur dams ma colonne 7 et pas de valeur dans la 9, ça m’affiche « NCR » dans la colonne 14. Normalement il n’y a rien qui doit s’afficher.
A mon avis le pb vient de cette ligne
If Cells(Lig, 7).Value >= 0 And Cells(Lig, 9).Value >= 0 Then
J’ai mis un >=0 car si ma quantité ok est “0”, il faut que ça affiche NCR.
Sub Resultat()
Dim Lig As Long
Dim Col As Long
Sheets("Produits").Select
For Lig = 2 To Range("C65536").End(xlUp).Row
If Cells(Lig, 7).Value >= 0 And Cells(Lig, 9).Value >= 0 Then
If (Cells(Lig, 9) / Cells(Lig, 7)) < 0.99 Then
Cells(Lig, 14) = "NCR"
Else
Cells(Lig, 14) = "OK"
End If
Else
Cells(Lig, 14) = ""
End If
Next Lig
End Sub
merci -
ContributeurApparement tu oublie les points...
If .Cells(lig, 7).Value >= "0" And .Cells(lig, 9).Value >= "0" Then
A+
-
BOnjour, désolé de répondre seulement maintenant, beaucoup d'urgence au travail et pas le temps ce w.e...
Donc j'ai essayé, ça marche quand je rentre mes données avec le USF, par contre même problème qu'auparavant, si la quantité ok est "0" , il n'y a rien qui s'affiche.
et si je mets cette ligne,
If Cells(lig, 7).Value >= "0" And Cells(lig, 9).Value >= "0" Then
ça bug, ça ne marche pas avec le USF,
Merci -
ok je regarde ça cet aprem merci
-
ok j'ai compris pardon.
Mais par contre ça ne fonctionne pas. Quand je clique sur valider, mes ligne s'insère, mais le calcul ne se fait pas... -
Contributeurou bien...
With Sheets("produits") .Cells(ligne, 9) = TextBox1.Value .Cells(ligne, 12) = TextBox_visa.Value .Cells(ligne, 10) = CheckBox1.Value .Cells(ligne, 13) = Textbox2.Value .Cells(ligne, 21) = TextBox3.Value .Cells(ligne, 19) = TextBox5.Value .Cells(ligne, 20) = TextBox7.Value .Cells(ligne, 18) = TextBox9.Value .Cells(ligne, 17) = TextBox10.Value .Cells(ligne, 11) = CDate(TextBox11.Value) .Cells(ligne, 22) = ComboBox2 .Cells(ligne, 24) = Format(Now, "DD/MM/YY HH:MM:SS") .Cells(ligne, 23) = Application.UserName .Cells(ligne, 25) = TextBox12.Value .Cells(ligne, 8) = "" If .Cells(ligne, 7) And .Cells(ligne, 9) Then If (.Cells(ligne, 9) / .Cells(ligne, 7)) < 0.97 Then .Cells(ligne, 14) = "NCR" Else .Cells(ligne, 14) = "OK" End If Else .Cells(ligne, 14) = "" End If End With
A+
-
ContributeurTu peu mettre en dessous de l'autre macro, mais faut ajouter une ligne
Sheets("Produits").select
juste au début.
A+ -
je l'ajoute dans un module ou dans mon userform?
-
ContributeurPas de problème
Tu ajoute cette petite subSub ResultatPartiel(lig As Long) If Cells(lig, 7) And Cells(lig, 9) Then If (Cells(lig, 9) / Cells(lig, 7)) < 0.97 Then Cells(lig, 14) = "NCR" Else Cells(lig, 14) = "OK" End If Else Cells(lig, 14) = "" End If End Sub
et après End With tu metResultatPartiel Ligne
A+
-
Donc j'ai regardé, ça fonctionne.
Le problème avec cette solution, c'est qu'il y a des formules. Car moi dans mon tableau, j'ai environ 7000 lignes, et des stats avec des TCD, et des fonctions sommeprod.
Tu va donc comprendre que moins j'ai de formules, mieux ça tourne.
En fait avec la macro que tu m'avais faites ça marchait parfaitement pour le calcul de la feuille,
Sub Resultat()
Dim Lig As Long
Dim Col As Integer
Sheets("Produits").Select
For Lig = 2 To Range("C65536").End(xlUp).Row
If Cells(Lig, 7).Value > 0 And Cells(Lig, 9).Value > 0 Then
If (Cells(Lig, 9) / Cells(Lig, 7)) < 0.97 Then
Cells(Lig, 14) = "NCR"
Else
Cells(Lig, 14) = "OK"
End If
Else
Cells(Lig, 14) = ""
End If
Next Lig
End Sub
Ce qu'il m'aurait juste fallu en suplément c'est que lorsque je clique sur mon bouton Valider, a la fin des instructions pour rentrer mes valeurs:
With Sheets("produits")
.Cells(ligne, 9) = TextBox1.Value
.Cells(ligne, 12) = TextBox_visa.Value
.Cells(ligne, 10) = CheckBox1.Value
.Cells(ligne, 13) = Textbox2.Value
.Cells(ligne, 21) = TextBox3.Value
.Cells(ligne, 19) = TextBox5.Value
.Cells(ligne, 20) = TextBox7.Value
.Cells(ligne, 18) = TextBox9.Value
.Cells(ligne, 17) = TextBox10.Value
.Cells(ligne, 11) = CDate(TextBox11.Value)
.Cells(ligne, 22) = ComboBox2
.Cells(ligne, 24) = Format(Now, "DD/MM/YY HH:MM:SS")
.Cells(ligne, 23) = Application.UserName
.Cells(ligne, 25) = TextBox12.Value
.Cells(ligne, 8) = ""
End With
Que j'ait un code pour que ce calcul se fasse juste sur la ligne que j'insère... Avec un Row.source ou je sais pas si c'est possible,,,,
MErci encore -
ContributeurBonjour, merci eric d'avoir pris la relève, j'ai été absent hier.
Mais ça m'énervait de pas trouver la solution et je crois que la solution suivante est beaucoup plus pratique.
CAR J'AI ENFIN TROUVE LE NOEUD DU PROBLEME.
Tes réf articles commence par des réf à des cellules et Excel les concidères comme tel et en déduit des réf circulaires, il faut mettre toute la colonne au format TEXTE et ça roule...oufffff ont peu enfin revenir à un exemple plus concret
Une fonction personnalisée est plus complète.
Dans un module général tu copie...Function RetNCR_OK() Dim Lig As Long Application.Volatile Lig = Application.Caller.Row If Cells(Lig, 7) > 0 Then If Cells(Lig, 9) = "" Or Cells(Lig, 9) = 0 Then RetNCR_OK = "NCR" ElseIf (Cells(Lig, 9) / Cells(Lig, 7)) < 0.97 Then RetNCR_OK = "NCR" Else RetNCR_OK = "OK" End If Else RetNCR_OK = "" End If End Function
Tu peu aussi mettre ce code, maintenant ça fonctionne...Private Sub calc() Range("N2").Formula = "=RetNCR_OK()" Range("N2").Copy 'à adapter à la colonne où se trouve la formule Range("N2:N15").Select 'à adapter à la colonne où se trouve la formule ActiveSheet.Paste End Sub
Il n'est plus besoin de modifier la formule en cas de modification des données, mais tu doit soit recalculer (F9) ou mettre le calcul en automatique.
et tu peu simplifier la fin de ta macro par...With Sheets("produits") .Cells(ligne, 9) = TextBox1.Value .Cells(ligne, 12) = TextBox_visa.Value .Cells(ligne, 10) = CheckBox1.Value .Cells(ligne, 13) = Textbox2.Value .Cells(ligne, 21) = TextBox3.Value .Cells(ligne, 19) = TextBox5.Value .Cells(ligne, 20) = TextBox7.Value .Cells(ligne, 18) = TextBox9.Value .Cells(ligne, 17) = TextBox10.Value .Cells(ligne, 11) = CDate(TextBox11.Value) .Cells(ligne, 22) = ComboBox2 .Cells(ligne, 24) = Format(Now, "DD/MM/YY HH:MM:SS") .Cells(ligne, 23) = Application.UserName .Cells(ligne, 25) = TextBox12.Value .Cells(ligne, 8) = "" End With
A+
-
Bon j'ai regardé dans mon classeur, ça fonctionne parfaitement (pour 6000 lignes) donc c'est cool !
Pour contre je n'avais pas pensé. Ce code est bien pour calculer une feuille, mais en fait pour insérer mes données j'utilise un USF avec ce code, est ce qu'il y aurait possibilité de faire pour que ça calcule juste la ligne que j'insère et pas toute la feuille :
Private Sub NEW_VALID()
'Pose la question lorsque l'on clique sur Valider'
If TextBox11 <> 0 Then
Dim Msg, Style, Ctxt, Response
Msg = "Voulez vous vraiment enregistrer ce contrôle?"
Style = vbYesNo + vbCritical + vbDefaultButton2
Response = MsgBox(Msg, Style)
If Response = vbYes Then
Dim ligne As Integer
Dim rw As Long
'je retrouve la ligne concernée par les modifications en bouclant de 1 à 65000
For rw = 1 To 10000
If Worksheets("produits").Range("A" & rw) = Val(UserForm8.ComboBox1) Then
ligne = rw
Exit For
End If
Next
UserForm4.Show
Application.Worksheets("produits").Cells(ligne, 9) = TextBox1.Value
Application.Worksheets("produits").Cells(ligne, 12) = TextBox_visa.Value
Application.Worksheets("produits").Cells(ligne, 10) = CheckBox1.Value
Application.Worksheets("produits").Cells(ligne, 13) = Textbox2.Value
Application.Worksheets("produits").Cells(ligne, 21) = TextBox3.Value
Application.Worksheets("produits").Cells(ligne, 19) = TextBox5.Value
Application.Worksheets("produits").Cells(ligne, 20) = TextBox7.Value
Application.Worksheets("produits").Cells(ligne, 18) = TextBox9.Value
Application.Worksheets("produits").Cells(ligne, 17) = TextBox10.Value
Application.Worksheets("produits").Cells(ligne, 11) = CDate(TextBox11.Value)
Application.Worksheets("produits").Cells(ligne, 22) = ComboBox2
Application.Worksheets("produits").Cells(ligne, 24) = Format(Now, "DD/MM/YY HH:MM:SS")
Application.Worksheets("produits").Cells(ligne, 23) = Application.UserName
Application.Worksheets("produits").Cells(ligne, 25) = TextBox12.Value
Application.Worksheets("produits").Cells(ligne, 8) = ""
Unload Me
Range("AN1:AT1").Calculate
UserForm1.Show
End If
End If
End Sub -
En fait c'est réglé je n'avais qu'à mettre >=. Je vais faire quelques test, merci beaucoup l'aide accordée :)
-
ok ben là ça marche mais si la valeur en I est égale à "0" ce qui arrive souvent, là il n'y a toujours rien qui s'affiche...
- 1
- 2