Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Rem c'est delirant le VB

  • Initiateur de la discussion Initiateur de la discussion ortollj
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

O

ortollj

Guest
Rem c'est delirant le VB, si je mets les deux lignes ci dessous sur la meme ligne ca ne compile pas !

' comme ca: If P <= N Then combint = ComBin(N, P)😡

If P <= N Then
combint = ComBin(N, P)
Else
combint = 0
End If
 
Re : Rem c'est delirant le VB

Re...
Votre souci vient de là :
Code:
[COLOR="DarkSlateGray"][B]      For i = TopBound To N
         num = num * i
      Next i
      For i = 1 To LowBound
         div = div * i
      Next i[/B][/COLOR]
Ces boucles peuvent rapidement provoquer un dépassement de capacité.
En fait (en supposant que P>=N/2), vous calculez séparément
num = (P+1)*(P+2)* ... *(N-1)*N
et
div = 1*2* ... *(N-P-1)*(N-P)
(c'est-à-dire (N-P)!), puis vous divisez num par div.

Pour éviter d'obtenir de trop grands nombres, vous pouvez réorganiser le calculs en couplant les deux boucles pour travailler avec des résultats intermédiaires les plus petits possible et calculer :
Code:
[COLOR="DarkSlateGray"][B]ComBina = [N/(N-P)]*[(N-1)/(N-P-1)]*[(N-2)/(N-P-2)]* ... *[(P+2)/2]*[(P+1)/1][/B][/COLOR]
Ce qui donne, en une seule boucle :
Code:
[COLOR="DarkSlateGray"][B]   ComBina = 1
      For i = LowBound To 1 Step -1
         ComBina = ComBina * (N - LowBound + i) / i
      Next i[/B][/COLOR]
Il faut bien entendu que ComBina soit de type Double.
En faisant cela, vous pourrez constater que les tests du début de procédure deviennent inutiles. En les supprimant, vous obtiendrez :
Code:
[COLOR="DarkSlateGray"][B]Function ComBina(ByVal N As Long, ByVal P As Long) As Double
Dim LowBound As Long
Dim i As Integer
   LowBound = WorksheetFunction.Min(P, N - P)
   ComBina = 1
   For i = LowBound To 1 Step -1
      ComBina = ComBina * (N - LowBound + i) / i
   Next i
End Function[/B][/COLOR]
qui est très proche de la procédure que j'ai utilisée, dès lors qu'on en élimine le calcul logarithmique :
Code:
[COLOR="DarkSlateGray"][B]Function ComBin2(N, P)
Application.Volatile
Dim i As Long, expo As Long
   ComBin2 = 1
   On Error GoTo E
   N = Int(N)
   P = Int(P)
   P = WorksheetFunction.Min(P, N - P)
   For i = P To 1 Step -1
      ComBin2 = ComBin2 * (N - P + i) / i
   Next i
S: On Error GoTo 0
Exit Function
E: ComBin2 = "#NOMBRE!": Resume S
End Function[/B][/COLOR]
En espérant que ces considérations vous soient utiles...​
ROGER2327
#2834
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

  • Question Question
Microsoft 365 Problème de date
Réponses
5
Affichages
358
Réponses
5
Affichages
912
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…