Boucle for en VBA sur excel

Résolu/Fermé
féféx Messages postés 31 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 6 juillet 2015 - 2 nov. 2009 à 00:13
féféx Messages postés 31 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 6 juillet 2015 - 3 nov. 2009 à 16:44
Bonjour,

Je me suis mis depuis peu a excel et a la programmation en VBA.
En effet, je cherche a créer mes propres fonctions sur excel.

J'ai voulu creer la fonction delta (dont le code est a la suite) qui se compose d'une boucle for.
J'aimerai que dans la cellule dans laquelle je met =delta (3) me soit affiché le resultat de la fonction avec la variable i =3.
Mes données d'entrée sont aussi une liste de valeur dans la colonne D. (valeur commencant a la ligne 8 d'ou le k+8)

voila le code que j'ai crée dans un module :

Function delta(i As Integer) As Variant
Dim k As Integer
Dim p As Integer
For k = 1 To i - 1
p = k + 8
delta = delta + Feuil1.cell("D" & p) * (i - k)
Next k
End Function


résultat :
Quand je le fais pour i= 3 ou autres differents de 0, ca me revoit la valeur 0. Or si je le fais a la main, je devrais avoir une valeur bien differente.

Une ame charitable peut elle m'aider??

Merci d'avance
Féféx
A voir également:

13 réponses

pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
2 nov. 2009 à 00:49
Bonsoir,

Je pense qu'il faut utiliser la syntaxe suivante pour la valeur de delta :

delta = delta + Feuil1.Cells(p, 4) * (i - k)

A+
0
féféx Messages postés 31 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 6 juillet 2015 7
2 nov. 2009 à 16:54
Hello pilas 31,
J'ai essayé avec ta rectification. Le code devient alors :

Function delta(i As Integer) As Variant
Dim k As Integer
Dim p As Integer
For k = 1 To i - 1
p = k + 8
delta = delta + Feuil1.Cells(p, 4) * (i - k)
Next k
End Function


mais ca ne fonctionne toujours pas...
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
2 nov. 2009 à 17:37
Bonjour,

Quand tu dis que ça ne fonctionne pas, tu obtiens toujours 0 ou bien les valeurs obtenues ne sont pas celles espérées (mais différentes de 0) ?

Peux-tu me donner des exemples de valeurs présentes de D8 à D11 par exemple et les valeurs que tu obtiens ?

A+
0
féféx Messages postés 31 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 6 juillet 2015 7
2 nov. 2009 à 18:47
salut pilas
J'obtiens comme precedemment des 0 tout le temps (sauf pour la valeur 0 ou j'obtiens 1)
si tu veux je peux te passer le fichier excel pour que tu jete un coup d'oeil mais je peux pas l'ajouter a google document vu qu'il contient des macros.
je te l'envoi par mail?
Féféx
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
2 nov. 2009 à 19:02
Tu peux déposer ton fichier (débarrassé des infos trop confidentielles) sur http://www.cijoint.fr/ qui est un service gratuit et tu colles dans un post le lien qu'il te donne.

Je le regarde et je te dis.

A+
0
féféx Messages postés 31 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 6 juillet 2015 7
2 nov. 2009 à 19:14
Ok merci pour le tuyau tres pratique ce site
voila le lien

http://www.cijoint.fr/cjlink.php?file=cj200911/cijP5Up6sQ.xlsm

merci pour ta disponibilité!
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
2 nov. 2009 à 19:28
Bonsoir,

Dans une fonction tous les éléments, ici: i, la plage de données, doivent être en parametres
ce qui te dispense d'ailleurs de la variable p

Function delta(i As Integer, plage As Range) As Double
Dim lig As Long, col As Byte, k As Integer
lig = plage.Row
col = plage.Column
For k = 1 To i - 1
    delta = delta + Cells(lig + k, col) * (i - k)
Next k
End Function

0
féféx Messages postés 31 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 6 juillet 2015 7
2 nov. 2009 à 19:56
salut michel_m,

merci de te pencher sur mon cas!

Je viens d'essayer avec ton code.
Je met dans la cellule E9 : ='Programa flechas.xlsm'!Module1.delta2(A12;$D$8).
En A12 se trouve le chiffre 4.
mais bizarrement excel m'indique dans la cellule : #NOM?, avec l'indication que la formule contient du texte non reconnu.

ma fonction est pourtant reconnue dans la liste (inserer une fonction, catégorie personnalisée).

????
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
3 nov. 2009 à 10:45
bonjour,
tu es en xlm et donc il ya une autre logique que je ne connais pas (je n'ai pas 2007)
lorsque tu viens sur un forum, sois précis (version, xlm, plage de données dans un autre classeur etc.), on a que ce que tu écris pour tenter de t'aider

néanmoins pour le fun
si tu écris l'adresse dans une cellule (sans le signe =!) il faut que tu changes le paramètre plage en type string et donc

Function delta(i As Integer, plage As String) As Double
Dim lig As Long, col As Byte, k As Integer
lig = Range(plage).Row
col = Range(plage).Column


d'autre part, tu appelles une plage dans un autre classeur et actuellement le calcul de delta s'effectue sur un appel de cellule dans la feuille où tu insères la fonction delta= delta + cells(...
le problème est que l'on a par exemple en E9:
[Classeur1]Feuil1!$D$5:$D$14
et qu'il faudrait
workbooks("classeur1.xls").sheets("feuil1").cells....

le seul moyen avec le moins de trituration possible est alors la fonction "evaluate" après avoir récupéré la lettre de la colonne.
Si la zone se trouve dans le 26 premières colonnes la fonction devient:

Function delta_exterieur(i As Integer, plage As String) As Double
Dim lig As Long, col As String, k As Integer
lig = Range(plage).Row
col = Chr(Range(plage).Column + 64)
adresse = Left(plage, InStr(plage, "!"))
For k = 1 To i - 1
valeur = Evaluate(adresse & col & (lig + k))
delta = delta + valeur * (i - k)
Next k
End Function


pour 2 ou 3 lettres (je n'ai pas 2007) je vois pas trop...

une fonction n'est généralement pas aisée à créer et doit être pensée pour un usage général; pour des usages restreints on peut utiliser une "sous-sub" paramétrée ou non plus facile à créer qu'une fonction

0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
3 nov. 2009 à 11:06
Bonjour féféx et michel_m

J'ai regardé le fichier joint et j'ai le même comportement (1 puis des 0)

Attention car comme je ne dispose que de Excel 2003 au boulot j'ai utilisé le convertisseur.

je constate la chose suivante :

1/ Je me retrouve avec 2 fois la fonction delta une fois définie dans module1 et une deuxième fois comme fonction de la feuille feuil1. Donc si c'est pareil en 2007 il ne faut garder que celle du module et supprimer l'autre.

2/ La fonction delta utilisée est en majuscule (DELTA) alors qu'elle est définie en minuscule (delta). Si en cellule E8 je remets delta en minuscule puis je recopie vers le bas, les valeurs se calculent.

3/ Attention au calcul lui même dans la boucle k commence à 1 donc p commence à 9 et non pas à 8, j'ignore si c'est normal.

Voila, à vérifier si il ne s'agit pas des effets de bord du convertisseur 2007 à 2003 ou c'est pareil dans le fichier original

A+
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
3 nov. 2009 à 11:57
Re bonjour,

Bon alors voila la conclusion (elle était simple mais ma connaissance d'Excel 2007 n'était pas suffisante) :

DELTA(nombre1;nombre2) est une fonction nouvelle d'excel 2007 elle teste l'égalité entre deux nombres . Si l'argument nombre 2 est omis, il teste l'égalité avec 0.

Donc il faut utiliser un autre nom de fonction...

A+
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
3 nov. 2009 à 12:36
Merci, Pilas mais pas les moyens de me procurer 2007 surtout que 2010 arrive!
ma proposition delta_exterieur fonctionne avec le classeur source dans le m^me dossier ; le 8 correspondant au début de la zone et en connaissant ainsi la ligne de départ (lig) on peut démarrer avec k=1 sans ajouter 8
pour féfex:
la syntxe que je proposai était:
(A12;$D$8:$D$x). x dépendant de ta liste

0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
3 nov. 2009 à 13:05
Salut michel_m

J'adhère, bien entendu, à ton avis sur l'orthodoxie de l'utilisation des fonctions. Pour ma part j'étais obnubilé par l'erreur initiale et je voulais comprendre pourquoi cela ne fonctionnait pas. Maintenant, ta fonction semble bien meilleure et plus générale et en plus comme elle s’appelle delta_exterieur, elle solutionne le pb !!!

A+ sur un autre topic.
0
féféx Messages postés 31 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 6 juillet 2015 7
3 nov. 2009 à 16:44
Bonjour Messieurs,

Merci pour votre aide le probleme est résolue.

Double erreur de ma part. Comme tu l'as vu pilas, j'ai nommé ma fonction delta comme celle existant sur excel d'ou la confusion.Merci, je comprend mieux la liste de 0 et le 1 au début.

deuxieme erreur : mes macros n'etaient pas activées d'ou la reticence d'excel a reconnaitre la fonction appelée.
La je dois avouer que je suis médiocre.

Michel, d'abord désolé si je ne suis pas très clair dans mes explications. J'ai du mal a comprendre les finesses d'excel et encore plus a les decrire pour trouver les problemes! (mais je vais faire des efforts ! )

Merci ta fonction, elle fonctionne parfaitement. Elle est meilleur que la mienne dans le sens ou elle prend en compte le decalage de 8 lignes dans sa declaration : delta_exterieur(A8,$D$8).
Je vais aussi essayer ta proposition comprenant la commande evaluate.. je te tiens au courant du résultat.

D'apres toi il est plus facile de faire des procedures simples et de les combiner après pour faire une fonction?
Je vais y reflechir!

Merci encore a vous deux pour votre aide et vos explications.

Pour la petite histoire, je travaille sur le réajustement des voies de tgv. un virage en arc de cercle se symbolise par des valeurs de flèches constantes (sauf en début et fin deux demi fleches appelées rampes)

l'écart entre flèche réelle et fleche theorique me donne petit delta.

cette fonction me sert a calculer l'écart final à l'abcisse x (somme des ecarts sur chaque points ponderés par l'écart entre le point source de l'écart et le point x) en vue d'une rectification (ponctuelle ou lineaire) sur les flèches.

voila le fichier v1.0 si cela vous interesse : http://www.cijoint.fr/cjlink.php?file=cj200911/cije2Ad6Zk.xls
Un grand merci
a bientot sur un autre sujet!
Féféx
0