Formule pour faire une boucle

XkevinX

XLDnaute Junior
Bonjour,


Juste une petite question :

Est-il possible de faire une boucle avec une formule commençant par " = " ? :eek:

Si oui, quelle serait la syntax d'une telle formule ?


Merci d'avance.
 

Misange

XLDnaute Barbatruc
Re : Formule pour faire une boucle

Bonjour
non
une formule ne traite qu'une cellule (ou une plage de cellule dans le cas des formules matricielles) et renvoie 1 résultat.
Les boucles c'est en VBA et la raison de passer au VBA c'est bien souvent pour résoudre ce besoin.

[edit : salut Papou !]
 
Dernière édition:

Paritec

XLDnaute Barbatruc
Re : Formule pour faire une boucle

Bonjour XkevinX le forum
non tu ne peux faire des boucles que avec du vba, enfin tu veux faire quoi? un petit fichier les explications qui vont bien dedans et c'est parti
a+
papou:eek:

EDIT : Bonjjour Misange, j'étais entrain de répondre quand tu as posté bonne journée a+ Papou:eek:
 

ROGER2327

XLDnaute Barbatruc
Re : Formule pour faire une boucle

Bonjour à tous


Je partage partiellement les avis précédents. Il semble bien qu'il n'existe pas de structure permettant de construire une boucle explicite dans une formule Excel.
Mais de nombreuses formules peuvent être vues comme boucles implicites, dans le sens où leur traduction en VisualBasic ne peut guère s'imaginer sans au moins une boucle.

Un exemple. Le code
VB:
Function EstPremier(n&) As Boolean
Dim i&
    If n > 1 And (n Mod 2 Or n = 2) Then
        EstPremier = True Or (n = 2) Or (n = 3)
        For i = 3 To 1 + 2 * (Int(Sqr(n)) \ 2) Step 2
            EstPremier = EstPremier And (n Mod i)
        Next
    Else
        EstPremier = False
    End If
End Function
est un code qui renvoie VRAI si l'argument n est un entier premier, FAUX dans le cas contraire.
Je ne pense pas, jusqu'à preuve du contraire, que ce code puisse se concevoir sans boucle.

Or, il n'est pas difficile de construire une fonction Excel qui fait le même travail.
Par exemple celle-là :
Code:
=SI(ET(A1>1;OU(MOD(A1;2);A1=2));
OU(A1=2;A1=3;ET(MOD(A1;1+2*LIGNE(INDIRECT("1:"&ARRONDI(RACINE(A1)/2;0))))));
FAUX)
(Formule à valider par Ctrl Maj Entrée)

C'est en ce sens que je nuance. Qu'en pensez-vous ?


ROGER2327
#5827


Dimanche 8 Palotin 139 (Saint Bougrelas, prince - fête Suprême Tierce)
8 Floréal An CCXX, 7,1359h - champignon
2012-W17-5T17:07:34Z
 
Dernière édition:

Misange

XLDnaute Barbatruc
Re : Formule pour faire une boucle

Bonsoir Roger
tu capillotractes un peu là :)

dans le même genre : tu peux voir la fonction fréquence comme "bouclant" pour remplir une plage de cellules. MAis je ne pense pas que le sens de la question initiale soit celui là :)
 

XkevinX

XLDnaute Junior
Re : Formule pour faire une boucle

Bonjour,


Déjà merci pour vos réponses.

Après ma question repose sur le fait que j'effectue une formule et je souhaiterais que celle-ci soit répétée x fois ( x représentant le nombre de valeurs d'une colonne d'un onglet différent ).

J'ai la formule qui m'intéresse et celle qui calcule le nombre de valeurs. Il me manque donc que la boucle.

Par contre, je n'y connais absolument rien en VBA :(
 

Paritec

XLDnaute Barbatruc
Re : Formule pour faire une boucle

bonjour Xkevinx le forum
alors si c'est que cela
voilà a+
Papou:eek:

Code:
Sub copierformule()
    Dim fin&
    With Feuil1    ' le nom de ta feuille ou le codename
        fin = .Range("A" & Rows.Count).End(xlUp).Row
        .Range("A1").Formula = "ta formule en vba" ' si ta formule est en A1
        .Range("A1").AutoFill Destination:=.Range("A1:A" & fin)  ' là tu copies ta formule dans toute la colonne A
    End With
End Sub
 
Dernière édition:

Efgé

XLDnaute Barbatruc
Re : Formule pour faire une boucle

Bonjour XkevinX, Bonjour papou:eek:, Bonjour Misange, Bonjour ROGER2327,
Il existe une possibilité, sans autofil, qui est rarement utilsée.
Sur la proposition de papou, et en récupérant la dernière cellule en colonne B:
VB:
Sub copierformule2()
    With Feuil1
        .Range("A1:A" & .Cells(Rows.Count, 2).End(xlUp).Row).Formula = _
        "ta formule en vba qui commence en A1"
    End With
End Sub
Cordialement
 

Misange

XLDnaute Barbatruc
Re : Formule pour faire une boucle

Bonjour,


Déjà merci pour vos réponses.

Après ma question repose sur le fait que j'effectue une formule et je souhaiterais que celle-ci soit répétée x fois ( x représentant le nombre de valeurs d'une colonne d'un onglet différent ).

J'ai la formule qui m'intéresse et celle qui calcule le nombre de valeurs. Il me manque donc que la boucle.

Par contre, je n'y connais absolument rien en VBA :(


si tu nous montrais ta formule ce serait plus parlant ! et encore mieux un petit classeur exemple joint serait encore mieux... ca éviterait qu'on réponde complètement à côté de ta demande
 

XkevinX

XLDnaute Junior
Re : Formule pour faire une boucle

Bonjour,


Oui Misange, je vais faire cela.


Je vous joindrai un fichier exemple d'ici quelques jours avec les formules utilisées et précisément ce que je souhaite obtenir.

En attendant, merci pour vos réponses et pour votre discussion.

J'ai pas tout compris mais la programmation en VBA semble intéressante.
 

ROGER2327

XLDnaute Barbatruc
Re : Formule pour faire une boucle

Bonjour à tous


La réponse de XkevinX apporte évidemment une autre vision de la chose puisqu'il apparaît qu'il ne s'agit pas du tout de "faire une boucle avec une formule commençant par " = "".
Mais, puisqu'il paraît que je fais des choses bizarres ("tu capillotractes un peu là" : j'espère que ce n'est pas cochon ?), je vais essayer de préciser mon point de vue. En fait, je voulais dire que considérer la résolution d'un problème du double point de vue solution par fonction personnalisée VBA et par formule Excel permet un passage assez mécanique de l'un à l'autre. Je prends un autre exemple.

Supposons qu'on cherche à obtenir la somme des diviseurs propres[SUP](*)[/SUP] d'un entier n supérieur à 2. On conçoit assez facilement qu'il faut se demander si n est divisible par 1 (il est évident que oui !), par 2, par 3, etc., jusqu'à n-1. Chaque fois que la réponse est positive, il faut noter le diviseur, puis faire la somme de ces diviseurs. Le programme de calcul se schématise ainsi :


Début Somme des diviseurs(n)
Somme des diviseurs <-- 0
Pour i de 1 à n-1 : si i divise n alors Somme des diviseurs <-- Somme des diviseurs + i : i suivant
Fin


"i divise n" peut se vérifier de bien des manières :


"(n /i)=Int(n/i)"
ou "n=i*(n\i)"
ou "(n mod i)=0"​


En utilisant la dernière :


Début Somme des diviseurs(n)
Somme des diviseurs <-- 0
Pour i de 1 à n-1 : si (n mod i)=0 alors Somme des diviseurs <-- Somme des diviseurs + i : i suivant
Fin


soit en VisualBasic :

VB:
Function Somme_des_diviseurs(n As Long) As Long
Dim s As Long, i As Long
	For i = 1 To n - 1
		If n Mod i = 0 Then Somme_des_diviseurs = Somme_des_diviseurs + i
	Next i
End Function
ou plus concisément (et sous forme plus arithmétique) :
VB:
Function Somme_des_diviseurs(n As Long) As Long
Dim i As Long
	For i = 1 To n - 1
		Somme_des_diviseurs = Somme_des_diviseurs - (n Mod i = 0)
	Next i
End Function

Je ne suis pas certain qu'on imagine spontanément une formule Excel pour le faire, mais on peut s'inspirer de la fonction VBA. La seule difficulté est de construire la famille d'indices I = [1, 2, 3, ..., n-1]. Supposons qu'on ait résolu cela et que n soit en A1 ; en notant provisoirement I la famille d'indices, la transcription de la boucle est immédiate :

Code:
=SOMME((MOD(A1;I)=0)*I)

Reste à formuler la famille d'indices. La fonction LIGNE() est propice à fournir une famille d'indices. Malheureusement, LIGNE(1:A1-1) n'est pas correct. Ce qui s'arrange grâce à la fonction INDIRECT() en écrivant LIGNE(INDIRECT("1:"&A1-1))).

La formule devient :

Code:
=SOMME((MOD(A1;LIGNE(INDIRECT("1:"&A1-1))))=0)*LIGNE(INDIRECT("1:"&A1-1))))

Il me semble qu'en procédant ainsi, on a traduit de façon très mécanique une boucle VBA en formule Excel. Et, ce qui ne gâte rien, de façon parfaitement rationnelle.

On pourra m'opposer que la formule n'est pas compliquée et qu'on l'aurait écrite spontanément. Mais je ne crois pas que ce soit évident pour tout le monde. (Dans le cas contraire, 95% des discussions de ce forum n'existerait pas.)

Quoi qu'il en soit, voyons que cette méthode permet d'aboutir à des résultats qui ne pourraient en aucun cas être considérés comme évidents par le commun des mortels.

Reprenons le même problème :
Les puristes objecteront que le raisonnement suivi, bien que correct, est un peu sommaire. Et ils auront raison. En effet, on fait n-1 boucles pour la plupart inutiles. Prenons un exemple : n = 12. Les diviseurs propres sont 1, 2, 3, 4, 6. Pour le voir on a dû calculer :
12 mod 1, 12 mod 2, 12 mod 3, 12 mod 4, 12 mod 5, 12 mod 6, 12 mod 7, 12 mod 8, 12 mod 9, 12 mod 10 et 12 mod 11, ce qui est beaucoup trop. En effet, quand on voit que 2 divise 12, il est clair que le quotient 6 est également un diviseur de 12. De même, quand on voit que 3 divise 12, il est tout aussi évident que le quotient 6 est également un diviseur de 12. On aurait donc pu s'arrêter là (c'est-à-dire à la partie entière de racine carrée de 12), à condition que lorsque qu'on ajoute 2 et 3 à la somme des diviseurs, on ajoute par la même occasion 6 (=12 / 2) et 4 (=12 / 3). Bien entendu, il faut régler à part le cas de 1, associé à 12 qui n'est pas un diviseur propre). Un autre cas embêtant est celui des nombres carrés, comme 25 qui, avec cette méthode compterait 5 deux fois. J'arrête là l'étude détaillée, il suffit qu'on ait vu l'importante réduction du volume de calcul qu'apporte ce raisonnement.
On peut le transcrire ainsi en VBA :

VB:
Function Somme_des_diviseurs&(n&)
Dim i&
    Somme_des_diviseurs = 1
    For i = 2 To Sqr(n)
        Somme_des_diviseurs = Somme_des_diviseurs - ((n Mod i) = 0) * (i - (n \ i) * (i <> n \ i))
    Next
End Function

Quoi que plus compliqué, ce code se traduira très aisément en formule Excel si on applique la méthode vue plus haut :
La famille d'indices est ici I = [2, 3, ..., n-1]. La transcription du code VBA donne alors :

Code:
=1+SOMME((MOD(A1;I)=0)*(I+A1/I*(I<>A1/I)))

Reste à transcrire I comme précédemment. Il vient : LIGNE(INDIRECT("2:"&ENT(RACINE(A1))))
et la formule s'écrit :

Code:
=1+SOMME((MOD(A1;LIGNE(INDIRECT("2:"&ENT(RACINE(A1)))))=0)*(LIGNE(INDIRECT("2:"&ENT(RACINE(A1))))+A1/LIGNE(INDIRECT("2:"&ENT(RACINE(A1))))*(LIGNE(INDIRECT("2:"&ENT(RACINE(A1))))<>A1/LIGNE(INDIRECT("2:"&ENT(RACINE(A1)))))))

(On n'oubliera pas de valider de telles formules par Ctrtl Maj Entrée. Cela va sans dire, mais cela va encore mieux en le disant...)

Bien entendu, les problèmes courants restent à régler. Par exemple, pour des questions d'arrondi, il sera prudent d'écrire ARRONDI(RACINE(A1);0) au lieu de ENT(RACINE(A1)).

Je ne suis pas certain que la construction de cette formule sans référence à la formulation en boucle dans VBA soit très simple, et c'est pourquoi je pense que la méthode proposée peut être prise en considération. Je ne prétends pas plus qu'il faut procéder ainsi. Je dis seulement qu'il est possible de le faire. Quelques formules qui m'ont jadis valu un compliment sur ce forum n'ont pas été construites autrement. Enfin, un autre intérêt de ce genre de réflexion est de montrer qu'il y a des voies distinctes, mais assez semblables, de parvenir à un résultat.

Tous les commentaires, fussent-ils défavorables, sont les bienvenus : la confrontation d'idées est le moteur de la création...



ROGER2327
#5828


Lundi 9 Palotin 139 (Saints Boleslas et Ladislas, polonais - fête Suprême Quarte)
9 Floréal An CCXX, 6,0235h - hyacinthe
2012-W17-6T14:27:23Z



Notes :
(*) Rappel pour ceux qui l'auraient oublié :
1°. Un diviseur propre d'un entier est un diviseur différent de l'entier lui-même. Les diviseurs propres de 10 sont donc 1, 2 et 5.
2°. Ce problème vient de la recherche des nombres parfaits. En arithmétique, un entier est dit parfait si et seulement s'il est la somme de ses diviseurs propres.
Il sont assez rares.
Le plus petit est 6 = 1 + 2 + 3. Les parfaits pairs suivants sont :
28 = 1 + 2 + 4 + 7 + 14 ;
496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248 ;
8128 = 1 + 2 + 4 + 8 + 16 + 32 + 64 + 127 + 254 + 508 + 1016 + 2032 + 4064.
Je n'en connais pas d'impair. J'offre un coup de Beaujolais à qui m'en exhibera un...

3°. À partir de ce concept, un certain nombre de choses rigolotes se sont développées. Par exemple la théorie des nombres aimables. Deux nombres sont aimables si l'un est la somme des diviseurs propres de l'autre, et réciproquement. Exemple : 220 et 284.

En Perse, ابو الحسن ثابث ابن قرة (Abu'l Hasan Thabit ibn Qurra' ibn Marwan al-Sabi al-Harrani) avait énoncé, dès le IX[SUP]ème[/SUP] siècle, des conditions pour que deux entiers soient aimables. Sur ces bases, le Marocain Ibn al-Banna al-Marrakushi al-Azdi découvrit 17296 et 18416 au XIV[SUP]ème[/SUP] siècle. Ceux que cela intéresse trouveront des détails chez leur wikipedia.org habituel.
 
Dernière édition:

Paritec

XLDnaute Barbatruc
Re : Formule pour faire une boucle

Bonsoir Roger:eek: Misange:eek: le forum
que dire de votre démonstration sur les chiffres ?
vous avez changé de version excel, mais votre maîtrise des chiffres elle reste bien la même.
Merci pour ces explications sur les chiffres parfaits, je ne savais même pas que cela existait.
bonne soirée à tous
Papou:eek:
 

Discussions similaires

Réponses
3
Affichages
216
Réponses
4
Affichages
167

Statistiques des forums

Discussions
312 305
Messages
2 087 077
Membres
103 455
dernier inscrit
saramachado