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 :

Fonction personnalisée qui se répète à l'infini


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Webmarketer
    Inscrit en
    Mars 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Webmarketer

    Informations forums :
    Inscription : Mars 2021
    Messages : 5
    Par défaut Fonction personnalisée qui se répète à l'infini
    Bonjour, je suis débutant en vba et je me retrouve confronté à un problème que je ne comprends pas, et sur lequel je n'ai trouvé aucune solution malgré de multiples essaie et recherches sur Internet, j'en viens donc à poster ce message sur le forum en espérant recevoir un peu d'aide


    Voici la version du code qui me pose problème :



    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
    Option Explicit
     
    Function CalculRecetteDepensePerso(ByRef Montant_TransactionObj As Object, ByRef Nature_Transaction As Object, Compte_Transaction As Object) As Single
     
        Dim targetRow As Integer
        Dim targetCol As Integer
        Dim Montant_Transaction As Single
        Dim sens As String
        Dim functionReturn As Single
     
        Montant_Transaction = Montant_TransactionObj.Value
        targetRow = Application.Caller.Row
     
        If Compte_Transaction.Value = "Perso" And Application.Caller.Column = 8 Then
            targetCol = 8
        ElseIf Compte_Transaction.Value = "Livret Bleu" And Application.Caller.Column = 9 Then
            targetCol = 9
        ElseIf Compte_Transaction.Value = "Eurocompte" And Application.Caller.Column = 10 Then
            targetCol = 10
        ElseIf Compte_Transaction.Value = "Livret Jeune" And Application.Caller.Column = 11 Then
            targetCol = 11
        Else
            Exit Function
        End If
     
        If Nature_Transaction.Value = "D" Then
            sens = "-"
        ElseIf Nature_Transaction.Value = "R" Then
            sens = "+"
        End If
     
        Call CalculRecetteDepensePersoProcedure(Montant_Transaction, sens, targetRow, targetCol, functionReturn)
     
        CalculRecetteDepensePerso = functionReturn
     
    End Function
     
    Sub CalculRecetteDepensePersoProcedure(ByRef Montant_Transaction As Single, ByRef sens As String, ByRef targetRow As Integer, ByRef targetCol As Integer, ByRef functionReturn As Single)
     
        Dim derVal As Single
        Dim i As Integer
     
        '        If Cells(targetRow - 1, targetCol).Value <> "" Then
        '            functionReturn = Evaluate(Replace(CSng(Cells(targetRow - 1, targetCol).Value) & sens & Montant_Transaction, ",", "."))
        '        ElseIf Cells(targetRow - 1, targetCol).Value = "" Then
        '            functionReturn = Evaluate(derVal & sens & Montant_Transaction)
        '        End If
     
        For i = 2 To Cells(1, targetCol).End(xlDown).Row
            If Cells(i, targetCol).Value <> "0" And Cells(i, targetCol).Value <> "" Then
                derVal = Cells(i, targetCol).Value
            End If
        Next
     
     
        functionReturn = Evaluate(Replace(derVal & sens & Montant_Transaction, ",", "."))
     
    End Sub
    Une fois la boucle for de la procédure paramétrer terminer, je repasse sur ma fonction à laquelle j'assigne la valeur de la variable functionReturn. Ce que je ne comprends pas, c'est que les valeurs renvoyées via la deuxième version de mon code (ci-dessous), sont strictement identiques et de même type, mais cette deuxième version ne créer pas de boucle infinie comme la version ci-dessus.

    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
    Option Explicit
     
    Function CalculRecetteDepensePerso(ByRef Montant_TransactionObj As Object, ByRef Nature_Transaction As Object, Compte_Transaction As Object) As Single
     
        Dim targetRow As Integer
        Dim targetCol As Integer
        Dim Montant_Transaction As Single
        Dim sens As String
        Dim functionReturn As Single
     
        Montant_Transaction = Montant_TransactionObj.Value
        targetRow = Application.Caller.Row
     
        If Compte_Transaction.Value = "Perso" And Application.Caller.Column = 8 Then
            targetCol = 8
        ElseIf Compte_Transaction.Value = "Livret Bleu" And Application.Caller.Column = 9 Then
            targetCol = 9
        ElseIf Compte_Transaction.Value = "Eurocompte" And Application.Caller.Column = 10 Then
            targetCol = 10
        ElseIf Compte_Transaction.Value = "Livret Jeune" And Application.Caller.Column = 11 Then
            targetCol = 11
        Else
            Exit Function
        End If
     
        If Nature_Transaction.Value = "D" Then
            sens = "-"
        ElseIf Nature_Transaction.Value = "R" Then
            sens = "+"
        End If
     
        Call CalculRecetteDepensePersoProcedure(Montant_Transaction, sens, targetRow, targetCol, functionReturn)
     
        CalculRecetteDepensePerso = functionReturn
     
    End Function
     
    Sub CalculRecetteDepensePersoProcedure(ByRef Montant_Transaction As Single, ByRef sens As String, ByRef targetRow As Integer, ByRef targetCol As Integer, ByRef functionReturn As Single)
     
    '    Dim derVal As Single
    '    Dim i As Integer
     
                If Cells(targetRow - 1, targetCol).Value <> "" Then
                    functionReturn = Evaluate(Replace(CSng(Cells(targetRow - 1, targetCol).Value) & sens & Montant_Transaction, ",", "."))
                'ElseIf Cells(targetRow - 1, targetCol).Value = "" Then
                    'functionReturn = Evaluate(derVal & sens & Montant_Transaction)
                End If
     
    '    For i = 2 To Cells(1, targetCol).End(xlDown).Row
    '        If Cells(i, targetCol).Value <> "0" And Cells(i, targetCol).Value <> "" Then
    '            derVal = Cells(i, targetCol).Value
    '        End If
    '    Next
    '
    '
    '    functionReturn = Evaluate(Replace(derVal & sens & Montant_Transaction, ",", "."))
     
    End Sub


    J'ai fait des tas de tests, et j'ai la certitude que ça vient de cette boucle for, mais je ne vois pas ce qui cloche.

  2. #2
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 039
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 039
    Par défaut
    Bonjour.
    Moi non plus à la lecture je ne vois pas ce qui cloche.
    Peut-être, ligne 41 la déclaration de i en Integer : si vous avez un tableau de plus de 65535 lignes ça génère un dépassement de capacité.
    Essayez avec un type Long.

    Bonne continuation.

  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
    13 182
    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 : 13 182
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je constate que dans votre deuxième code, vous avez placé les lignes 49 à 56 en commentaire avec en ligne 56
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '    functionReturn = Evaluate(Replace(derVal & sens & Montant_Transaction, ",", "."))
    Or avec l'Option Explicit, en tête de module, vous auriez dû avoir un message d'erreur en utilisant ce premier code car cette variable est déclarée dans la première procédure mais pas comme globale

    Pour renvoyer la valeur d'une fonction on utilise son nom.
    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
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 039
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 039
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Pour renvoyer la valeur d'une fonction on utilise son nom.
    C'est vrai que c'est plus logique de procéder ainsi.
    Mais l'auteur est "débutant" comme il le dit et son code comporte effectivement quelque bizarreries (par exemple les Byref).
    Et les API fonctionnent souvent comme cela : en alimentant une variable passée en argument, c'est peut-etre une habitude de programmation qu'il a prise s'il a été formé dans un autre langage que le VBA. Il faudrait peut-être qu'il découvre le potentiel du VBA pour lui simplifier sa programmation.
    Mais ce n'est pas le sujet.
    Mais la remarque est pertinente, comme mettre Option Explicit qui est indispensable.
    J'ai hâte d'avoir la conclusion de son problème...

  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
    13 182
    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 : 13 182
    Billets dans le blog
    53
    Par défaut
    Bonjour Laurent,
    Mais la remarque est pertinente, comme mettre Option Explicit qui est indispensable.
    Ce n'est pas vraiment une remarque mais un constat car l'initiatrice de cette discussion a bien mis Option Explicit en tête de module donc je m'étonnais qu'elle n'ait pas eu de message d'erreur ou que tout simplement elle ne l'a pas signalé en posant sa question.
    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

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/06/2017, 18h38
  2. submit() qui se répète à l'infini
    Par wwwbillgates dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/10/2012, 15h22
  3. fonction recursive qui donne boucle infini
    Par simpatico dans le forum Débuter
    Réponses: 0
    Dernier message: 05/02/2012, 04h03
  4. Réponses: 1
    Dernier message: 21/10/2011, 14h53
  5. Fonction personnalisée qui ne fonctionne pas
    Par ANOVA dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/07/2010, 16h29

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