IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Comment connaître le nombre de possibilité de combinaison ordre et désordre


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut Comment connaître le nombre de possibilité de combinaison ordre et désordre
    bonjour a tous
    j'ai une serie de nombre de 1 a 35
    je veux les combiner par serie de 3 nombres ex:1-21-16

    je voudrais connaitre le nombre de combinaison possible qui est 35*34*33 malheureusement ce calcul depasse la capassité
    la formule 35^3 me donne 42285 alors que le calcul me donne 39270 qui est juste j'ai testé avec un dico

    ma question est donc
    comment realiser cette simple operation(35*34*33) par vba sans planter un message de depassement de capacité
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  2. #2
    Inactif  
    Homme Profil pro
    Analyste-Programmeur / Intégrateur ERP
    Inscrit en
    Mai 2013
    Messages
    2 511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-Programmeur / Intégrateur ERP
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2013
    Messages : 2 511
    Par défaut
    Bonjour Patrick,

    Je ne sais pas si il y a une solution plus concise en une seule instruction, mais bizarrement, cela fonctionne en faisant le calcul en 2 temps :

    Nom : DVP-PT-dépassement capacité.jpg
Affichages : 656
Taille : 14,7 Ko

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    Bonjour Zirak
    ok a defaut je prend on separe donc l'operation
    souhaiton que je n'ai jamais a a calculer des puissance 10 ou 20
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x = 35 * 34: x = x * 33
    Debug.Print x
    je ne met pas en résolu au cas ou quelqun aurait une solution autre

    Merci Zirak

    EDIT:
    en attendant mieux je me suis fait une petite fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
    MsgBox result_puissance(35, 3)
    End Sub
    '
    Function result_puissance(NBbase&, serie&) As Long
    Dim Nb&: Nb = NBbase
    For i = 1 To serie - 1: Nb = Nb * (NBbase - i): Next: result_puissance = Nb
    End Function
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Inactif  
    Homme Profil pro
    Analyste-Programmeur / Intégrateur ERP
    Inscrit en
    Mai 2013
    Messages
    2 511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-Programmeur / Intégrateur ERP
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2013
    Messages : 2 511
    Par défaut
    Autre solution qui a l'air de fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim resultat As Long
     
    resultat = CLng(35 * 34) * 33

    Edit: cela dit cela oblige effectivement à déconstruire tout de même un minimum le calcul même si il se fait tout de même en 1 fois.

    Au final ta fonction personnalisée que tu as posté entre temps sera toujours plus pratique.

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    oui mais la on est sur une puissance 3 sur puissance 10 ou 20 tu imagine le code

    clng(clng(clng(35*34)*34)*33)*32) etc..........

    perso je pense que si une fonction VBA n'existe pas, ma petite boucle semble etre la meilleure solution pour toute base et serie en terme de simplicité de code

    Merci Zirak
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Inactif  
    Homme Profil pro
    Analyste-Programmeur / Intégrateur ERP
    Inscrit en
    Mai 2013
    Messages
    2 511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-Programmeur / Intégrateur ERP
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2013
    Messages : 2 511
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    perso je pense que si une fonction VBA n'existe pas
    Il y a bien une fonction VBA (correspondant à la fonction PUISSANCE d'une feuille de calcul) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application.WorksheetFunction.Power(35, 3)
    Malheureusement, elle donne le même résultat qu'en faisant 35 ^ 3, à savoir 42875, du coup, comme l'indique Menhir avec ses 3 déclinaisons du calcul, cela dépend de ton besoin, si effectivement, chaque valeur ne peut être utilisée qu'une fois, il vaut mieux passer par ta fonction personnalisée ou peut-être via la proposition de Menhir.


    Bonne fin de journée à vous.

  7. #7
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    35*34*33 malheureusement ce calcul dépasse la capacité
    C'est un problème classique qui est commun à de nombreux langages : quand on fait une opération sur des entiers, le langage considère que le résultat est un entier.
    Dans certains langages, ça tronque même les décimales pour une division.

    Pour le contourner, il faut faire croire au langage que ce sont des nombres décimaux : 35.0 * 34 * 33, ce que VBE traduira par 35# * 34 * 33.

    A noter que ce problème ne se produit pas si on remplace les constantes par des variables de type Long (une raison de plus pour abandonner complètement le type Integer).

    j'ai une serie de nombre de 1 a 35
    je veux les combiner par serie de 3 nombres ex:1-21-16

    je voudrais connaitre le nombre de combinaison possible qui est 35*34*33
    la formule 35^3 me donne 42285 alors que le calcul me donne 39270 qui est juste j'ai testé avec un dico
    35*34*33 : combinaisons si chaque valeur ne peut être utilisée qu'une seule fois, l'ordre ayant une importance (par exemple, classement à l'arrivée d'une course de 35 coureurs).
    35^3 : combinaisons si chaque valeur peut être utilisée plusieurs fois, l'ordre ayant une importance.
    (35*34*33)/3 : combinaisons si chaque valeur ne peut être utilisée qu'une seule fois, l'ordre n'ayant pas une importance (par exemple le nombre d'équipe de 3 personnes parmi 35 candidats).

    comment realiser cette simple operation(35*34*33) par vba sans planter un message de depassement de capacité
    Avec Excel, je ne sais pas si la fonction existe mais tu peux le faire avec une de ces deux solutions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    =FACT(N)/FACT(N-K)
    =K*COMBI(N;K)
    N étant le nombre d'éléments à combiner et K le nombre d'éléments dans une combinaison.

    Bien sûr, ces deux solution sont transposable en VBA avec Evaluate ou WorksheetFunction.

    Reste bien sûr aussi la solution de faire une boucle.
    Dans ce cas, en utilisant une variable de type Long, tu n'auras pas le problème que tu présentes.

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour Menhir
    pour les combi uniques dans l'ordre il y a application.combin(35,3) qui fonctionne tres bien

    oui 35*3 si deux elements identiques sont acceptés dans le tirage d'une sortie
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    pour les combi uniques dans l'ordre il y a application.combin(35,3) qui fonctionne tres bien
    Si tu souhaites faire l'opération que tu évoques au départ (35*34*33), COMBI ne suffira pas, elle donnera 35*34*33/3.
    Pour imager ça, elle calcul le nombre de combinaisons possibles pour un tiercé avec X chevaux au départ mais ne calcul pas le nombre de combinaisons de mettre 3 chevaux au départ parmi X.

    Un simple essai dans Excel te le confirmera.

    D'où la nécessité pour ton calcul de multiplier le résultat de cette fonction par le nombre d'éléments sélectionnés à chaque combinaison.

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    oui j'avais compris je disais simplement que la fonction existe pour(35*34*33)/3 c'est combin
    parcontre j'ai essayé de traduire tes deux exemples en formule vers VBA et ca colle pas pour Combin l'autre je ne sais pas traduire "FACT" en VBA worksheetfunction peut etre tien tu justement la solution avec ca si on peut traduire en VBA
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Inactif  
    Homme Profil pro
    Analyste-Programmeur / Intégrateur ERP
    Inscrit en
    Mai 2013
    Messages
    2 511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-Programmeur / Intégrateur ERP
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2013
    Messages : 2 511
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    l'autre je ne sais pas traduire "FACT" en VBA worksheetfunction peut etre tien tu justement la solution avec ca si on peut traduire en VBA
    C'est bien une WorkSheetFunction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    resultat = Application.WorksheetFunction.Fact(35) / Application.WorksheetFunction.Fact(35 - 3)
    Cela me retourne bien 39270.


    Par contre, même "souci" qu'au départ sur des plus grands nombres (j'ai remplacé le 3 par d'autres valeurs, cela fonctionne jusqu'à 6, mais on a de nouveau un dépassement de capacité à partir de 7).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment connaître le nombre de lignes?
    Par Xanto dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 07/08/2007, 10h23
  2. [C#] Comment connaître le nombre de lignes affectées par un Select ?
    Par diaboloche dans le forum Accès aux données
    Réponses: 6
    Dernier message: 21/09/2006, 13h56
  3. Réponses: 2
    Dernier message: 29/05/2006, 19h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo