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 :

Boucle de calcul avec conditions


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    Bonjour à tous,

    J'aimerai créer un fichier me permettant de simuler la possibilité de gain en créant une "montante" (modulable: choix de montante) en fonction du résultat, si gain on revient au depart de la montante et si perte on continue la montante....

    J'ai déjà créer sur la base de formule excel, une partie...mais celle-ci devient obsolete et les formules deviennent une rallonge de "si, ou et Et" imbuvable...

    Il faut que je passé par du vba pour simplifier la chose, d'où la raison de ce message....

    Explications pour une 1ère approche:
    Voici ma base de données et explications:
    Nom : Capture.PNG
Affichages : 551
Taille : 99,9 Ko

    A savoir que mon fichier comporte plus de 5000 lignes sur 4 feuilles


    Seb

    En PJ mon fichier sans macro, pas de risques
    GestionV1.xlsm

    re,

    Par la suite j'aimerai incorporer d'autres critères pour la simulation (en fonction du nb de partants, d'un écart, avec arrêt, sans arrêt, et un bilan pour chaque critères).
    Le fichier sera dynamique car la base de données en automatiquement mise à jours tous les jours....donc calcule automatique

    Merci d'avance pour votre aide

    Seb

  2. #2
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut 1ère ébauche
    bonjour à tous,

    voici une 1ère ébauche du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    Sub CalculMontante2()
    Dim DerLig As Long
    Dim m As Byte
    Dim DernCol As Integer
    Dim x As Long
     
    'Dernière ligne vide et colonne
    'DerLig = Range("V" & Rows.Count).End(xlUp).Row '+ 1
    DerLig = [V65536].End(xlUp).Row
    DernCol = Cells(DerLig, Cells.Columns.Count).End(xlToLeft).Column '+ 3 'colonne U
     
    With Feuil2
        'Mise 1-4-7-10 = 1+3= 4 +3= 7 +3= 10
        'For m = 1 To 10 Step 3
         x = DerLig + 1
            If Range("B" & x) = Range("G" & x) Then
                'Result SI(NB.SI(B4;G4)=0;"P";"G")
                Range("V" & x) = "G"
     
                'Cote SI(V4="P";0;M4)
                Range("W" & x) = Range("L" & x)
                'Mise
                Range("X" & x) = m
     
                'Gain brut SI(X4="";"";W4*X4)
                Range("Z" & x) = Range("W" & x) * Range("X" & x)
     
                'Cumul mise SOMME($X$4:X4)
                Range("Y" & x).FormulaLocal = "=SOMME($X$4:X4)"
     
                'Cumul Gain SI(X4="";"";SOMME($Z$4:Z4))
                Range("AA" & x).FormulaLocal = "=SOMME($Z$4:Z4)"
     
                'Résultat net SI(X4="";"";SOMME($Z$4:Z4)-SOMME($X$4:X4))
                Range("AB" & x).FormulaLocal = "=SOMME($Z$4:Z4)-SOMME($X$4:X4)"
            Else
                Range("V" & x) = "P"
                'Mise
                Range("X" & x) = m
                'Gain brut
                Range("Z" & x) = Range("W" & x) * Range("X" & x)
                'Cumul mise
                Range("Y" & x).FormulaLocal = "=SOMME($X$4:X4)"
                'Cumul Gain SI(X4="";"";SOMME($Z$4:Z4))
                Range("AA" & x).FormulaLocal = "=SOMME($Z$4:Z4)"
                'Résultat net SI(X4="";"";SOMME($Z$4:Z4)-SOMME($X$4:X4))
                Range("AB" & x).FormulaLocal = "=SOMME($Z$4:Z4)-SOMME($X$4:X4)"
            End If
        'Next
    End With
    End Sub
    Ici le code doit être relancé pour chaque ligne du tableau, de plus je n'arrive pas à faire évoluer les "formulalocal" qui sont entre "....", donc du coup il ne calcul pas ce que je souhaite.


    Bien évidemment il ne remplit pas tous ce que je souhaite pour le moment, si vous pourriez apporté vos lumières j'en serai très reconnaissant....

    seb

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 754
    Points : 28 605
    Points
    28 605
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Si tu estimes que tes formules Excel sont trop longues, pourquoi ne passes-tu pas par une fonction personnalisée ?
    C'est du VBA mais cela a l'avantage d'être utilisable comme une fonction. Il y a des contraintes mais dans ton cas, je pense que cela se justifie.

    A lire Les fonctions personnelles dans Excel
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    Bonjour Philippe,

    Merci pour le lien, ça m'a été très aidant..

    voici ce que j'en n'ai sorti:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function GainBrut(GB As Double) As Double
    'GainBrut doit être = cellule mise * cellule cote
    ' CGB--> Calcul Gain Brut
    Dim CGB As Double
    CGB = Range("W4") * Range("X4")
    GainBrut = CGB
     
    End Function
    Hors ici les cellules sont fixe "W4 et X4"

    Dans mon code plus haut, j'utilise la variable "x" pour faire évoluer les cellules, dois-je rendre la variable "x" public, déclarer avant le sub, pour que dans la fonction, je puisse remplacer le W4 et X4 en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("W" & x) * Range("X" & x)
    Ce qui veut dire que dans mon code je devrai remplacer ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Gain brut SI(X4="";"";W4*X4)
                Range("Z" & x) = Range("W" & x) * Range("X" & x)
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Gain brut SI(X4="";"";W4*X4)
                Range("Z" & x) = GainBrut
    Seb

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 754
    Points : 28 605
    Points
    28 605
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tu peux passer comme argument une variable objet de type Range et utiliser sa propriété Row. Je vois que tu passes un argument (GB) de type double que tu n'utilises pas dans la fonction.

    Attention que tu ne peux pas écrire dans une cellule ni sélectionner une feuille dans une fonction personnalisée.
    En résumé, tu ne peux pas faire d'action. En revanche tu peux parcourir une collection de feuilles et faire la somme de plage de cellules de celles-ci ,

    J'essayerai de donner quelques exemples dans l'après-midi car j'ai pas trop le temps pour l'instant.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    Re,

    Oui c'est vrai, je me suis trompé...

    Dans mon cas j'ai besoin de faire des calculs à partir de valeurs contenues dans des cellules pour chaque ligne

    en gros transformer cette partie de code en fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    'Cote SI(V4="P";0;M4)
                Range("W" & x) = Range("L" & x)
                'Mise
                Range("X" & x) = m
     
                'Gain brut SI(X4="";"";W4*X4)
                Range("Z" & x) = Range("W" & x) * Range("X" & x)
     
                'Cumul mise SOMME($X$4:X4)
                Range("Y" & x).FormulaLocal = "=SOMME($X$4:X4)"
     
                'Cumul Gain SI(X4="";"";SOMME($Z$4:Z4))
                Range("AA" & x).FormulaLocal = "=SOMME($Z$4:Z4)"
     
                'Résultat net SI(X4="";"";SOMME($Z$4:Z4)-SOMME($X$4:X4))
                Range("AB" & x).FormulaLocal = "=SOMME($Z$4:Z4)-SOMME($X$4:X4)"
    En sachant que cette fonction sera appelé pour chaque ligne où il y a un calcul à faire....

    Donc dans ma fonction, ce sont des "range" qui évoluent....

    c'est peut-être de ce genre là, si je fais une fonction juste pour la partie "Gain brut":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function GainBrut(x As Range)
    par contre pour le calcul ????????????
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("Z" & x) = Range("W" & x) * Range("X" & x)
    Bon je continue de chercher

    seb

  7. #7
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    Bon ça avance

    Donc dans ma fonction, ce sont des "range" qui évoluent....
    Faux car les range évoluent dans mon sub, ici je ne fais appel qu'à un calcul...

    voici ce que j'ai fait dans mon sub:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'Gain brut
                'Range("Z" & i) = Range("W" & i) * Range("X" & i)
                Dim GB As Integer
                Dim Val1 As Integer, val2 As Integer
                Val1 = Range("W" & i)
                val2 = Range("X" & i)
                GB = GainBrut(Val1, val2)
                Range("Z" & i) = GB
    Et pour la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function GainBrut(Nbre1 As Integer, Nbre2 As Integer) As Integer
     
        GainBrut = Nbre1 * Nbre2
     
    End Function
    Seb

  8. #8
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Bonjour,

    En fait il faut passer toutes les données dont tu as besoin par les paramètres ..


    tu peu remplacer ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
          'Gain brut
                'Range("Z" & i) = Range("W" & i) * Range("X" & i)
                Dim GB As Integer
                Dim Val1 As Integer, val2 As Integer
                Val1 = Range("W" & i)
                val2 = Range("X" & i)
                GB = GainBrut(Val1, val2)
                Range("Z" & i) = GB
    grâce à la fonciton suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function GainBrut(Nbre1 As range, Nbre2 As range) As Integer
     
        GainBrut = Nbre1 * Nbre2
     
    End Function
    que tu place en Z1 :

    puis tu copie la formule dans toutes les lignes de la colonne Z dont tu as besoin ...

  9. #9
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    Bonjour bbil,

    oui, Je comprends

    C une solution que j'avais retenu, mais je souhaite le faire que en vba, j'ai un tableau de plus de 5000 lignes, avec mis à jour tous les jours donc en constante évolution....de plus cela m'entraine pour le codage...

    Seb

  10. #10
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    Bonjour à tous,

    Toujours avec mon problème de fonction,

    Voici ce que j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("Y" & i).FormulaLocal = "=SOMME($X$4:X4)"
    Et j'aimerai réalisé ceci dans une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Function CumulMise(X As Range)
        Dim Plage_calcul As Range
            Set Plage_calcul = Range(X4 & ":" & X.Address)
        CumulMise = WorksheetFunction.Sum(Plage_calcul)
    End Function
    Et bien évidemment ça ne fonctionne pas

    Comment faire appelle à cette fonction, j'ai pas encore bien saisie comment on fait...

    J'ai essayé comme ça, mais erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '.Range("Y" & i) = CumulMise(.....)
    C'est les parenthèses qui me pose problème

    Merci de votre aide

    Seb

  11. #11
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 754
    Points : 28 605
    Points
    28 605
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Et j'aimerai réalisé ceci dans une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Function CumulMise(X As Range)
        Dim Plage_calcul As Range
            Set Plage_calcul = Range(X4 & ":" & X.Address)
        CumulMise = WorksheetFunction.Sum(Plage_calcul)
    End Function
    Et bien évidemment ça ne fonctionne pas
    Cela ne peut effectivement pas fonctionner.

    Ce que tu souhaites faire, se résume à ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function CumulMise(rng As Range)
     CumulMise = WorksheetFunction.Sum(rng)
    End Function
    mais franchement cela ne sert pas à grand chose puisque cette fonction existe nativement dans Excel
    En vba tu peux appeler la procédure comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
     MsgBox CumulMise(Range("y4:y10"))
    End Sub
    Depuis Excel
    Mais je répète sans aucun intérêt et plus lent que
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  12. #12
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    Bonjour Philippe,

    Encore une fois merci, franchement je me complique la vie...

    Par la fonction VBA c simple en faite, et c vrai que par excel c plus rapide....

    On apprend de ces erreurs, et cela me permet d'avancer

    Merci
    Seb

  13. #13
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    Bonjour à tous,

    J'ai une question

    Comment faire évoluer comme dans l'exemple au dessus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
     MsgBox CumulMise(Range("y4:y10"))
    End Sub
    Le Y10 doit prendre +1 et Y4 fixe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CumulMise(Range("$y$4:y" & i))
    dans ce genre qui ne fonctionne pas
    Ma cellule Y4 ne bouge pas et ma cellule "y & i" évolue grâce à une boucle...

    suis-je clair?

    Seb

  14. #14
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 754
    Points : 28 605
    Points
    28 605
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tu te compliques vraiment la vie
    de la même manière que
    C'est bien le principe de l'utilisation de référence absolue et relative
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  15. #15
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    Salut Philippe,

    Oui je me complique, mais c à des fins de comprendre le comportement....

    Mais dans mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    Sub CalculMontante1()
    Dim DerLig As Long
    Dim M As Byte
    Dim DernCol As Integer
    Dim i As Long
    Dim GB As Integer, Val1 As Integer, Val2 As Integer
    Dim rng As Range
    
    'Dernière ligne vide et colonne
    'DerLig = Range("V" & Rows.Count).End(xlUp).Row '+ 1
    DerLig = [V65536].End(xlUp).Row
    DernCol = Cells(DerLig, Cells.Columns.Count).End(xlToLeft).Column '+ 3 'colonne U
    
    With Feuil2
        'Mise 1-4-7-10 = 1+3= 4 +3= 7 +3= 10
        'For m = 1 To 10 Step 3
        
         i = DerLig + 1
         
            If .Range("B" & i) = .Range("G" & i) Then
            
                'Result SI(NB.SI(B4;G4)=0;"P";"G")
                .Range("V" & i) = "G"
                
                'Cote SI(V4="P";0;M4)
                .Range("W" & i) = .Range("L" & i)
                
                'Mise
                .Range("X" & i) = 1
    '*************************************************************************
                'GAIN BRUT SI(X4="";"";W4*X4)
                'Range("Z" & i) = Range("W" & i) * Range("X" & i)
                
                Val1 = .Range("W" & i)
                Val2 = .Range("X" & i)
                GB = GainBrut(Val1, Val2)
                .Range("Z" & i) = GB
    '*************************************************************************
                'Cumul mise SOMME($X$4:X4)
                .Range("Y" & i).FormulaLocal = "=SOMME($X$4:X4)"
                
                'Cumul Gain SI(X4="";"";SOMME($Z$4:Z4))
                .Range("AA" & i).FormulaLocal = "=SOMME($Z$4:Z4)"
                
                'Résultat net SI(X4="";"";SOMME($Z$4:Z4)-SOMME($X$4:X4))
                .Range("AB" & i).FormulaLocal = "=SOMME($Z$4:Z4)-SOMME($X$4:X4)"
                
            Else
            
                .Range("V" & i) = "P"
                
                'Mise
                .Range("X" & i) = 1
    '**********************************************************************
                'GAIN BRUT
                'Range("Z" & i) = Range("W" & i) * Range("X" & i)
                
                Val1 = .Range("W" & i)
                Val2 = .Range("X" & i)
                GB = GainBrut(Val1, Val2)
                .Range("Z" & i) = GB
    '**********************************************************************
                'CUMUL MISE
                '.Range("Y" & i).FormulaLocal = "=SOMME($X$4:X4)"
                rng = Range("$X$4:X" & i)
                .Range("Y" & i) = CumulMise(rng)
                
                'Cumul Gain SI(X4="";"";SOMME($Z$4:Z4))
                .Range("AA" & i).FormulaLocal = "=SOMME($Z$4:Z4)"
                
                'Résultat net SI(X4="";"";SOMME($Z$4:Z4)-SOMME($X$4:X4))
                .Range("AB" & i).FormulaLocal = "=SOMME($Z$4:Z4)-SOMME($X$4:X4)"
                
            End If
        'Next
    End With
    End Sub
    '**************************************************************
    Function GainBrut(Val1 As Integer, Val2 As Integer) As Integer
        GainBrut = Val1 * Val2
    End Function
    '**************************************************************
    Public Function CumulMise(rng As Range)
        
        CumulMise = WorksheetFunction.Sum(rng)
    End Function
    C'est dans la partie bleu du code que je coince...

    Seb

  16. #16
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Bonjour,

    juste en passant j'ai pas tous lu .. tous ce que je peu dire c'est qu'il ne faut jamais utiliser les objets range cells .. directement sans les préfixer en renseignant leur parent (feuille excel) ... revoit tout tes "Range" ... et rajoute au minimum un point devant tes range...

  17. #17
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    Salut bbil,

    J'ai omis un "." seulement dans la partie bleu de mon code???
    Je viens de le corriger

    seb

  18. #18
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut Re a tous
    Bon j'avance,

    J'ai un doute, voici
    Nom : Capture.PNG
Affichages : 320
Taille : 40,5 Ko
    Comme vus pouvez le voir,
    J'aimerai que lorsque "AC" =G alors on passe à la date du jour suivant, mais je n'ai pas d'idée pour lui coder çà

    voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    If .Range("AF" & DerLig - 1).Value >= 0 And Not IsEmpty(.Range("AF" & DerLig - 1)) = True Then
                Result = .Range("AC" & DerLig - 1)
                    Select Case Result
                    
                        Case Is = "G" 'Dans le cas d'un gagnant on arrêt et passe au jour suivant
                            If IsDate(.Range("A12")) = True Then
                            NumLig = .Range("A12").Row 'renvoi le num de la ligne
                                MsgBox NumLig
                            End If                    
                        Case Is = "P" 'Dans le cas d'un perdant
                    
                            CellAF = .Range("AD" & DerLig - 1)
                            
                            'MISE
                            If IsEmpty(CellAF) Then
                                M = 1
                                .Range("AD" & DerLig) = M
                            ElseIf CellAF = 1 Then
                                M = .Range("AD" & DerLig - 1)
                                M = M + 3
                                .Range("AD" & DerLig) = M
                            ElseIf CellAF = 4 Then
                                M = .Range("AD" & DerLig - 1)
                                M = M + 3
                                .Range("AD" & DerLig) = M
                            ElseIf CellAF = 7 Then
                                M = .Range("AD" & DerLig - 1)
                                M = M + 3
                                .Range("AD" & DerLig) = M
                            ElseIf CellAF = 10 Then
                            
                                M = 1
                                .Range("AD" & DerLig) = M
                            Else
                                M = 1
                                .Range("AD" & DerLig) = M
                            End If
                        End Select
                Else
                    .Range("AD" & DerLig) = 1
            End If
    Dans la partie bleu, je suis dans un select case, ici, je test si en A j'ai une date, et je renvoi le num de la ligne où il y celle-ci.
    A savoir que le "range("A12") n'était que pour le test, car mon tableau est constitué de 100taine de lignes, donc la range doit évoluer....

    Si vous avez une idée, pour lui dire que si AC="G" alors je passe au jour suivant, et ainsi de suite chaque fois qu'il y a un "G"

    Seb

  19. #19
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    et ben dis donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    If .Range("AF" & DerLig - 1).Value >= 0 And Not IsEmpty(.Range("AF" & DerLig - 1)) = True Then
                Set celluleG = .Range("AC" & DerLig - 1)
                    Select Case celluleG.Value
     
                        Case "G"  'Dans le cas d'un gagnant on arrêt et passe au jour suivant
     
                            NumLig = Cells(1, celluleG.Row).End(xlDown).Row '( 'renvoi le num de la ligne
                                MsgBox NumLig
                            End If
    ou peut etre mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NumLig =.range( .Cells(1, celluleG.Row),cells(rows.count,1).find("*").row
    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

  20. #20
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    Salut Patrick,
    ravi de te voir sur ce fil....tu vas me dire encore lui....

    Désolé mais je ne voir pas bien le rapport avec ma demande.....Ahh ou alors c'est moi avec mes explications qui t'ont amener à coder çà??? je le vois plutôt comme çà

    les deux solutions renvoient la même chose en l'occurrence ici "3"????? je vois pas bien le truc....

    Bon je regarde pourquoi

    Seb

Discussions similaires

  1. PHPEXCEL impossible de lire le contenu d'une ligne avec formule
    Par Akim13 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 08/05/2013, 15h54
  2. VBA - Copier cellules avec formules
    Par Alecine dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 23/05/2008, 14h41
  3. Réponses: 6
    Dernier message: 28/11/2005, 12h03
  4. [D2005]Compilation impossible avec version Personnal
    Par fab56 dans le forum Delphi .NET
    Réponses: 4
    Dernier message: 16/08/2005, 19h10
  5. [Requête] Difficile (impossible ?) avec des dates
    Par starch dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/04/2004, 11h26

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