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 :

Sous-routine en plusieurs parties


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut Sous-routine en plusieurs parties
    Bonjour à tous,

    Bon cette fois ci je vais essayé d'être clair car la dernière fois j'ai pas fait des merveilles (en plus l'intitulé est déjà obscure)

    Bon j'ai un code assez standard qui fait une recherche sur une plage donnée et renvoie de l'info à chaque fois qu'il trouve quelque chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    With InitDetail.Columns(ColDetail.Inv) 'plage de donnée pour la recherche
        Set DetailFoundRange = .Find(What:="Sandwich", LookIn:=xlFormulas, LookAt _
            :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            True, SearchFormat:=False)
        If Not DetailFoundRange Is Nothing Then
            DetailFirstAddress = DetailFoundRange.Address
            Do
                MsgBox "JambonBeurre" 'a chaque fois qu'on trouve, on renvoie jambonbeurre           
     
                Set DetailFoundRange = .FindNext(DetailFoundRange)
            Loop While Not DetailFoundRange Is Nothing And DetailFirstAddress <> DetailFoundRange.Address
        End If
    End With
    Un basique, qui marche très bien (je vous rassure je ne cherche pas à créer un programme qui renvoie JambonBeurre, je préfére clairement le saucisson ).
    Le souci c'est que j'utilise ce bloc de recherche, assez volumineux, à plusieurs endroits et que j'aimerais donc l'enregistrer comme une routine dans un module que je puisse ensuite l'appeler :
    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
    'Dans mon Module Public :
    Public Function FindInfo(LookRange As Range, LookWhat As Object, LocalEvent as Function)
     
    With LookRange
        Set FoundRange = .Find(What:=LookWhat, LookIn:=xlFormulas, LookAt _
            :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            True, SearchFormat:=False)
        If Not FoundRange Is Nothing Then
            FirstAddress = FoundRange.Address
            Do
                LocalEvent
                Set FoundRange = .FindNext(FoundRange)
            Loop While Not FoundRange Is Nothing And FirstAddress <> FoundRange.Address
        End If
    End With
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     'Dans ma procédure :
    Call FindInfo(InitDetail.Columns(ColDetail.Inv),"Sandwich",...)
    où les "..." serait la définition de ma fonction LocalEvent (LocalEvent As Function n'existe pas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LocalEvent=MsgBox "JambonBeurre"
    En résumé, je n'arrive pas à interrompre une routine appelée pour dérouler une partie de code local

    C'est clair ou pas ?

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    une fonction est prévue pour retourner "quelque chose" (une valeur, un objet ect...). Or ici ta fonction ne retourne rien ... c'est donc basiquement une procédure Sub qui conviendrait en l'état.


    ensuite, à quoi ressemble/ressemblerait la fonction localevent à part afficher un msgbox ? Et dans quel but elle doit être appelée dans ta "fonction" FindInfo

  3. #3
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut
    Alors une de mes fonctions c'est ça :

    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
    LocalLoop=1
        With InitDetail.Columns(ColDetail.Inv)
            Set FoundRange = .Find(What:=InitDataPosition(ColData.Inv), LookIn:=xlFormulas, LookAt _
                :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
                True, SearchFormat:=False)
            If Not FoundRange Is Nothing Then
                FirstAddress = FoundRange.Address
                Do
                    Me.Controls("DesignText" & LocalLoop).Text = InitDetail.Cells(FoundRange.Row, ColDetail.Gamme)
                    Me.Controls("LastText" & LocalLoop).Text = InitDetail.Cells(FoundRange.Row, ColDetail.Last)
                    If InitDetail.Cells(GammeRowArray(LocalLoop), ColDetail.Statut) <> "Supprimé" Then
                        Me.Controls("StartText" & LocalLoop).Text = InitDetail.Cells(FoundRange.Row, ColDetail.Start)
                        Me.Controls("FreqText" & LocalLoop).Text = InitDetail.Cells(FoundRange.Row, ColDetail.Freq)
                    Else
                        Me.Controls("StartText" & LocalLoop).Text = "Supprimé"
                        Me.Controls("FreqText" & LocalLoop).Text = Month(InitDetail.Cells(FoundRange.Row, ColDetail.SDate))
                    End If
                    LocalLoop = LocalLoop + 1
     
                    Set FoundRange = .FindNext(FoundRange)
                Loop While Not FoundRange Is Nothing And FirstAddress <> FoundRange.Address
            End If
        End With
    Où LocalEvent serait donc représenté par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
           Me.Controls("DesignText" & LocalLoop).Text = InitDetail.Cells(FoundRange.Row, ColDetail.Gamme)
                    Me.Controls("LastText" & LocalLoop).Text = InitDetail.Cells(FoundRange.Row, ColDetail.Last)
                    If InitDetail.Cells(GammeRowArray(LocalLoop), ColDetail.Statut) <> "Supprimé" Then
                        Me.Controls("StartText" & LocalLoop).Text = InitDetail.Cells(FoundRange.Row, ColDetail.Start)
                        Me.Controls("FreqText" & LocalLoop).Text = InitDetail.Cells(FoundRange.Row, ColDetail.Freq)
                    Else
                        Me.Controls("StartText" & LocalLoop).Text = "Supprimé"
                        Me.Controls("FreqText" & LocalLoop).Text = Month(InitDetail.Cells(FoundRange.Row, ColDetail.SDate))
                    End If
                    LocalLoop = LocalLoop + 1
    en gros j'aimerais pouvoir écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Call FindInfo(InitDetail.Columns(ColDetail.Inv),InitDataPosition(ColData.Inv),
                    Me.Controls("DesignText" & LocalLoop).Text = InitDetail.Cells(FoundRange.Row, ColDetail.Gamme)
                    Me.Controls("LastText" & LocalLoop).Text = InitDetail.Cells(FoundRange.Row, ColDetail.Last)
                    If InitDetail.Cells(GammeRowArray(LocalLoop), ColDetail.Statut) <> "Supprimé" Then
                        Me.Controls("StartText" & LocalLoop).Text = InitDetail.Cells(FoundRange.Row, ColDetail.Start)
                        Me.Controls("FreqText" & LocalLoop).Text = InitDetail.Cells(FoundRange.Row, ColDetail.Freq)
                    Else
                        Me.Controls("StartText" & LocalLoop).Text = "Supprimé"
                        Me.Controls("FreqText" & LocalLoop).Text = Month(InitDetail.Cells(FoundRange.Row, ColDetail.SDate))
                    End If
                    LocalLoop = LocalLoop + 1
                   )
    Et obtenir le même résultat que le premier code.

  4. #4
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut,

    Je ne vois pas réellement le but que tu t'es donné.

    Ton premier code est l'exemple fourni par l'aide en ligne d'Excel pour la fonction Find.

    Mais pourquoi créer une fonction spécifique alors que tu peux intégrer celle-ci dans ta procédure?

  5. #5
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut
    Citation Envoyé par MarcelG Voir le message
    Mais pourquoi créer une fonction spécifique alors que tu peux intégrer celle-ci dans ta procédure?
    Simplement pour gagner en lisibilité. Quand j'utilise plusieurs fois une routine, je préfère lui attribuer une fonction ou un sub que je viens ensuite appeler avec un nom clair.

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bon, j'avoue avoir regardé en diagonal tes codes ... mais il me semblerait pertinent de procéder de la sorte :


    1) une fonction de Find/findNext comme tu le voulais
    2) cette fonction renvoie un variant qui est un Array (en base 1 !) contenant l'ensemble des FoundRange.Row
    3) la procédure appelante reçoit cet array .... et vu qu'il est en base 1, tu peux boucler sur le array : chaque élément contient également le paramètre LocalLoop puisqu'il correspondra à l'index de l'élément au sein du array

    et hop, une petite boucle sur le array, et à chaque tour de boucle tu fais le remplissage de tes contrôles


    tu vois ce que je veux dire ?

  7. #7
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    tu vois ce que je veux dire ?
    Oui, bonne ... et mauvaise idée d'ailleurs.

    Bonne parce que ça répondrait partiellement à ma demande, mauvaise parce que ça aurait plus un effet d'alourdissement que d’allègement comme recherché, à mon avis.
    Tu penses pas?

  8. #8
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut
    En faite je stockais déjà cet array... je suis un boulet :p
    Du coup pas besoin de le regénérer


    Merci pour le coup de pouce

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 18/08/2005, 13h16
  2. [UPDATE]Sous-requetes avec plusieurs nuplets
    Par Tchinkatchuk dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/07/2005, 18h28
  3. Batchmove en plusieurs parties
    Par Oluha dans le forum Bases de données
    Réponses: 3
    Dernier message: 10/05/2005, 14h43
  4. Réponses: 3
    Dernier message: 23/02/2005, 14h34
  5. Réponses: 3
    Dernier message: 27/10/2004, 23h15

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