Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/12/2011, 18h45   #1
Invité de passage
 
Homme
Inscription : décembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2011
Messages : 5
Points : 0
Points : 0
Par défaut Problème d'accès de fichier

Bonsoir,

je débute dans VBA et j'ai un projet à faire en utilisant des classes.

Quand je démarre une première fois le programme, tout se passe correctement. Si j'ouvre le fichier une seconde fois, j'ai un message d'erreur "Erreur d'accès de fichier. La connexion réseau a peut-être été perdue." au démarrage d'excel.

Dans la partie vba, je n'ai également plus accès à mon module classe. Le programme tourne sauf tout ce qui a rapport à la classe.

J'ai beau chercher, je ne vois pas ce qui provoque cette perte de fichier.

Est ce que l'un d'entre vous aurez une idée du problème ? merci beaucoup
boris54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 18h52   #2
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Ta classe, c'est un fichier que tu as importé ou c'est toi qui l'a créé ?
Il se passe qq chose sur le Workbook_Open ?
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 18h59   #3
Invité de passage
 
Homme
Inscription : décembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2011
Messages : 5
Points : 0
Points : 0
J'ai crée ma propre classe.

Dans le workbook open, j'active une feuille de présentation du programme avec un bouton pour l'activer et je masque deux feuilles qui me permettent de stocker des informations
boris54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 09h58   #4
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Si tu n'essaies vraiment nulle part d'accéder à un autre fichier que ton classeur, ça peut être un des rares bugs d'Office. J'en avais entendu parlé sous Access mais pas sous Excel.
La seule solution est souvent dans ce cas de recopier tout son code dans un nouveau classeur. C'est un peu bourrin, mais même Microsoft le préconise. Il y aussi des histoires de mise à jour d'Office ou la dll VBA.
Par contre, si tu n'as pas accès au code de ta classe c'est embêtant. Tu arrives à l'exporter ?

Si ton fichier n'est pas trop gros ni confidentiel, tu peux peut-être le partager qu'on regarde.
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 12h00   #5
Invité de passage
 
Homme
Inscription : décembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2011
Messages : 5
Points : 0
Points : 0
Lorsque l'erreur s'est affichée, je ne peux plus exporter ma classe : a l'exportation, lors de l'enregistrement, la même erreur apparaît.

J'ai mis mon fichier en pièce jointe. J'espère qu'il sera compréhensible.

Merci en tout cas d'y passer un peu de temps
Fichiers attachés
Type de fichier : xls Gestion de multimedia.2.1.3.xls (168,5 Ko, 3 affichages)
boris54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 12h15   #6
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Ecoute, ça marche bien chez moi, je n'ai pas le problème.
Tu dis je te redonnes le code de tes classes pour que tu puisses les recopier :

CAnimation :
Code :
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
Implements CMultimedia
 
Private pMultimedia As CMultimedia
Private pStudio As String
 
' Le Constructeur
Private Sub class_Initialize()
 
Set pMultimedia = New CMultimedia
 
End Sub
 
' Le Destructeur
Private Sub class_Terminate()
 
' Dans le code VBA, on utilisera la syntaxe "Set MaClasse = Nothing" pour détruire une instance de la classe.
 
End Sub
 
Private Property Let CMultimedia_Acteur1(value As String)
    pMultimedia.Acteur1 = value
End Property
 
Private Property Get CMultimedia_Acteur1() As String
    CMultimedia_Acteur1 = pMultimedia.Acteur1
End Property
 
Private Property Let CMultimedia_Acteur2(value As String)
    pMultimedia.Acteur2 = value
End Property
 
Private Property Get CMultimedia_Acteur2() As String
    CMultimedia_Acteur2 = pMultimedia.Acteur2
End Property
 
Private Property Let CMultimedia_Acteur3(value As String)
    pMultimedia.Acteur3 = value
End Property
 
Private Property Get CMultimedia_Acteur3() As String
    CMultimedia_Acteur3 = pMultimedia.Acteur3
End Property
 
Private Property Let CMultimedia_Adresse(value As String)
    pMultimedia.Adresse = value
End Property
 
Private Property Get CMultimedia_Adresse() As String
    CMultimedia_Adresse = pMultimedia.Adresse
End Property
 
Public Sub CMultimedia_Charge(ByVal index As Integer)
    Dim sh As Worksheet
    Set sh = ActiveWorkbook.Worksheets("BDM")
    Dim ligne As Integer
 
    ligne = CMultimedia_ChercheLigne(index)
 
    'Ecriture des donnees dans la feuille BDM
    pMultimedia.Charge (index)
    Studio = sh.Cells(ligne, 15)
End Sub
 
Public Sub CMultimedia_ChargeDonnees()
    pMultimedia.ChargeDonnees
    Gestion.Studio.value = Studio
End Sub
 
Private Function CMultimedia_ChercheLigne(ByVal index As Integer) As Integer
    CMultimedia_ChercheLigne = pMultimedia.ChercheLigne(index)
End Function
 
Public Sub CMultimedia_Delete(ByVal index As Integer)
    pMultimedia.Delete (index)
End Sub
 
Private Property Let CMultimedia_Duree(value As Integer)
    pMultimedia.Duree = value
End Property
 
Private Property Get CMultimedia_Duree() As Integer
    CMultimedia_Duree = pMultimedia.Duree
End Property
 
Private Property Let CMultimedia_Genre(value As String)
    pMultimedia.Genre = value
End Property
 
Private Property Get CMultimedia_Genre() As String
    CMultimedia_Genre = pMultimedia.Genre
End Property
 
Private Property Get CMultimedia_Indice() As Integer
    CMultimedia_Indice = pMultimedia.Indice
End Property
 
Private Property Let CMultimedia_Indice(value As Integer)
    pMultimedia.Indice = value
End Property
 
' Définition de la propriété Studio
Public Property Let Studio(value As String) 'La procédure "Property Let" attribue une valeur à la variable
    pStudio = value
End Property
Public Property Get Studio() As String 'La procédure "Property Get" retourne la valeur de la variable
    Studio = pStudio
End Property
 
 
'Redéfinisions de la subroutine Add
 
Public Sub CMultimedia_Add()
    Dim sh As Worksheet
    Dim End_line As Double
    Set sh = ActiveWorkbook.Worksheets("BDM")
 
    If sh.Range("A2") = "" Then
        'Initialisation de la BDM
        End_line = 1
    Else
        End_line = sh.Range("A1").End(xlDown).Row
    End If
 
    pMultimedia.Add
    sh.Cells(End_line + 1, 15) = Studio
End Sub
 
Private Property Let CMultimedia_Langue(value As String)
    pMultimedia.Langue = value
End Property
 
Private Property Get CMultimedia_Langue() As String
    CMultimedia_Langue = pMultimedia.Langue
End Property
 
Public Sub CMultimedia_lecture(ByVal index As Integer)
    pMultimedia.Lecture (index)
End Sub
 
Public Sub CMultimedia_Modif(ByVal index As Integer)
    Dim sh As Worksheet
    Set sh = ActiveWorkbook.Worksheets("BDM")
    Dim ligne As Integer
 
    pMultimedia.Modif (index)
    ligne = CMultimedia_ChercheLigne(index)
    sh.Cells(ligne, 15) = Studio
End Sub
 
Private Property Let CMultimedia_Realisateur(value As String)
    pMultimedia.Realisateur = value
End Property
 
Private Property Get CMultimedia_Realisateur() As String
    CMultimedia_Realisateur = pMultimedia.Realisateur
End Property
 
Private Property Let CMultimedia_Sortie(value As Integer)
    pMultimedia.Sortie = value
End Property
 
Private Property Get CMultimedia_Sortie() As Integer
    CMultimedia_Sortie = pMultimedia.Sortie
End Property
 
Private Property Let CMultimedia_SStitre(value As String)
    pMultimedia.SStitre = value
End Property
 
Private Property Get CMultimedia_SStitre() As String
    CMultimedia_SStitre = pMultimedia.SStitre
End Property
 
Private Property Let CMultimedia_Titre(value As String)
    pMultimedia.Titre = value
End Property
 
Private Property Get CMultimedia_Titre() As String
    CMultimedia_Titre = pMultimedia.Titre
End Property
 
Private Property Let CMultimedia_TypeMulti(value As String)
    pMultimedia.TypeMulti = value
End Property
 
Private Property Get CMultimedia_TypeMulti() As String
    CMultimedia_TypeMulti = pMultimedia.TypeMulti
End Property
 
Public Sub CMultimedia_Validation()
    'Vérification des données
    pMultimedia.Validation
    Studio = Gestion.Studio.value
End Sub
 
Private Property Let CMultimedia_Visualise(value As Boolean)
    pMultimedia.Visualise = value
End Property
 
Private Property Get CMultimedia_Visualise() As Boolean
    CMultimedia_Visualise = pMultimedia.Visualise
End Property
CMultimedia :
Code :
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
'Module de Classe de MULTIMEDIA
 
Private pIndice As Integer
Private pTitre As String
Private pDuree As Integer
Private pSortie As Integer
Private pGenre As String
Private pRealisateur As String
Private pActeur1 As String
Private pActeur2 As String
Private pActeur3 As String
Private pVisualise As Boolean
Private pTypeMulti As String
Private pLangue As String
Private pSStitre As String
Private pAdresse As String
 
' Le Constructeur
Private Sub class_Initialize()
 
' On initialise à des valeurs par défaut lors de l'initialisation de la classe
 
Dim sh As Worksheet
Dim index As Double
 
Set sh = ActiveWorkbook.Sheets("BDM")
index = WorksheetFunction.Max(sh.Range("A2:A50000").value)
index = Int(index)
 
Me.Indice = index + 1
Me.Duree = 0
Me.Sortie = 1900
 
End Sub
 
' Le Destructeur
Private Sub class_Terminate()
 
' Dans le code VBA, on utilisera la syntaxe "Set MaClasse = Nothing" pour détruire une instance de la classe.
 
End Sub
' Définition de la propriété Indice
Public Property Let Indice(value As Integer) 'La procédure "Property Let" attribue une valeur à la variable
    pIndice = value
End Property
Public Property Get Indice() As Integer 'La procédure "Property Get" retourne la valeur de la variable
    Indice = pIndice
End Property
 
' Définition de la propriété Titre
Public Property Let Titre(value As String) 'La procédure "Property Let" attribue une valeur à la variable
    pTitre = value
End Property
Public Property Get Titre() As String 'La procédure "Property Get" retourne la valeur de la variable
    Titre = pTitre
End Property
 
' Définition de la propriété Duree
Public Property Let Duree(value As Integer)
    pDuree = value
End Property
Public Property Get Duree() As Integer
    Duree = pDuree
End Property
 
' Définition de la propriété Sortie
Public Property Let Sortie(value As Integer)
'If Sortie > 1900 And Sortie < 3000 Then
    pSortie = value
'Else
 '   MsgBox "L'année de sortie doit être comprise entre 1900 et 3000"
  '  Gestion.Annee.SetFocus
'End If
End Property
Public Property Get Sortie() As Integer
    Sortie = pSortie
End Property
 
' Définition de la propriété Genre
Public Property Let Genre(value As String)
    pGenre = value
End Property
Public Property Get Genre() As String
    Genre = pGenre
End Property
 
' Définition de la propriété Realisateur
Public Property Let Realisateur(value As String)
    pRealisateur = value
End Property
Public Property Get Realisateur() As String
    Realisateur = pRealisateur
End Property
 
' Définition de la propriété Acteur1
Public Property Let Acteur1(value As String)
    pActeur1 = value
End Property
Public Property Get Acteur1() As String
    Acteur1 = pActeur1
End Property
 
' Définition de la propriété Acteur2
Public Property Let Acteur2(value As String)
    pActeur2 = value
End Property
Public Property Get Acteur2() As String
    Acteur2 = pActeur2
End Property
 
' Définition de la propriété Acteur3
Public Property Let Acteur3(value As String)
    pActeur3 = value
End Property
Public Property Get Acteur3() As String
    Acteur3 = pActeur3
End Property
 
' Définition de la propriété Visualise
Public Property Let Visualise(value As Boolean)
    pVisualise = value
End Property
Public Property Get Visualise() As Boolean
    Visualise = pVisualise
End Property
 
' Définition de la propriété TypeMulti
Public Property Let TypeMulti(value As String)
    pTypeMulti = value
End Property
Public Property Get TypeMulti() As String
    TypeMulti = pTypeMulti
End Property
 
' Définition de la propriété Langue
Public Property Let Langue(value As String)
    pLangue = value
End Property
Public Property Get Langue() As String
    Langue = pLangue
End Property
 
' Définition de la propriété SStitre
Public Property Let SStitre(value As String)
    pSStitre = value
End Property
Public Property Get SStitre() As String
    SStitre = pSStitre
End Property
 
' Définition de la propriété Adresse
Public Property Let Adresse(value As String)
    pAdresse = value
End Property
Public Property Get Adresse() As String
    Adresse = pAdresse
End Property
 
'Ajout de fonction ou subroutine à la classe mère qui sera modifiable par la classe fille
 
'Fonction permettant d'ajouter un multimédia à la feuille BDM
Public Sub Add()
 
    Dim sh As Worksheet
    Dim End_line As Double
    Set sh = ActiveWorkbook.Worksheets("BDM")
 
    If sh.Range("A2") = "" Then
        'Initialisation de la BDM
        End_line = 1
    Else
        End_line = sh.Range("A1").End(xlDown).Row
    End If
 
    'Ecriture des donnees dans la feuille BDM
    sh.Cells(End_line + 1, 1) = Indice
    sh.Cells(End_line + 1, 2) = Titre
    sh.Cells(End_line + 1, 3) = TypeMulti
    sh.Cells(End_line + 1, 4) = Langue
    sh.Cells(End_line + 1, 5) = SStitre
    sh.Cells(End_line + 1, 6) = Visualise
    sh.Cells(End_line + 1, 7) = Genre
    sh.Cells(End_line + 1, 8) = Duree
    sh.Cells(End_line + 1, 9) = Sortie
    sh.Cells(End_line + 1, 10) = Realisateur
    sh.Cells(End_line + 1, 11) = Acteur1
    sh.Cells(End_line + 1, 12) = Acteur2
    sh.Cells(End_line + 1, 13) = Acteur3
    sh.Cells(End_line + 1, 14) = Adresse
 
End Sub
 
Public Sub Validation()
 
'Vérification des données
If Gestion.Duree.value <> "" And Gestion.Duree.value > 0 Then
   Duree = Gestion.Duree.value
End If
 
If Gestion.Annee.value > 1900 And Gestion.Annee.value <> "" Then
   Sortie = Gestion.Annee.value
End If
 
Titre = Gestion.Titre.value
TypeMulti = Gestion.TypeMulti.value
Genre = Gestion.Genre.value
Realisateur = Gestion.Realisateur.value
Acteur1 = Gestion.Acteur1.value
Acteur2 = Gestion.Acteur2.value
Acteur3 = Gestion.Acteur3.value
Langue = Gestion.Langue.value
SStitre = Gestion.SStitre.value
Visualise = Gestion.Vu.value
Adresse = Gestion.Parcourir.Tag
 
End Sub
 
Public Sub Delete(ByVal index As Integer)
    'Cette fonction permet de supprimer une ligne dans la BDM
    Dim sh As Worksheet
    Dim End_line As Double
    Set sh = ActiveWorkbook.Sheets("BDM")
    End_line = sh.Range("A1").End(xlDown).Row
    For i = 2 To End_line
        If sh.Cells(i, 1).value = index Then
            sh.Range(i & ":" & i).EntireRow.Delete
            Exit For
        End If
    Next i
End Sub
 
Public Sub Charge(ByVal index As Integer)
 
    Dim sh As Worksheet
    Set sh = ActiveWorkbook.Worksheets("BDM")
    Dim ligne As Integer
 
    ligne = ChercheLigne(index)
 
    'Ecriture des donnees dans la feuille BDM
    Indice = sh.Cells(ligne, 1)
    Titre = sh.Cells(ligne, 2)
    TypeMulti = sh.Cells(ligne, 3)
    Langue = sh.Cells(ligne, 4)
    SStitre = sh.Cells(ligne, 5)
    Visualise = sh.Cells(ligne, 6)
    Genre = sh.Cells(ligne, 7)
    Duree = sh.Cells(ligne, 8)
    Sortie = sh.Cells(ligne, 9)
    Realisateur = sh.Cells(ligne, 10)
    Acteur1 = sh.Cells(ligne, 11)
    Acteur2 = sh.Cells(ligne, 12)
    Acteur3 = sh.Cells(ligne, 13)
    Adresse = sh.Cells(ligne, 14)
 
End Sub
 
Public Sub ChargeDonnees()
 
Gestion.Titre.value = Titre
Gestion.TypeMulti.value = TypeMulti
Gestion.Genre.value = Genre
Gestion.Realisateur.value = Realisateur
Gestion.Acteur1.value = Acteur1
Gestion.Acteur2.value = Acteur2
Gestion.Acteur3.value = Acteur3
Gestion.Langue.value = Langue
Gestion.SStitre.value = SStitre
Gestion.Vu.value = Visualise
Gestion.Parcourir.Tag = Adresse
Gestion.LabelURL.Caption = Adresse
Gestion.Duree.value = Duree
Gestion.Annee.value = Sortie
 
End Sub
 
'Fonction permettant de modifier un multimédia sur la feuille BDM
Public Sub Modif(ByVal index As Integer)
 
    Dim sh As Worksheet
    Set sh = ActiveWorkbook.Worksheets("BDM")
    Dim ligne As Integer
 
    ligne = ChercheLigne(index)
 
    'Ecriture des donnees dans la feuille BDM
    sh.Cells(ligne, 2) = Titre
    sh.Cells(ligne, 3) = TypeMulti
    sh.Cells(ligne, 4) = Langue
    sh.Cells(ligne, 5) = SStitre
    sh.Cells(ligne, 6) = Visualise
    sh.Cells(ligne, 7) = Genre
    sh.Cells(ligne, 8) = Duree
    sh.Cells(ligne, 9) = Sortie
    sh.Cells(ligne, 10) = Realisateur
    sh.Cells(ligne, 11) = Acteur1
    sh.Cells(ligne, 12) = Acteur2
    sh.Cells(ligne, 13) = Acteur3
    sh.Cells(ligne, 14) = Adresse
 
End Sub
 
Sub Lecture(ByVal index As Integer)
 
    Dim sh As Worksheet
    Set sh = ActiveWorkbook.Worksheets("BDM")
    Dim ligne As Integer
    Dim adr As String
    Dim prog As String
 
    ligne = ChercheLigne(index)
    prog = "C:\Program Files\VideoLAN\VLC\vlc.exe"
    adr = """" & sh.Cells(ligne, 14) & """"
    Shell prog & " " & adr, vbMaximizedFocus
 
End Sub
'Recherche la ligne de stockage du multimédia ayant comme Indice index
Function ChercheLigne(ByVal index As Integer) As Integer
 
    Dim sh As Worksheet
    Dim End_line As Double
    Set sh = ActiveWorkbook.Worksheets("BDM")
    Dim ligne As Integer
    Dim i As Integer
 
    If sh.Range("A2") = "" Then
        'Initialisation de la BDM
        End_line = 1
    Else
        End_line = sh.Range("A1").End(xlDown).Row
    End If
 
    For i = 2 To End_line
        If sh.Cells(i, 1).value = index Then
            ChercheLigne = i
            Exit For
        End If
    Next i
 
End Function
CSerie :
Code :
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
Implements CMultimedia
 
Private pMultimedia As CMultimedia
Private pEpisode As Integer
Private pSaison As Integer
 
' Le Constructeur
Private Sub class_Initialize()
 
Set pMultimedia = New CMultimedia
 
End Sub
 
' Le Destructeur
Private Sub class_Terminate()
 
' Dans le code VBA, on utilisera la syntaxe "Set MaClasse = Nothing" pour détruire une instance de la classe.
 
End Sub
 
Private Property Let CMultimedia_Acteur1(value As String)
    pMultimedia.Acteur1 = value
End Property
 
Private Property Get CMultimedia_Acteur1() As String
    CMultimedia_Acteur1 = pMultimedia.Acteur1
End Property
 
Private Property Let CMultimedia_Acteur2(value As String)
    pMultimedia.Acteur2 = value
End Property
 
Private Property Get CMultimedia_Acteur2() As String
    CMultimedia_Acteur2 = pMultimedia.Acteur2
End Property
 
Private Property Let CMultimedia_Acteur3(value As String)
    pMultimedia.Acteur3 = value
End Property
 
Private Property Get CMultimedia_Acteur3() As String
    CMultimedia_Acteur3 = pMultimedia.Acteur3
End Property
 
Private Property Let CMultimedia_Adresse(value As String)
    pMultimedia.Adresse = value
End Property
 
Private Property Get CMultimedia_Adresse() As String
    CMultimedia_Adresse = pMultimedia.Adresse
End Property
 
Public Sub CMultimedia_Charge(ByVal index As Integer)
    Dim sh As Worksheet
    Set sh = ActiveWorkbook.Worksheets("BDM")
    Dim ligne As Integer
 
    ligne = CMultimedia_ChercheLigne(index)
    'Ecriture des donnees dans la feuille BDM
    pMultimedia.Charge (index)
    Saison = sh.Cells(ligne, 16)
    Episode = sh.Cells(ligne, 17)
End Sub
 
Public Sub CMultimedia_ChargeDonnees()
    pMultimedia.ChargeDonnees
    Gestion.Episode.value = Episode
    Gestion.Saison.value = Saison
End Sub
 
Private Function CMultimedia_ChercheLigne(ByVal index As Integer) As Integer
    CMultimedia_ChercheLigne = pMultimedia.ChercheLigne(index)
End Function
 
Public Sub CMultimedia_Delete(ByVal index As Integer)
    pMultimedia.Delete (index)
End Sub
 
Private Property Let CMultimedia_Duree(value As Integer)
    pMultimedia.Duree = value
End Property
 
Private Property Get CMultimedia_Duree() As Integer
    CMultimedia_Duree = pMultimedia.Duree
End Property
 
Private Property Let CMultimedia_Genre(value As String)
    pMultimedia.Genre = value
End Property
 
Private Property Get CMultimedia_Genre() As String
    CMultimedia_Genre = pMultimedia.Genre
End Property
 
Private Property Get CMultimedia_Indice() As Integer
    CMultimedia_Indice = pMultimedia.Indice
End Property
 
Private Property Let CMultimedia_Indice(value As Integer)
    pMultimedia.Indice = value
End Property
 
' Définition de la propriété Episode
Public Property Let Episode(value As Integer) 'La procédure "Property Let" attribue une valeur à la variable
    pEpisode = value
End Property
Public Property Get Episode() As Integer 'La procédure "Property Get" retourne la valeur de la variable
    Episode = pEpisode
End Property
 
' Définition de la propriété Saison
Public Property Let Saison(value As Integer) 'La procédure "Property Let" attribue une valeur à la variable
    pSaison = value
End Property
Public Property Get Saison() As Integer 'La procédure "Property Get" retourne la valeur de la variable
    Saison = pSaison
End Property
 
'Redéfinisions de la subroutine Add
 
Public Sub CMultimedia_Add()
 
    Dim sh As Worksheet
    Dim End_line As Double
    Set sh = ActiveWorkbook.Worksheets("BDM")
 
    If sh.Range("A2") = "" Then
        'Initialisation de la BDM
        End_line = 1
    Else
        End_line = sh.Range("A1").End(xlDown).Row
    End If
 
    pMultimedia.Add
    sh.Cells(End_line + 1, 16) = Saison
    sh.Cells(End_line + 1, 17) = Episode
 
End Sub
 
Private Property Let CMultimedia_Langue(value As String)
    pMultimedia.Langue = value
End Property
 
Private Property Get CMultimedia_Langue() As String
    CMultimedia_Langue = pMultimedia.Langue
End Property
 
Public Sub CMultimedia_lecture(ByVal index As Integer)
    pMultimedia.Lecture (index)
End Sub
 
Public Sub CMultimedia_Modif(ByVal index As Integer)
    Dim sh As Worksheet
    Set sh = ActiveWorkbook.Worksheets("BDM")
    Dim ligne As Integer
 
    pMultimedia.Modif (index)
    ligne = CMultimedia_ChercheLigne(index)
    sh.Cells(ligne, 16) = Saison
    sh.Cells(ligne, 17) = Episode
End Sub
 
Private Property Let CMultimedia_Realisateur(value As String)
    pMultimedia.Realisateur = value
End Property
 
Private Property Get CMultimedia_Realisateur() As String
    CMultimedia_Realisateur = pMultimedia.Realisateur
End Property
 
Private Property Let CMultimedia_Sortie(value As Integer)
    pMultimedia.Sortie = value
End Property
 
Private Property Get CMultimedia_Sortie() As Integer
    CMultimedia_Sortie = pMultimedia.Sortie
End Property
 
Private Property Let CMultimedia_SStitre(value As String)
    pMultimedia.SStitre = value
End Property
 
Private Property Get CMultimedia_SStitre() As String
    CMultimedia_SStitre = pMultimedia.SStitre
End Property
 
Private Property Let CMultimedia_Titre(value As String)
    pMultimedia.Titre = value
End Property
 
Private Property Get CMultimedia_Titre() As String
    CMultimedia_Titre = pMultimedia.Titre
End Property
 
Private Property Let CMultimedia_TypeMulti(value As String)
    pMultimedia.TypeMulti = value
End Property
 
Private Property Get CMultimedia_TypeMulti() As String
    CMultimedia_TypeMulti = pMultimedia.TypeMulti
End Property
 
Public Sub CMultimedia_Validation()
 
    'Vérification des données
    pMultimedia.Validation
    Episode = Gestion.Episode.value
    Saison = Gestion.Saison.value
 
End Sub
 
Private Property Let CMultimedia_Visualise(value As Boolean)
    pMultimedia.Visualise = value
End Property
 
Private Property Get CMultimedia_Visualise() As Boolean
    CMultimedia_Visualise = pMultimedia.Visualise
End Property
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 12h25   #7
Invité de passage
 
Homme
Inscription : décembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2011
Messages : 5
Points : 0
Points : 0
whaou, ca marche chez toi ?

J'ai essayé sur 4 PC chez moi, à chaque fois après une utilisation, fermeture d'excel et réouverture, cela plantait.

Merci pour les codes en tout cas.
boris54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 12h35   #8
Invité de passage
 
Étudiant
Inscription : décembre 2011
Messages : 4
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 4
Points : 4
Points : 4
bonjour ZebreLoup, je travaille en binome avec Boris54 sur le projet,
après de nombreux tests, je suis arrivée à la conclusion que le problème venait des classes filles. En effet après avoir lancé la macro et enregistrer des données dans la base, lors d'une réouverture du programme, l'erreur s'affiche et nous n'avons plus accès à la classe CMultimedia qui est la "classe mère". Donc j'en ai déduis que l'erreur venait des "classes filles" lorsque nous faisons appel au constructeur de la classe mère ou à ses fonctions.
Mais comme nous débutons sous VBA, nous ne savons pas si ce que nous avons écrit est correct pour un appel d'héritage sous VBA (nous savons que VBA n'est pas le meilleur langage objet, mais malheureusement nous avons l'obligation utiliser les classes sous Excel )
Merci de nous aider
InfoA7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 17h02   #9
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Votre implémentation de l'"héritage" (au sens VBA) est bonne. Le problème c'est que vous ne vous en servez pas.
Pour preuve, essayez de mettre en commentaire Implements CMultimedia dans CAnimation et CSerie, vous verrez que tout se passera quand même très bien et que vous n'aurez même plus le bug dont on parle dans ce post.

Normalement, vous ne devriez jamais vous servir dans le reste du code des fonctions CMultimedia_Validation ou CMultimedia_Add par exemple.
Vous auriez en fait un objet MonMultimedia de type CMultimedia, mais dans lequel vous mettriez un objet CSerie par exemple. Dans ce cas, en faisant MonMultimedia.Add, VBA utilisera la fonction Add de la classe CSerie plutôt que celle de CMultimedia.
Je ne sais pas si je suis très clair.

Enfin, en tout cas, pour votre exemple précis, si ce n'est pas un projet d'étude dans lequel on vous demande explicitement d'utiliser Implements, je le virerais et j'enleverais les CMultimedia_ dans les propriétés des classes "filles".

PS : A la lecture de votre code, je dirais quand même que vous n'êtes plus des débutants, loin de là...
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 18h00   #10
Invité de passage
 
Étudiant
Inscription : décembre 2011
Messages : 4
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 4
Points : 4
Points : 4
Merci beaucoup, on va regarder tout ça, en espérant ne plus avoir de problème! On a déjà effectué du code dans d'autres langages (fortran ou C++) mais on débute en VBA.
Et merci encore.
InfoA7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 19h10   #11
Invité de passage
 
Homme
Inscription : décembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2011
Messages : 5
Points : 0
Points : 0
Merci beaucoup pour toutes ces explications. Effectivement cela marche mieux comme ca !
boris54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h54.


 
 
 
 
Partenaires

Hébergement Web