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
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
A voir également:
- Boucle for en VBA sur excel
- Liste déroulante excel - Guide
- Mise en forme conditionnelle excel - Guide
- Comment calculer la moyenne sur excel - Guide
- Trier sur excel - Guide
- Si et excel - Guide
13 réponses
pilas31
Messages postés
1825
Date d'inscription
vendredi 5 septembre 2008
Statut
Contributeur
Dernière intervention
24 avril 2020
645
2 nov. 2009 à 00:49
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+
Je pense qu'il faut utiliser la syntaxe suivante pour la valeur de delta :
delta = delta + Feuil1.Cells(p, 4) * (i - k)
A+
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
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...
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...
pilas31
Messages postés
1825
Date d'inscription
vendredi 5 septembre 2008
Statut
Contributeur
Dernière intervention
24 avril 2020
645
2 nov. 2009 à 17:37
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+
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+
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
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
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
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
645
2 nov. 2009 à 19:02
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+
Je le regarde et je te dis.
A+
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
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é!
voila le lien
http://www.cijoint.fr/cjlink.php?file=cj200911/cijP5Up6sQ.xlsm
merci pour ta disponibilité!
michel_m
Messages postés
16602
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 313
2 nov. 2009 à 19:28
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
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
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
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).
????
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).
????
michel_m
Messages postés
16602
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 313
3 nov. 2009 à 10:45
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
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:
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
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
pilas31
Messages postés
1825
Date d'inscription
vendredi 5 septembre 2008
Statut
Contributeur
Dernière intervention
24 avril 2020
645
3 nov. 2009 à 11:06
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+
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+
pilas31
Messages postés
1825
Date d'inscription
vendredi 5 septembre 2008
Statut
Contributeur
Dernière intervention
24 avril 2020
645
3 nov. 2009 à 11:57
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+
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+
michel_m
Messages postés
16602
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 313
3 nov. 2009 à 12:36
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
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
pilas31
Messages postés
1825
Date d'inscription
vendredi 5 septembre 2008
Statut
Contributeur
Dernière intervention
24 avril 2020
645
3 nov. 2009 à 13:05
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.
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.
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
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
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