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