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 :

Différent résultat de macro selon la ligne de tableau ? [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Invité
    Invité(e)
    Par défaut Différent résultat de macro selon la ligne de tableau ?
    Bonjour,

    Je connais depuis longtemps developpez.net, et j'ai toujours trouvé les réponses à mes questions en consultant le forum et/ou les tutoriels au cours des dernières années pour mes codes Python et autres.

    Aujourd'hui, novice en VBA, je viens enfin poster sur ce forum car malgré mes maintes recherches, je n'arrive pas à 'visualiser' une issue à ma problématique dans la conception de mes macros Excel.
    Je ne m'étais jamais essayée au VBA… jusqu'à il y a quelques jours, un peu forcée : dans le cadre de mon boulot (il y a un début à tout !) d'où ma newbietude

    Le contexte :
    Dans mon tableau Excel, à chaque fin de ligne, j'ai Macro1 et Macro2 toutes deux associées à leur bouton respectif.
    • Macro1 : Ouvre une boite de dialogue permettant à l'utilisateur de sélectionner un fichier de type PDF. La macro mémorise le chemin dudit fichier dans une variable globale.
    • Macro2 : En un clic sur le bouton : ouvre le lecteur PDF avec le fichier précédemment sélectionné (chemin mémorisé).

    Le but de cette manœuvre est de faire en sorte que le fichier PDF relatif au document mentionné sur la ligne du tableau Excel puisse être ouvert en un clic sans à avoir à parcourir l'explorateur de fichiers (=Macro2).
    À "enregistrer" (mémoriser) le chemin d'un nouveau fichier PDF pour une nouvelle ligne du tableau, ou modifier un ancien chemin si le document précédemment mémorisé a été modifié (=Macro1)

    Le problème :
    	| Col. X   | Col. Y   |
    ------------------------------|
    Ligne3	| [Macro1] | [Macro2] |
    Ligne4	| [Macro1] | [Macro2] |
    Ligne5	| [Macro1] | [Macro2] |
    etc…	| [Macro1] | [Macro2] |
    • Ligne3 : Macro2 ouvre bien le fichier pdf précédemment sélectionné avec Macro1 (ou affiche un message d'erreur si le chemin est vide)
    • Ligne4 : Si je clique directement sur Macro2, sans avoir sélectionné un fichier avec Macro1, le fichier PDF de la Ligne3 s'affiche à la place du message d'erreur indiquant à l'utilisateur de d'abord sélectionner un document PDF...
      Idem donc pour les lignes suivantes.
      Évidemment si je donne un nouveau chemin de fichier à Macro1 en ligne4 et que je vais ouvrir le fichier PDF défini en ligne1 : le PDF qui s'affiche sera celui enregistré en ligne4…


    Et oui, je n'avais pas vu arriver ce problème…

    Concrètement, si je devais formuler une question ce serait : est-ce possible d'exécuter une même macro qui donne un résultat différent selon la ligne où elle est exécutée ? Ou, peut-on lier deux macros données à une seule ligne donnée ?
    J'ai vu de tout au cours de mes recherches, je commence donc à douter… et n'ayant jamais fait de VBA, je ne connais peut-être pas les bons termes qui me mèneraient à une plausible solution.

    Voilà, j'ai essayé d'être la plus claire possible afin que vous compreniez bien la situation…

    J'ai acquis par "passion" lors de mes temps libres de +/- bonnes bases en Python (ainsi que des notions en C et PHP), à titre personnel donc.
    J'en suis arrivée à me dire que quand on connaît et qu'on aime un langage, on sait "à peu près quoi chercher" et on trouve facilement… mais là en VBA je dois admettre que je ne trouve pas de vrai charme à ce langage et que je suis complètement paumée !


    Merci à ceux qui m'ont lu et d'avance merci à ceux qui me répondront.

    Cordialement,

    _Tifa_
    Dernière modification par AlainTech ; 17/03/2015 à 22h24. Motif: Balises [pre]

  2. #2
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 143
    Par défaut
    bonsoir,

    D'aprés se que je comprends tu souhaite utiliser la même macro quelque soit la ligne sur la même colonne.

    Si c'est la question la réponse est oui, il te faut le faire avec un select case ou ta variable sera le numéro de la ligne "row" que tu as sélectionnée.

    Montre ton code pour qu'on puisse avancer

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par chrisaccess Voir le message
    bonsoir,
    D'aprés se que je comprends tu souhaite utiliser la même macro quelque soit la ligne sur la même colonne.
    Oui c'est exactement ça !
    Je vais me renseigner sur comment utiliser select case et row

    Et pour le code (que je n'avais pas avec moi hier soir), le voici :

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Dim Fichier As Variant
     
    Sub BoiteDial()
        Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
        If Fichier = False Then Exit Sub
        'MsgBox "Debug : chemin du fichier = " + Fichier
    End Sub
     
    Sub OuvrirFichier()
        If Fichier = Nul Then
            MsgBox "Fichier introuvable, enregistrez-le d'abord"
            Exit Sub
        End If
        ThisWorkbook.FollowHyperlink (Fichier)
    End Sub

    Merci beaucoup de l'aide

    Cordialement,
    _Tifa_
    Dernière modification par Invité ; 26/02/2015 à 10h43.

  4. #4
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 143
    Par défaut
    Pour faire simple je ferai un seul bouton à côté du tableau et je demanderai à l'utilisateur de se placer sur la ligne du fichier à ouvrir.

    J'ai construit cette fonction que j'utilise régulièrement à adapter.

    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
     
    Function selectline(nom As String)
     
    questions = ""
    recherche = ""
    recherchlign = ""
     
    questions = MsgBox("Avez vous sélectionner une cases de la ligne à modifier", vbYesNo, "SELECTION LIGNE")
    If questions = 6 Then
        numero = ""
        selectline = ActiveCell.Row
     
    End If
     
    If questions = 7 Then
     
        recherche = MsgBox("Voulez vous recherchez par le " & nom, vbYesNo, "SELECTION LIGNE")
        If recherche = 6 Then
            recherchlign = InputBox("Veuillez saisir le nom !", "SELECTION LIGNE")
            ActiveSheet.Range("A5").AutoFilter Field:=1
            ActiveSheet.Range("A5").AutoFilter Field:=1, Criteria1:=recherchlign
            MsgBox "Veuillez sélectionner une case de la ligne concernée par la modification" & Chr(10) & "et cliquez à nouveau sur le bouton RELANCE ", vbInformation, "RELANCE"
        End If
        If recherche = 7 Then
            MsgBox "Veuillez sélectionner une case de la ligne concernée par la modification" & Chr(10) & "et cliquez à nouveau sur le bouton RELANCE", vbInformation, "RELANCE"
            End
        End If
    End If
     
    End Function

    Je considère que le nom de ton fichier est en case ligne .. colonne x et que fichier ne dispose que du parcours

    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
     
     
    dim fichier as string
    dim num as integer
     
    Sub BoiteDial()
        Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
        If Fichier = False Then Exit Sub
        'MsgBox "Debug : chemin du fichier = " + Fichier
    End Sub
     
    Sub OuvrirFichier()
        If Fichier = Nul Then
            MsgBox "Fichier introuvable, enregistrez-le d'abord"
            Exit Sub
        End If
    num = selectline("nom du fichier")
     
    ThisWorkbook.FollowHyperlink (Fichier & "\" & sheets("1").range("x" & num).value)
     
    End Sub
    Voilà un début pour essayer

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Merci pour ta réponse.
    J'ai un peu travaillé dessus aujourd'hui et j'ai du coup essayé d'adapter la fonction ainsi que la méthode appliquée, mais je n'ai pas réussi à avoir un résultat concluant (autant dire pas de résultat du tout; J'ai pas réellement "eu le temps de prendre le temps" pour comprendre la fonction selectline()... ).
    J'ai néanmoins essayé de parvenir à mes fins par d'autres moyens (mais rien de satisfaisant) tout en essayant de bien comprendre le fonctionnement de VBA afin de mieux appréhender le code :/

    Cela étant dit, j'ai constaté que le contenu de ma variable Fichier – contenant le chemin du Fichier sélectionné via Macro1 – est vide à la réouverture de mon fichier Excel.
    J'ai donc cherché de ce coté pour réussir à faire en sorte que le contenu de la variable soit "rechargé" dès l'ouverture du tableau.
    Pas encore testé. Donc si vous avez d'autres suggestions, je suis évidemment preneuse.

    Cordialement,

    _Tifa_
    Dernière modification par Invité ; 26/02/2015 à 23h57.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Alors j'ai avancé dans mon code.

    J'ai un peu grugé, j'ai laissé tomber les objets images (auxquels j'associais mes macros), et fait en sorte que les cellules des colonnes concernées par les macros soient cliquables et que la macro s'exécute.

    Code VBA : 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
    Dim Fichier As Variant
    '''Méthode pour cellules cliquables - colonnes L et M :'''
    Sub Worksheet_SelectionChange(ByVal Target As Range)
        ''' MACRO1 : Pour choisir le fichier : '''
        If Target.Column = 12 Then
            Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
            If Fichier = False Then Exit Sub
            MsgBox "Valeur Fichier = " + Fichier
            ActiveWorkbook.Names.Add Name:="MaValeur", RefersTo:=Fichier '"=Fichier"""
        End If
        ''' MACRO2 : Pour ouvrir le fichier '''
        If Target.Column = 13 Then 
            Fichier = [MaValeur]
            If Fichier = Nul Then
                MsgBox "Fichier introuvable, enregistrez-le d'abord"
                Exit Sub
            End If
            ThisWorkbook.FollowHyperlink (Fichier)
        End If
    End Sub
    '''Fin de méthode'''

    Maintenant, il ne "me reste plus qu'à" indiquer au Macro1 et Macro2 qu'elles sont "liées" entre elles en fonction de leur n° de ligne.
    Dernière modification par Invité ; 27/02/2015 à 17h03.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Programmeur en temps libre
    Inscrit en
    Février 2015
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Programmeur en temps libre
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 68
    Par défaut
    Bonjour à tous,

    Désolé de m'immiscer dans la conversation, mais j'ai quand même une petite question:

    Tu dis vouloir ne pas perdre les chemins déjà enregistrés, seulement en utilisant la variable fichier, dès que le classeur est fermé la variable s'efface. De plus tu ne peux stocker qu'un seul fichier à la fois... à moins d'utiliser un tableau, mais ce sera pareil, dès que le classeur sera fermé tous les chemins seront perdus.

    Ma question:

    Pourquoi ne pas enregistrer les chemins dans des cellules ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    activecell.value = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
    il est alors facile de retrouver le bon chemin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.FollowHyperlink (activecell.value)

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Aposto Voir le message
    Bonjour à tous,

    Désolé de m'immiscer dans la conversation, mais j'ai quand même une petite question:

    Tu dis vouloir ne pas perdre les chemins déjà enregistrés, seulement en utilisant la variable fichier, dès que le classeur est fermé la variable s'efface. De plus tu ne peux stocker qu'un seul fichier à la fois... à moins d'utiliser un tableau, mais ce sera pareil, dès que le classeur sera fermé tous les chemins seront perdus.
    Bonjour,

    Pour la perte du contenu de ma variable Fichier à la fermeture du classeur, j'ai réglé ce soucis en consultant cette page
    Dans mon premier If (correspondant à ma macro1) j'ajoute donc :
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWorkbook.Names.Add Name:="MaValeur", RefersTo:=Fichier '"=Fichier"""
    Et je la récupère ensuite dans mon deuxième If (correspondant à ma macro2) avec :
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    Fichier = [MaValeur]


    Cela étant, je vais voir s'il ne m'est pas plus intéressant de faire comme tu le proposes avec :

    Citation Envoyé par Aposto Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    activecell.value = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
    il est alors facile de retrouver le bon chemin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.FollowHyperlink (activecell.value)
    Si j'ose l'espérer, c'est bien cela qui solutionnerait mon "problème" ? (A savoir : réussir à faire en sorte que pour chaque cellule contenant un fichier à ouvrir, la cellule indiqué ouvre bien le fichier qui lui a été attribué ? (Si je ne suis pas claire, j'essayerai de formuler ça différemment))

    En tout cas ça avance, je touche presque à mon but

    Merci pour l'aide apportée tant au niveau code qu'au niveau de la réflexion

    Cordialement,

    _Tifa_

  9. #9
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 143
    Par défaut
    bonsoir,

    Pour en revenir à ma fonction selectline de ma création elle intéroge l'utilisateur pour confirmer que la bonne ligne est sélectionnée, et lui propose le cas échéant des filtres.

    Maintenant, il ne "me reste plus qu'à" indiquer au Macro1 et Macro2 qu'elles sont "liées" entre elles en fonction de leur n° de ligne. Maintenant, il ne "me reste plus qu'à" indiquer au Macro1 et Macro2 qu'elles sont "liées" entre elles en fonction de leur n° de ligne.
    Mon code est à revoir si fichier est ton chemin d'accés par contre la question est où est stocké le nom du fichier (dans ton tableau ou ailleurs)
    Si tu regarde de prêt ma fonction selectline tu verras comment récupérer le numéro de ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     selectline = ActiveCell.Row
    Je stocke ici le numero de le ligne sélectionnée dans la variable selectline. C'est ainsi que je renvoie le numéro de ligne
    Le reste de mon code ne sert qu'à intéroger l'utilisateur.

    Ma question est donc : où est stocké le nom de ton fichier ? et revoit le code proposé ci dessus pour aller chercher le nom.

    chrisaccess

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    J'ai réussi à obtenir le résultat que j'attendais ce matin, en peu de temps. (Le week-end y est sûrement pour quelque chose )

    J'ai donc laisser tomber l'idée initiale qui était d'avoir des images de "disquette" et de "dossier", associées chacune à la macro concernée.
    A la place, j'ai fait en sorte que les colonnes concernées soient cliquables.

    -> Toutes les cellules de ma colonne L sont cliquables et ont pour intitulé "ENR. DOC."
    L'utilisateur n'a donc qu'à cliquer pour enregistrer le fichier qu'il désire via une boite de dialogue.

    -> Toutes les cellules de ma colonne M sont cliquables également, et ont pour intitulé "VOIR DOC."
    Idem, l'utilisateur n'a qu'à cliquer pour visualiser le document (dont le chemin a précédemment été enregistré).

    -> Stockage des chemins des divers fichiers "enregistrés" :
    Je stocke le chemin du fichier choisi par l'utilisateur dans une cellule donnée d'une feuille crée à cet effet, appelée "Données".

    Finalement, c'est la solution la plus simple (et efficace ?) que j'ai trouvée pour ne pas perdre le chemin du fichier choisi par l'utilisateur.

    Voici mon code :
    Code VBA : 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
    Dim Fichier As Variant
     
    Sub Worksheet_SelectionChange(ByVal Target As Range)
        ''' Pour choisir le fichier : '''
        If Target.Column = 12 Then '-> Colonne L
            Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
            Worksheets("Données").Cells(ActiveCell.Row, 1).Value = Fichier
            If Fichier = False Then Exit Sub
        End If
        ''' Pour ouvrir le fichier '''
        If Target.Column = 13 Then '-> Colonne M
            Fichier = (Worksheets("Données").Cells(ActiveCell.Row, 1).Value)
            If Fichier = Nul Then
                MsgBox "Fichier introuvable! Vous devez d'abord l'enregistrer."
                Exit Sub
            End If
            ThisWorkbook.FollowHyperlink (Fichier)
        End If
    End Sub

    Je vous remercie pour votre aide ainsi que les réflexions apportées.
    Je songe à améliorer le code quand j'aurai du temps à y consacrer. Si j'arrive à obtenir un meilleur résultat et un rendu "plus propre", je vous en ferai part (peut-être que ça en intéressera certain)

    Cordialement,

    _Tifa_
    Dernière modification par Invité ; 02/03/2015 à 11h43.

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

Discussions similaires

  1. [XL-2013] Macro suppression de lignes selon critère - fichier volumineux
    Par demeter dans le forum Excel
    Réponses: 9
    Dernier message: 13/06/2014, 19h28
  2. [Toutes versions] Macro suppression de lignes selon conditions via userform
    Par mattmata dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/10/2012, 14h08
  3. Réponses: 5
    Dernier message: 15/12/2009, 16h28
  4. [Vxi3] afficher une valeur selon la ligne du tableau
    Par aurelie83 dans le forum Deski
    Réponses: 10
    Dernier message: 23/10/2009, 21h56
  5. [E-03] Macro Extraire des Lignes selon critère
    Par willybass dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 26/03/2009, 08h33

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