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 :

Problème de passage d'argument Target entre procédures


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    secrétaire
    Inscrit en
    Décembre 2014
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : secrétaire

    Informations forums :
    Inscription : Décembre 2014
    Messages : 48
    Points : 28
    Points
    28
    Par défaut Problème de passage d'argument Target entre procédures
    Bonjour,

    J'ai cette fonction qui marche bien sur le double click :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      Dim Index As Long
     
      If Not Intersect(Target, Range("Tableau1")) Is Nothing Then
        Cancel = True
        ShowSuiviForm Target
      End If
    End Sub
    Elle ouvre un formulaire avec l'enregistrement choisi.

    Sauf que je n'ai pas envie que ça m'empeche le double click pour l'édition d'une cellule.

    Je me suis donc dit que j'allais ajouter un menu pour ouvrir le formulaire via le menu contextuel.
    Mes connaissance en VBA étant assez faible, j'ai chercher le code pour modifier le menu contextuel. J'ai fini par trouvé.
    Mais après pour lancer la fonction, malgré mes différentes tentatives d'ajustement, j'ai toujours un message d'erreur : incompatibilité de type, argument byref etc...

    Voici mon code, pouvez vous m'aider? :
    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
     
    Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
        If Not Application.Intersect(Target, Range("Tableau1")) Is Nothing Then
            Cancel = True    'on annule l'affichage du menu cell
            'on ajoute l'item au menu cell
            With CommandBars("List Range Popup").Controls.Add(Type:=msoControlButton, before:=6, temporary:=True)
                .Caption = "MODIFICATION VIA FORMULAIRE"
                .OnAction = "'Feuil1.ouvre_form " & Chr(34) & Target.Address & Chr(34) & "'"      'on appelle la macro qui est dans le module de la feuille elle meme et on lui script l'argument de l'adress de la target
                'donc l'item appelera la sub AVEC!!!!  argument
            End With
            CommandBars("List Range Popup").ShowPopup    'comme on l'a annuler il faut l'affifficher (showpopup)
        End If
        'quand tu aura selectionner ou pas et que le popup se sera fermer la commandbars("cell") revient a l'origine
        ' ainsi  quand tu fermera ton classeur et ouvrira un autre la barre cell sera d'origine
        CommandBars("List Range Popup").Reset
    End Sub
     
    Sub ouvre_form(ByVal adresse As Range)
    Dim Index As Long
    If Not Intersect(adresse, Range("Tableau1")) Is Nothing Then
        Cancel = True
        ShowSuiviForm adresse
      End If
     
     
    End Sub

  2. #2

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    secrétaire
    Inscrit en
    Décembre 2014
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : secrétaire

    Informations forums :
    Inscription : Décembre 2014
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Merci Laurent pour ton retour.
    J'étais tombé sur ton sujet déja, mais je le trouvais un peu "lourd / long" juste pour rajouter un item de menu contextuel.
    Mais bon, si pas d'autre solution, je m'y pencherais.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    secrétaire
    Inscrit en
    Décembre 2014
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : secrétaire

    Informations forums :
    Inscription : Décembre 2014
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    Je me permets un petit up.

    Je pense que ça peut passer sans appliquer le code de Laurent qui est certes top pour un gros projet, mais un peu trop long pour le temps que j'ai à consacrer sur mon projet.

    Merci d'avance.

  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 755
    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 755
    Points : 28 606
    Points
    28 606
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Si c'est juste pour lancer une procédure présente dans le classeur, il est possible d'ajouter une commande dans la barre d'outils d'accès rapide et de préciser que cette commande n'est valable que dans le classeur actif

    Aller dans les options d'excel et sélectionner Barre d'outils Accès rapide
    Ensuite dans l'ordre (voir illustration)
    1. Sélectionner le nom du classeur où devra être apparaître la commande
    2. Sélectionner dans la liste déroulante la catégorie Macros
    3. Sélectionner la procédure (macro) à ajouter dans la barre d'outils d'accès rapide
    4. Cliquer sur le bouton Ajouter
    5. Cliquer sur le bouton Modifier si l'on souhaite sélectionner une icône différente


    Nom : QuickAccessTools Bar-Macro.png
Affichages : 296
Taille : 55,3 Ko
    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
    Nouveau membre du Club
    Homme Profil pro
    secrétaire
    Inscrit en
    Décembre 2014
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : secrétaire

    Informations forums :
    Inscription : Décembre 2014
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Si c'est juste pour lancer une procédure présente dans le classeur, il est possible d'ajouter une commande dans la barre d'outils d'accès rapide et de préciser que cette commande n'est valable que dans le classeur actif

    Aller dans les options d'excel et sélectionner Barre d'outils Accès rapide
    Ensuite dans l'ordre (voir illustration)
    1. Sélectionner le nom du classeur où devra être apparaître la commande
    2. Sélectionner dans la liste déroulante la catégorie Macros
    3. Sélectionner la procédure (macro) à ajouter dans la barre d'outils d'accès rapide
    4. Cliquer sur le bouton Ajouter
    5. Cliquer sur le bouton Modifier si l'on souhaite sélectionner une icône différente

    Bonjour,

    Merci Philippe pour ton retour qui contournerait mon problème. Mais ça ne passe pas :
    Visiblement, c'est possible que pour les procédures qui n'ont pas d'argument. En tout cas, c'est les macros du module sans argument qui apparaissent dans la liste des macros.
    J'ai ajouté celle ci dans le module, mais elle n'apparait pas dans la liste des macros qu'on peut ajouter à la barre d'accès rapide, alors que la procédure test est bien présente elle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub ouvre_formulaire(ByVal Target As Range, Cancel As Boolean)
      Dim Index As Long
     
      If Not Intersect(Target, Range("Tableau1")) Is Nothing Then
        Cancel = True
        ShowSuiviForm Target
      End If
    End Sub
     
    Sub test()
     
    End Sub

  7. #7
    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 755
    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 755
    Points : 28 606
    Points
    28 606
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Visiblement, c'est possible que pour les procédures qui n'ont pas d'argument.
    Effectivement, mais c'est valable également avec des menus

    Il est toujours possible de trouver des moyens de détournement (trucs et astuces) mais sans connaître le contexte, il est difficile d'apporter une aide quelconque.

    Sauf que je n'ai pas envie que ça m'empeche le double click pour l'édition d'une cellule.
    On ne peut pas avoir le beurre et l'argent du beurre. Il est tout à fait possible d'effectuer une modification dans une cellule au départ de la barre des formules
    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

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    secrétaire
    Inscrit en
    Décembre 2014
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : secrétaire

    Informations forums :
    Inscription : Décembre 2014
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,

    Il est toujours possible de trouver des moyens de détournement (trucs et astuces) mais sans connaître le contexte, il est difficile d'apporter une aide quelconque.


    On ne peut pas avoir le beurre et l'argent du beurre. Il est tout à fait possible d'effectuer une modification dans une cellule au départ de la barre des formules
    J'ai suivi le tutoriel de Pierre Fauconnier "Modélisation des échanges entre table de données et userform" pour obtenir un formulaire de modification de donner pour mes lignes de tableau :
    https://fauconnier.developpez.com/tu...eau-structure/

    Le double clic sur une ligne ouvre donc l'enregistrement voulu dans le formulaire.

    Mais les utilisateurs modifieront les données par les 2 possibilités : directement sur le tableau ou via le formulaire.

    Et si effectivement, on peut toujours éditer les cellules dans la barre de formules, les habitudes restent présentes, et ça peut vite devenir agaçant que le formulaire s'ouvre sur le double clic alors que ce n'est pas voulu.

    Edit : je viens de regarder pour affecter la macro à un raccourci clavier, mais c'est la même contrainte : pas de macro avec argument

  9. #9
    Membre confirmé Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 354
    Points : 633
    Points
    633
    Par défaut
    Salut le fil.
    Quelque-chose m'interpelle dans ton code...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      .OnAction = "'Feuil1.ouvre_form " & Chr(34) & Target.Address & Chr(34) & "'"
    Donc ci-dessus tu lances la procédure sous la forme Feuil1.ouvre_Form "$A$2" par exemple
    Par contre dans la sub ton argument est un Range. Donc soit tu changes l'un, soit tu change l'autre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub ouvre_form(ByVal adresse As String)
    Dim Index As Long
    If Not Intersect(Range(adresse), Range("Tableau1")) Is Nothing Then
        Cancel = True
        ShowSuiviForm adresse
      End If
     End Sub
    PS: C'est juste de visu, je n'ai rien testé.
    Jean-Paul sous Office 365 et Windows 10/11 (Intel I7 16Go)

    Si vous avez trouvé réponse à votre question penser à la passer en Vous avez aimé la discussion alors un fait toujours plaisir.
    Le savoir n'a de valeur que s'il est partagé.
    La vérité de demain se nourrit de l'erreur d'hier. Antoine de Saint-Exupéry

  10. #10
    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 755
    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 755
    Points : 28 606
    Points
    28 606
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    je viens de regarder pour affecter la macro à un raccourci clavier, mais c'est la même contrainte : pas de macro avec argument
    Oui, c'est exactement ce que j'ai écrit. Impossible d'appeler une procédure ayant des arguments autrement que par une autre procédure ou alors passer par une procédure événementielle et en accepter les contraintes. Si tu enlèves le Cancel = True, l'utilisateur pourra avoir l'édition mais je ne crois pas que ce soit très heureux.

    Le contournement c'est vérifier tout simplement quelle cellule est sélectionnée dans la procédure sans argument et agir si c'est la bonne (c'est ce que renvoie Target)
    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

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    secrétaire
    Inscrit en
    Décembre 2014
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : secrétaire

    Informations forums :
    Inscription : Décembre 2014
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Valtrase Voir le message
    Salut le fil.
    Quelque-chose m'interpelle dans ton code...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      .OnAction = "'Feuil1.ouvre_form " & Chr(34) & Target.Address & Chr(34) & "'"
    Donc ci-dessus tu lances la procédure sous la forme Feuil1.ouvre_Form "$A$2" par exemple
    Par contre dans la sub ton argument est un Range. Donc soit tu changes l'un, soit tu change l'autre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub ouvre_form(ByVal adresse As String)
    Dim Index As Long
    If Not Intersect(Range(adresse), Range("Tableau1")) Is Nothing Then
        Cancel = True
        ShowSuiviForm adresse
      End If
     End Sub
    PS: C'est juste de visu, je n'ai rien testé.
    J'ai testé en mettant Target.Range, et d'autre solution, mais j'ai toujours une erreur du style type incompatible, erreur Byref non facultatif etc, des trucs du genre...

    Voici un fichier épurée des données confidentielles.
    2022_RA_CD_test.xlsm

  12. #12
    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 755
    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 755
    Points : 28 606
    Points
    28 606
    Billets dans le blog
    53
    Par défaut
    Bonjour,

    Voici un exemple de contournement en assignant le bouton à la procédure nommée MonInterception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub MonInterception()
      Dim Target As Range
      Set Target = Selection
      If Not Intersect(Target, Range("t_TimeSheet")) Is Nothing Then
         ShowSuiviForm Target
      End If
    End Sub
    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

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    secrétaire
    Inscrit en
    Décembre 2014
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : secrétaire

    Informations forums :
    Inscription : Décembre 2014
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,

    Voici un exemple de contournement en assignant le bouton à la procédure nommée MonInterception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub MonInterception()
      Dim Target As Range
      Set Target = Selection
      If Not Intersect(Target, Range("t_TimeSheet")) Is Nothing Then
         ShowSuiviForm Target
      End If
    End Sub
    Merci Philippe, tu es mon sauveur
    J'ai modifié "t_TimeSheet" avec le nom de mon tableau, et nickel, ça fonctionne.
    Un énorme merci.

  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 755
    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 755
    Points : 28 606
    Points
    28 606
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Ravi d'avoir pu t'aider et comme je l'ai écrit, il y a toujours moyen de s'en sortir par des "trucs et astuces", il faut juste connaître le contexte

    L'emploi de la variable objet Target, n'est évidemment pas obligatoire. J'avais d'ailleurs omis d'ajouter en dernière ligne Set Target = Nothing
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub MonInterception()
      If Not Intersect(Selection, Range("t_TimeSheet")) Is Nothing Then
         MsgBox "Coucou"
      End If
    End Sub
    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

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

Discussions similaires

  1. problème de passage d'argument lors de la création d'un thread
    Par boilu dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 08/08/2011, 21h44
  2. problème en passage d'arguments
    Par soumti84 dans le forum Général Java
    Réponses: 9
    Dernier message: 29/03/2009, 17h53
  3. Réponses: 5
    Dernier message: 23/10/2007, 14h26
  4. [Configuration] Problème de passage d'argument
    Par bugs58 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 15/12/2006, 11h20
  5. [Registre] Problème de passage d'arguments
    Par nicolas.pied dans le forum C++
    Réponses: 5
    Dernier message: 12/11/2006, 14h11

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