Boucle if sur VBA

Fermé
PurplePoulpe - Modifié par PurplePoulpe le 23/08/2011 à 15:48
mikanadien2 Messages postés 108 Date d'inscription mardi 23 août 2011 Statut Membre Dernière intervention 10 août 2012 - 23 août 2011 à 16:32
Bonjour,

je commence sur VBA et, évidemment, je galère.

Le but est relativement simple: je voudrais conjuguer une fonction "IF" et une fonction "VALEUR CIBLE" dans une macro, afin qu'elle se fasse automatiquement et plusieurs fois de suite (afin de remplir un tableau);
L'idée est:
j'ai une donnée en ligne 22
De la valeur de cette donnée dépend la formule qui me permettra de calculer la ligne 29
Dans un cas (si la donnée ligne 22 est supérieure à 3000), la seule manière de calculer la donnée ligne 29 est d'utiliser une fonction "valeur-cible", portant sur les valeurs de la ligne 28, et ayant pour but de les ramener à 0.


J'ai donc:


For i = 5 To 26

If Cells(22, i) = 0 Then
Cells(28, i) = 0

ElseIf Cells(22, i) > 3000 Then
Cells(28, i).Select
ActiveSheet.Cells(28, i).GoalSeek Goal:=0, ChangingCell:=ActiveSheet.Cells(29, i)

Else
Cells(29, i) = 16 / Cells(22, i)

End If

Next
End Sub

Or, VBA n'apprécie pas du tout ma ligne ElseIf (et apparemment, pas trop non plus ma ligne ActiveSheet..., même si je ne suis pas encore allé jusque là); quelqu'un aurait il une idée ??

Merci d'avance !!

1 réponse

mikanadien2 Messages postés 108 Date d'inscription mardi 23 août 2011 Statut Membre Dernière intervention 10 août 2012 10
23 août 2011 à 15:50
Salut



J ai pas compris ni ton code ni ton explication... lol


T as 26 colonnes ? Tu veux traiter les colonnes uniquement de 5 a 26 ?

Eclaire moi...
0
PurplePoulpe
23 août 2011 à 15:56
Héhé, je sais pas pourquoi, je soupconnais en écrivant que ce soit pas très clair...

Mon tableau va uniquement de la colonne E à Z, donc oui, il s'agit de traiter ces colonnes seulement...

Ensuite.... bah c'est un peu tordu mais, en gros, en appelant A, B et C mes 3 variables (resp. ligne 22, 28 et 29):
si A =0, B et C =0 (premier if)
si A<=3000, C=16/A (else de fin)
si A>3000, C est calculé de manière à ce que B soit nul....

Voilà, j'espère que c'est plus clair comme ça !!
0
mikanadien2 Messages postés 108 Date d'inscription mardi 23 août 2011 Statut Membre Dernière intervention 10 août 2012 10
Modifié par mikanadien2 le 23/08/2011 à 16:04
Ok

T embete pas, fait le en 3 if differents...


For i = 5 To 26
If A = 0 Then
B = ""
C = 0
End If
If (A < 3000 or A = 3000) and A > 0 Then
B = ""
C = 16/A
End If
If A > 3000 Then
B = 0 'Ou alors ton calcul en question ici
C = ""
End If
Cells(22, i).text = A
Cells(28, i).text = B
Cells(29, i).text = C
Next


Ca suffit comme ca non ?
0
PurplePoulpe
23 août 2011 à 16:14
En effet, y'a un mieux... Après, j'avoue que d'un point de vue purement théorique, ca me chiffonne un peu de pas comprendre pourquoi le ElseIf lui posait problème...
Merci en tout cas pour le coup de main !!
0
mikanadien2 Messages postés 108 Date d'inscription mardi 23 août 2011 Statut Membre Dernière intervention 10 août 2012 10
23 août 2011 à 16:18
au lieu de faire ElseIf Cells(22, i)
essaie plutot un ElseIf Cells(22, i).value

Quant au ActiveSheet.Cells(28, i).GoalSeek

Tu peux supprimer le activesheet...
Les macros aiment pas quant y a deux methodes sur la meme ligne,,,


Cdt
0
PurplePoulpe
23 août 2011 à 16:30
Ha, j'ai désormais une "Run Time Erreur 1004: Application-defined or object-defined error" !!! :D
Bref, je crois que je vais me contenter d'enchaîner les If, ca a l'air achment plus simple hehe

Encore une fois, merci pour l'aide
0