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 :

recupérer le nom du classeur dans lequel est contenu le bouton [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut recupérer le nom du classeur dans lequel est contenu le bouton
    Bonjour tout le monde,

    La solution a mon problème paraît simple mais !!!
    J'utilise un petit fichier qui simplifie certains gestes en proposant un certains nombres de copie coller d'une valeur situé dans des cellules d'une feuille.
    Le copie se fait automatiquement en cliquant sur bouton type controleactivex (plus pratique pour se que je souhaite faire).

    Pour info ci dessous le code fonctionne bien :
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    Option Explicit
     
    Dim lig As Integer
    Dim lig1 As Integer
    Dim col As Integer
    Dim col1 As Integer
     
    Dim a As Integer
    Dim b As Integer
    Dim c As Integer
    Dim d As Integer
    Dim e As Integer
    Dim f As Integer
     
    Dim num1 As Integer
    Dim num2 As Integer
    Dim num3 As Integer
     
    Dim elist(3) As Integer
     
    Dim NM As String
    Dim nm1 As String
    Dim nm2 As String
    Dim nm3 As String
     
    Dim Mp As String
     
    Dim test As Boolean
     
    Sub copiecolle(bouton As String, messuiv As Boolean, NumMess As Single)
     
    'definition bouton : 2 premiers chiffres = page modele, les 3ieme et 4ieme chiffres =numero bouton
     
    Unload messaisi
    Unload message
    Load messaisi
     
    num1 = Left(bouton, 2)     'numero de modele
    num2 = Right(bouton, 2)    'numero de bouton
    lig = (num1 * 20) - 18 + num2 'ligne dans bdlist du bouton
     
    If wkbcc.Sheets("BD").Range("d" & lig).Value = "" Then      'ouvre la création du copie colle si pas de titre
        ouvModMess lig, True
    Else
        'prépare
        For a = 1 To 3
            messaisi.Controls("List" & a).Visible = False
            messaisi.Controls("Lablist" & a).Visible = False
            messaisi.Controls("coldep" & a).Caption = ""
            messaisi.Controls("colnm" & a).Caption = ""
        Next a
     
        'definition bouton : 2 premiers chiffres = page modele, les 3ieme et 4ieme chiffres =numero bouton
     
        messaisi.numBut.Caption = bouton 'ecrit le numero de bouton
        messaisi.Numess.Caption = NumMess   ' ecrit le numéro de message
        num3 = wkbcc.Sheets("BD").Cells(lig, 5).Value 'nombre de messages
        nm1 = wkbcc.Sheets("BDLIST").Range("e3").Value  'format debut liste
        nm2 = wkbcc.Sheets("BDLIST").Range("g3").Value  'format fin liste
        'NM = wkbcc.Sheets("BD").Cells(lig, 5 + (num1 * 2)).Value   'message a coller
        NM = wkbcc.Sheets("BD").Cells(lig, 5 + (NumMess * 2)).Value
        If num3 > 1 And messuiv = False Or NumMess < num3 And messuiv = True Then messaisi.butsuiv.Visible = True 'affiche le bouton suivant si nécessaire
     
        Erase elist()
     
        If InStr(1, NM, nm1) > 0 Then       'recupére les débuts des emplacements des listes
            d = 1
            For a = 1 To 3
                elist(a) = InStr(d, NM, nm1)
                If elist(a) = 0 Then Exit For
                d = elist(a) + 1
            Next a
        End If
        If elist(1) <> 0 Then
            For e = 1 To 3      'affiche et recherche la liste
                If elist(e) > 0 Then
                    'affiche la liste si necessaire
                    messaisi.Controls("List" & e).Visible = True
                    messaisi.Controls("Lablist" & e).Visible = True
                    f = InStr(elist(e) + 1, NM, nm2) - 2 'récupère la position de fin de liste
                    nm3 = Mid(NM, elist(e) + 2, f - elist(e)) 'recupere nom de la liste
                    'messaisi.aremp1.Caption = elist(e)  'debut de remlacement dans le message
                    'messaisi.fremp1.Caption = f + 2 'fin de remplacement dans le message
                    For col = 2 To 25                          'récupère le numéro de colonne de la liste
                        If nm3 = wkbcc.Sheets("BDLIST").Cells(10, col).Value Then
                            messaisi.Controls("Lablist" & e).Caption = wkbcc.Sheets("BDLIST").Cells(10, col).Value  'saisi le titre
                            f = 11
                            Do While wkbcc.Sheets("BDLIST").Cells(f, col).Value <> ""
                                messaisi.Controls("List" & e).AddItem wkbcc.Sheets("BDLIST").Cells(f, col).Value    'saisi les éléments de la liste
                                f = f + 1
                                If f = 50 Then Exit Do
                            Loop
                            Exit For
                        End If
                    Next col
                End If
            Next e
        End If
     
        messaisi.ligBD.Caption = lig
        messaisi.messinfo.Caption = wkbcc.Sheets("BD").Cells(lig, 4 + (NumMess * 2)).Value
        messaisi.messcol.Caption = wkbcc.Sheets("BD").Cells(lig, 5 + (NumMess * 2)).Value
     
        If num3 > 1 And messuiv = False Or messuiv = True And NumMess < num3 Then
            messaisi.butsuiv.Visible = True
            'messaisi.butmod.Visible = True
        Else
            messaisi.butsuiv.Visible = False
            'messaisi.butmod.Visible = False
        End If
     
        Clipboard NM
     
        messaisi.Show False
     
    End If
     
    End Sub
    il y a bien sûr d'autres sub mais pas intéréssant pour mon problème.
    Vous constaterez la présence de la variable objet "wkbcc" représentant mon classeur.

    A l'ouverture du fichier excel je charge cette variable :
    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
     
     
    Sub auto_open()
    Option Explicit
     
    Public wkbcc As Object
     
    Dim NM As String
    Dim a As Integer
    Dim b As Integer
    Dim c As Single
    Dim Mp As String
     
    Set wkbcc = ThisWorkbook
    wkbcc.Sheets("BDLIST").Range("d2").Value = ThisWorkbook.Name
    Mp = wkbcc.Sheets("BDLIST").Range("d4").Value
    b = 1
     
    wkbcc.Unprotect Mp
    wkbcc.Sheets("MENU").Unprotect Mp
     
    For a = 3 To 383 Step 20
        If wkbcc.Sheets("BD").Range("b" & a).Value = "" Then
            NM = b
        Else
            NM = wkbcc.Sheets("BD").Range("b" & a).Value
        End If
        If wkbcc.Sheets(NM).Visible = True Then wkbcc.Sheets(NM).Visible = False
        b = b + 1
    Next a
    c'est une variable public pour me permettre d'être utiliser dans tous mes modules et feuilles.

    Mon problème est que ce fichier reste ouvert toute la journée et l'utilisateur navigue sur d'autres fichiers ou applications.
    J'ai un plantage parfois suite à la disparition de cette variable dans les instances en cours.

    Je voudrais du coup faire différemment :
    En cliquant sur le bouton activex contenu dans ma feuille je veux qu'il me donne le nom du classeur.
    Attention :

    activeworkbook.name ne fonctionnera pas car j'ai dèjà eu le cas.
    En clair, si ma sélection en cours est sur un autre classeur, lorsque je viens sur ce classeur et clique sur le bouton activex sans cliquer sur une cellule de la feuille activeworkbook.name portera le nom de l'autre classeur donc plantage assuré.

    Ceci me permettra de créer une petite fonction pour remplacer la création de la variable à l'ouverture du classeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    option explicit
    Public wkbcc As Object
    dim nm as string 
     
    sub instclass ()
     
    set wbkcc =nothing 'je désactive la variable si elle est encore active
    nm = activex.workbooks.name ' c'est se que je voudrais faire
    set wbkcc = workbooks(nm)
     
    end sub
    j'ai écrit la sub ci dessus sans tester car je sais que celà ne fonctionne pas.
    Il faudrait corriger la ligne "nm =activex.workbooks.name"

    L'idée étant, lorsque je clique sur le bouton activex d'appeler cette sub pour réinstaller la variable objet "wkbcc" si elle a disparu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Sub but2_Click()
    instclass
    cliquemenu 2
    End Sub
    instclass étant l'appel de recréation de la variable
    cliquemenu 2 est une sub que j'appelle avec une donnée à fournir : (2 dans ce cas). qui exécute mon programme dont wkbcc est présent dans le module.

    Avez vous une idée ?

    merci pour votre aide

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut
    Personne pour m'aider ?

    Je réfléchissais à une solution d'appel des classeurs ouverts avec la boucle for each mais le même type de fichiers peut être ouvert pour plusieurs utilisations différentes.
    Je bouclerai sur les mêmes éléments donc solution pas viable.
    Il me faut une solution pour remonter la collection d'objets et avoir le, nom du classeur dans lequel se trouve le bouton activex?

    Mais là je cale et aucunes recherches internet ne m'aide.

    Merci pour votre aide

  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 173
    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 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    activeworkbook.name ne fonctionnera pas car j'ai dèjà eu le cas.
    Je suppose que le bouton ActiveX est présent dans le classeur où vous avez votre code VBA, il faut donc utiliser ThisWorkbook et pas ActiveWorkbook
    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
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,

    Je suppose que le bouton ActiveX est présent dans le classeur où vous avez votre code VBA, il faut donc utiliser ThisWorkbook et pas ActiveWorkbook
    BOnjour Philippe, merci pour ton retour.

    Oui, mon bouton activeX est bien dans le classeur que je veux pointer.
    J'avais vu ThisWorkbook comme appel mais il me semblait avoir lu qu'il fallait être aussi dans le classeur.
    Du coup je n'ai même pas essayé, je fais un essai et je reviens vous dire.

    merci

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,

    Je suppose que le bouton ActiveX est présent dans le classeur où vous avez votre code VBA, il faut donc utiliser ThisWorkbook et pas ActiveWorkbook
    mes hommages Mr Tulliez, effectivement cela fonctionnne à tous les coups.

    Je vais retourner à l'écolé réapprendre à lire !!!

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

Discussions similaires

  1. [XL-365] Récupérer le nom du dossier dans lequel se trouve le classeur excel
    Par Lee_Conoclaste dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/09/2021, 20h27
  2. Obtenir le nom du fichier dans lequel une fonction est importée
    Par byache dans le forum Général Python
    Réponses: 1
    Dernier message: 01/01/2019, 17h39
  3. [RegEx] Récupérer le nom du dossier dans lequel la page est lancée
    Par AngelFire dans le forum Langage
    Réponses: 3
    Dernier message: 15/12/2007, 11h10
  4. [VBA-E]Liste des noms de classeur dans un dossier
    Par Lexot2 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/09/2006, 21h04
  5. Réponses: 2
    Dernier message: 21/02/2006, 10h36

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