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 :

paramètre string fonction -> fonctionne pas toujours?!


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 14
    Points : 2
    Points
    2
    Par défaut paramètre string fonction -> fonctionne pas toujours?!
    Bonjour à tous,

    Sans transition, voici ma question!

    -> J'ai un fichier avec un seul onglet ("feuil1").
    -> Dans cet onglet, les cellules F1 à F9 sont (ou non) une à une remplies et c'est tout "l'enjeu" de ma discussion.
    -> Je veux concaténer le contenu de ces mêmes cellules dans une autre cellule (A3) uniquement lorsqu'elles sont non vides (de F1 à F9).
    Ex : F1 est vide, F3 est vide ainsi que F9 --> je concatène F2, F4, F5, F6, F7, F8 uniquement

    Le code que j'ai fait marche SAUF lorsque F1 est vide. Je ne comprends pas la raison. Le voici : (sorti de son contexte et donc simplifié afin d'avoir vos lumières plus rapidement!) :

    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
    Function ConcatenationLR(ligne As Integer, counter As Integer) As String
     
    Dim lignef As Integer
    Dim expression As String
    Dim counterf As Integer
     
    lignef = ligne
    counterf = counter
    expression = Range("F" & lignef).Value
     
    'Test si champs vide
    If expression <> "" Then
        ' concaténer valeurs des cellules si non vides
        For m = lignef + 1 To lignef + counterf
            If Range("F" & m) <> "" Then
            expression = expression & ", " & Range("F" & m)
            End If
        Next
    Else: Call ConcatenationLR(lignef + 1, counterf - 1)
    End If
    'test de la valeur d'expression -> prend bien la bonne valeur même quand F1 est vide!
    A = MsgBox(expression, vbDefaultButton2)
    ConcatenationLR = expression
     
    -------------------------------------------------------------------------
    End Function
    Sub ok()
     
    Sheets("Feuil1").Select
    'Range("A3").Value ne prend pas la bonne valeur quand F1 est vide.....!
    Range("A3").Value = ConcatenationLR(1, 8)
     
    End Sub
    Voilà, je suis nouveau sur le forum mais crois pourtant beaucoup en lui!

    Merci à tous et n'hésitez pas à donner votre avis!

    Ciao!

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 18
    Points : 29
    Points
    29
    Par défaut
    Sans transition, j'apporte une réponse qui me semble correcte :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    expression = Range("F" & lignef).Value
    'Test si champs vide
    If expression <> "" Then....
    
    Ce premier test signifie que tu ne fais pas le calcul si Expression est vide.
    Or tu as mis dans expression le contenu de F1...

    Donc si F1 est vide, pas de calcul. Je pense que retirer ce premier test t'apportera ta réponse.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Bonjour

    A votre idée :

    Ce premier test signifie que tu ne fais pas le calcul si Expression est vide.
    Or tu as mis dans expression le contenu de F1...

    Donc si F1 est vide, pas de calcul. Je pense que retirer ce premier test t'apportera ta réponse.
    Je réponds que non puisque si F1 est vide, alors on rentre dans le :
    Else: Call ConcatenationLR(lignef + 1, counterf - 1)

    En fait, le problème c'est que ça marche si je demande d'afficher expression via une boîte de dialogue. Mais quand je demande d'écrire expression dans une cellule (c.f. A3 dans notre cas) ça ne marche pas!

    Merci de m'aider!!!

  4. #4
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Je pense que c'est la structure de ta fonction récursive qui ne va pas. 'Expresion' est une variable locale de la fonction. DOnc à chaque appel, une nouvelle variable est crée. Quand tu reviens dans la fonction appelante expression est la variable initiale (vide) et non pas la variable que tu a renseignée dans la fonction appelée.

    Si c'est un exercice sur les fonctions récursives, ça peut s'arranger : passer Expression dans les arguments ByRef de la fonction.

    Sinon une méthode itérative pose moins de problème...

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Mais comment expliquez-vous que lorsque je lance ma procédure "ok" cela marche dans le cas où F1 n'est pas vide ?

  6. #6
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Citation Envoyé par francoisvba Voir le message
    Mais comment expliquez-vous que lorsque je lance ma procédure "ok" cela marche dans le cas où F1 n'est pas vide ?
    Parce que dans ce cas là il n'y a aucun appel récursif! Et seulement un traitement itératif.

    Tu veux une solution récursive ou itérative?
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    heu pardon ce n'est pas ce que je voulais écrire!

    Que F1 soit vide ou non, le A = MsgBox(expression, vbDefaultButton2) en fin de fonction marche toujours!!!!! La boîte de dialogue montre la valeur attendue! Donc la récursivité a belle et bien marché!!

    (récursive je préfèrerais car mon programme est déjà super long... le vrai pas cet exemple raccourci)

    Merci à toi pgz!

  8. #8
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2008
    Messages : 273
    Points : 323
    Points
    323
    Par défaut
    Bonjour,

    J'ai testé en passant la variable 'expression' en public, et ça a l'air de fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public expression As String
    '--------------------------------------------------------------
    Function ConcatenationLR(ligne As Integer, counter As Integer) As String
     
    Dim lignef As Integer
    'Dim expression As String
    Dim counterf As Integer
     
    '...............etc

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Vous êtes sûr ? Ca ne marche pas mieux chez moi (enfin que F1 soit vide ou non, ça s'affiche toujours bien dans mon test A = MsgBox(expression, vbDefaultButton2) mais A3 ne prend toujours aucune valeur lorsque F1 est vide).

    AIDEZ-MOI SIYOUPLAIT!!

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Pardon oOVaveOo, effectivement ça marche en faisant un truc comme ça :

    MAIS COMMENT CELA SE FAIT-IL ???

    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
    Public expression As String
     
    Function ConcatenationLR(ligne As Integer, counter As Integer) 'As String
     
    Dim lignef As Integer
    'Dim expression As String
     
    Dim counterf As Integer
     
    lignef = ligne
    counterf = counter
    expression = Range("F" & lignef).Value
     
    'Test si champs vide
    If (StrComp(expression, "", vbTextCompare) <> 0) Then
        ' concaténer valeurs des cellules si non vides
        For m = lignef + 1 To lignef + counterf
            If Range("F" & m) <> "" Then
            expression = expression & ", " & Range("F" & m)
            End If
        Next
    Else: Call ConcatenationLR(lignef + 1, counterf - 1)
    Exit Function
    End If
     
    End Function
    Sub ok()
     
    Sheets("Feuil1").Select
    Call ConcatenationLR(1, 8)
    Cells(3, 1) = expression
     
    End Sub

  11. #11
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2008
    Messages : 273
    Points : 323
    Points
    323
    Par défaut
    Re,

    Je cite Pgz :
    Bonjour.

    Je pense que c'est la structure de ta fonction récursive qui ne va pas. 'Expresion' est une variable locale de la fonction. DOnc à chaque appel, une nouvelle variable est crée. Quand tu reviens dans la fonction appelante expression est la variable initiale (vide) et non pas la variable que tu a renseignée dans la fonction appelée.

    Si c'est un exercice sur les fonctions récursives, ça peut s'arranger : passer Expression dans les arguments ByRef de la fonction.

    Sinon une méthode itérative pose moins de problème...

    PGZ
    J'ai essayé à ma façon :
    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
    Sub test()
    Range("A3").Value = concat(1, 9)
     
    End Sub
     
    Function concat(ligne As Integer, nb As Byte) As String
     
    Dim i As Integer
    Dim expression As String
     
    expression = Cells(ligne, 6).Value
     
    For i = ligne + 1 To i + nb
        If expression = "" Then
        expression = Cells(i, 6)
        Else
        expression = expression & "," & Cells(i, 6)
        End If
    Next i
     
    concat = expression
    End Function
    @+

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    regardez ceci marche toujours par exemple! Que F1 soit vide ou non!

    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
    Function ConcatenationLR(ligne As Integer, counter As Integer) 'As String
     
    Dim lignef As Integer
    Dim expression As String
    Dim counterf As Integer
     
    lignef = ligne
    counterf = counter
    expression = Range("F" & lignef).Value
     
    'Test si champs vide
    If (StrComp(expression, "", vbTextCompare) <> 0) Then
        ' concaténer valeurs des cellules si non vides
        For m = lignef + 1 To lignef + counterf
            If Range("F" & m) <> "" Then
            expression = expression & ", " & Range("F" & m)
            End If
        Next
    Else: Call ConcatenationLR(lignef + 1, counterf - 1)
    Exit Function
    End If
    'ça marche tout le temps! Ce n'est donc pas la récursivité mais le ConcatenationLR=expression qui ne marche pas toujours!!
    Cells(3, 1) = expression
     
    End Function
    Alors comment expliquer que ma fonction d'origine ne marche pas toujours (l'appel ne marche pas uniquement lorsque F1 est vide....) ?

    Merci à tous!

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par oOVaveOo Voir le message
    Re,

    Je cite Pgz :


    J'ai essayé à ma façon :
    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
    Sub test()
    Range("A3").Value = concat(1, 9)
     
    End Sub
     
    Function concat(ligne As Integer, nb As Byte) As String
     
    Dim i As Integer
    Dim expression As String
     
    expression = Cells(ligne, 6).Value
     
    For i = ligne + 1 To i + nb
        If expression = "" Then
        expression = Cells(i, 6)
        Else
        expression = expression & "," & Cells(i, 6)
        End If
    Next i
     
    concat = expression
    End Function
    @+
    Ceci ne marche pas car nb s'incrémente --> i + nb ne s'arrête pas alors qu'il le devrait.

  14. #14
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Citation Envoyé par francoisvba Voir le message
    Mais je n'explique pas que juste le fait d'écrire cette valeur dans une cellule (et pas l'afficher via une boite de dialogue), change la donne....
    Dans le premier cas la cellule mémorise le résultat du 2ème appel. Dans le second cas le résultat est perdu.

    Cela semble très clair. Et le code de ton premier post doit te permettre de visualiser ce qui se passe. Si F1 est vide, et pas F2, tu as 2 Msgbox : dans le premier, le résultat, dans le deuxième plus rien. Non?

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Merci PGZ,
    mais maintenant j'ai changé la fonction en ajoutant un Exit Function justement pour n'avoir qu'un message de boîte de dialogue (qui est toujours le bon donc...).

    Peux tu m'expliquer pourquoi comme tu dis le cas où F1 est vide, la cellule A13 ne prend rien ? Je vois que cela parait simple pour toi.... hehe

    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
    Function ConcatenationLR(ligne As Integer, counter As Integer) As String
     
    Dim lignef As Integer
    Dim expression As String
    Dim counterf As Integer
     
    lignef = ligne
    counterf = counter
    expression = Range("F" & lignef).Value
     
    'Test si champs vide
    If expression <> "" Then
        ' concaténer valeurs des cellules si non vides
        For m = lignef + 1 To lignef + counterf
            If Range("F" & m) <> "" Then
            expression = expression & ", " & Range("F" & m)
            End If
        Next
    Else: Call ConcatenationLR(lignef + 1, counterf - 1)
    Exit Function
    End If
    'test de la valeur d'expression -> prend bien la bonne valeur même quand F1 est vide!
    A = MsgBox(expression, vbDefaultButton2)
    ConcatenationLR = expression
     
    End Function
    Sub ok()
     
    Sheets("Feuil1").Select
    'Range("A3").Value ne prend pas la bonne valeur quand F1 est vide.....!
    Range("A3").Value = ConcatenationLR(1, 8)
     
    End Sub

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par pgz Voir le message
    Dans le premier cas la cellule mémorise le résultat du 2ème appel. Dans le second cas le résultat est perdu.

    Cela semble très clair. Et le code de ton premier post doit te permettre de visualiser ce qui se passe. Si F1 est vide, et pas F2, tu as 2 Msgbox : dans le premier, le résultat, dans le deuxième plus rien. Non?

    PGZ
    Ok, j'ai compris ce que tu voulais dire! Exact tu as raison. C'est donc pour ça que j'ai rajouté le "exit function" qui devrait résoudre le problème (d'après moi). Mais ça ne change rien.....
    J'aimerais utiliser la récursivité afin que l'affichage soit propre (pas pleins de virgules alors qu'il n'y a rien dans les cellules F1 à F9 etc...)

  17. #17
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Citation Envoyé par francoisvba Voir le message
    Peux tu m'expliquer pourquoi comme tu dis le cas où F1 est vide, la cellule A13 ne prend rien ? Je vois que cela parait simple pour toi.... hehe
    Je pense que tu veux parler de la cellule A3(?)

    Je pense aussi qu'il suffit de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Call ConcatenationLR(lignef + 1, counterf - 1)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     expression =  ConcatenationLR(lignef + 1, counterf - 1)
    Mais franchement ce n'est pas terrible et un code par itération comme celui de oOVaveOo est bien suffisant, ou comme ceci (je n'ai pas testé)
    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
    Function ConcatenationLR(ligne As Integer, counter As Integer) As String
    Dim i As Integer
     
    With Application.ThisWorkbook.Sheets("NomFeuille")
        For i = ligne To ligne + counter
            If .Range("A" & i) <> "" Then ConcatenationLR = ConcatenationLR & ", " & .Range("F" & i)
        Next i
    End With
     
    If ConcatenationLR <> "" Then ConcatenationLR = Mid$(ConcatenationLR, 3)
     
    End Function
     
    Sub ok()
     
    Sheets("Feuil1").Select
    'Range("A3").Value ne prend pas la bonne valeur quand F1 est vide.....!
    Range("A3").Value = ConcatenationLR(1, 8)
     
    End Sub
    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  18. #18
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Merci pgz

    Citation Envoyé par pgz Voir le message
    Je pense que tu veux parler de la cellule A3(?)
    oui désolé j'en ai marre de ce truc!....

    Citation Envoyé par pgz Voir le message
    Je pense aussi qu'il suffit de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Call ConcatenationLR(lignef + 1, counterf - 1)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     expression =  ConcatenationLR(lignef + 1, counterf - 1)
    Non ça ne marche pas non plus.... c'est à ne plus rien comprendre à l'algorythmique...

    Citation Envoyé par pgz Voir le message
    [/CODE]Mais franchement ce n'est pas terrible et un code par itération comme celui de oOVaveOo est bien suffisant, ou comme ceci (je n'ai pas testé)
    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
    Function ConcatenationLR(ligne As Integer, counter As Integer) As String
    Dim i As Integer
     
    With Application.ThisWorkbook.Sheets("NomFeuille")
        For i = ligne To ligne + counter
            If .Range("A" & i) <> "" Then ConcatenationLR = ConcatenationLR & ", " & .Range("F" & i)
        Next i
    End With
     
    If ConcatenationLR <> "" Then ConcatenationLR = Mid$(ConcatenationLR, 3)
     
    End Function
     
    Sub ok()
     
    Sheets("Feuil1").Select
    'Range("A3").Value ne prend pas la bonne valeur quand F1 est vide.....!
    Range("A3").Value = ConcatenationLR(1, 8)
     
    End Sub
    PGZ
    Je te remercie pgz, en fait je prends le code de oOVaveOo mais légèrement modifié car deux "If" manquaient afin d'avoir un rendu propre (sans virgule, etc.). Voici donc ce code si jamais ça peut aider quelqu'un.... :

    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
    Sub test()
    Range("A3").Value = concat(1, 9)
     
    End Sub
     
    Function concat(ligne As Integer, nb As Byte) As String
     
    Dim i As Integer
    Dim expression As String
     
    expression = Cells(ligne, 6).Value
     
    For i = ligne + 1 To i + nb
        If expression = "" Then
            If Cells(i, 6) <> 0 Then
                expression = Cells(i, 6)
            End If
        nb = nb - 1
        ElseIf Cells(i, 6) <> 0 Then
                expression = expression & "," & Cells(i, 6)
        nb = nb - 1
        End If
    Next i
     
    concat = expression
    End Function
    Je défis toujours quiconque de me dire pourquoi le code suivant ne marche pas (une fois appelé dans "ok") alors que la récursivité marche en faisant un test d'affichage en fin de fonction (que F1 soit vide ou non).....

  19. #19
    Membre chevronné Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Auto-entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Points : 1 900
    Points
    1 900
    Par défaut
    bonjour à tous

    elle me fait bizarre cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = ligne + 1 To i + nb
    j'aurais plutôt écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = ligne + 1 To ligne + 1 + nb
    m'enfin je raconte peut être une bêtise !
    Wilfried

  20. #20
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Citation Envoyé par francoisvba Voir le message
    Je défis toujours quiconque de me dire pourquoi le code suivant ne marche pas (une fois appelé dans "ok") alors que la récursivité marche en faisant un test d'affichage en fin de fonction (que F1 soit vide ou non).....
    Je crois que tout a été expliqué.
    D'ailleurs tu te trompes parce que si tu fais dans ton code initial le changement que je t'ai indiqué cela marche très bien.

    EN quelque sorte je te défie à mon tour de prouver que le code suivant ne marche pas
    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
    Dim m As Integer
     
    Function ConcatenationLR(ligne As Integer, counter As Integer) As String
     
    Dim lignef As Integer
    Dim expression As String
    Dim counterf As Integer
     
    lignef = ligne
    counterf = counter
    expression = Range("F" & lignef).Value
     
    'Test si champs vide
    If expression <> "" Then
        ' concaténer valeurs des cellules si non vides
        For m = lignef + 1 To lignef + counterf
            If Range("F" & m) <> "" Then
            expression = expression & ", " & Range("F" & m)
            End If
        Next
    Else: expression = ConcatenationLR(lignef + 1, counterf - 1)
    End If
    'test de la valeur d'expression -> prend bien la bonne valeur même quand F1 est vide!
    MsgBox expression, vbDefaultButton2
    ConcatenationLR = expression
     
    End Function
    Sub ok()
     
    Sheets("Feuil1").Select
    'Range("A3").Value ne prend pas la bonne valeur quand F1 est vide.....!
    Range("A3").Value = ConcatenationLR(1, 8)
     
    End Sub
    La raison du dysfonctionnement est trouvée. Tous les symptômes sont expliqués. On fait marcher le code en changeant 1 ligne : celle qui pose problème. Je ne vois pas ce que l'on peut faire de plus clair.

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2007] Fonction somme.si ne fonctionne pas toujours
    Par tofies33 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 25/02/2015, 12h38
  2. fonction intval ne fonctionne pas toujours ?
    Par ninikkhuet dans le forum Langage
    Réponses: 2
    Dernier message: 24/12/2009, 10h23
  3. Réponses: 2
    Dernier message: 12/05/2006, 23h01
  4. [CSS] a:active ne fonctionne pas toujours ?
    Par KpTn dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 10/05/2006, 17h25
  5. Open et opener => Ma fonction ne... fonctionne pas...
    Par romulus dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 17/03/2006, 11h40

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