Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Suppression de userform par code VBA

8 réponses
Avatar
Jean-Claude
Bonjour

Dans la macro suivante, qui devrait me permettre d'effacer des boites de
dialogue devenues inutiles, j'obtiens l'erreur 1004 dès le premier passage
dans la boucle For.

Où se situe mon erreur ?
Merci d'avance

Sub SupprimComposantVba()
tabVbEàEffacer = Array("BdD1", "BdD2", "BdD3", "BdD4", "BdD5")
On Error GoTo TraitementErreur
For i = 0 To UBound(tabVbEàEffacer)
ActiveWorkbook.VBProject.VBComponents.Remove
(ActiveWorkbook.VBProject.VBComponents(tabVbEàEffacer(i)))
Next i
Exit Sub
TraitementErreur:
CodeErreur = Err & " - " & Err.Description
End Sub

"1004 - L'accès par programme au projet Visual Basic n'est pas fiable"

--
A+
Jean-Claude
jcvalProut@wanamoo.fr - Evitez lez gaz mou

8 réponses

Avatar
michdenis
Bonjour Jean-Claude,

Barre des menus / Outils / Macros / Sécurité / onglet Sources Fiables / coche les 2 options dans le bas de la fenêtre.


Salutations!



"Jean-Claude" a écrit dans le message de news:ci20t5$11r$
Bonjour

Dans la macro suivante, qui devrait me permettre d'effacer des boites de
dialogue devenues inutiles, j'obtiens l'erreur 1004 dès le premier passage
dans la boucle For.

Où se situe mon erreur ?
Merci d'avance

Sub SupprimComposantVba()
tabVbEàEffacer = Array("BdD1", "BdD2", "BdD3", "BdD4", "BdD5")
On Error GoTo TraitementErreur
For i = 0 To UBound(tabVbEàEffacer)
ActiveWorkbook.VBProject.VBComponents.Remove
(ActiveWorkbook.VBProject.VBComponents(tabVbEàEffacer(i)))
Next i
Exit Sub
TraitementErreur:
CodeErreur = Err & " - " & Err.Description
End Sub

"1004 - L'accès par programme au projet Visual Basic n'est pas fiable"

--
A+
Jean-Claude
- Evitez lez gaz mou
Avatar
Jean-Claude

Barre des menus / Outils / Macros / Sécurité / onglet Sources Fiables /
coche les 2 options dans le bas de la fenêtre


Merci pour ta réponse qui m'a permis de gagner 564 places (à ce rythme je
vais bientôt être négatif et en tennis c'est bon).
Elle a eu un effet car j'obtiens dorénavant le message suivant :

"438 - Propriété ou méthode non gérée par cet objet"

Avatar
michdenis
Bonjour Jean-Claude,

En supposant que les "BdD" représentent un module standard,
de classe ou un userform, voici ce que pourrait avoir l'air ta macro.

'-------------------------------
Sub SupprimComposantVba()

Dim Comp As Object
Dim tabVbEàEffacer()

tabVbEàEffacer = Array("BdD1", "BdD2", "BdD3", "BdD4", "BdD5")
On Error GoTo TraitementErreur

For i = 0 To UBound(tabVbEàEffacer)
With ThisWorkbook.VBProject.VBComponents
Set Comp = .Item(tabVbEàEffacer(i))
.Remove Comp
End With
Next i
Exit Sub

TraitementErreur:
CodeErreur = Err & " - " & Err.Description

End Sub
'-------------------------------


Salutations!



"Jean-Claude" a écrit dans le message de news:ci25le$8p7$

Barre des menus / Outils / Macros / Sécurité / onglet Sources Fiables /
coche les 2 options dans le bas de la fenêtre


Merci pour ta réponse qui m'a permis de gagner 564 places (à ce rythme je
vais bientôt être négatif et en tennis c'est bon).
Elle a eu un effet car j'obtiens dorénavant le message suivant :

"438 - Propriété ou méthode non gérée par cet objet"

Avatar
Jean-Claude
Bonjour et merci
Pourquoi ça marche avec ce code ?
Jc
En supposant que les "BdD" représentent un module standard,
de classe ou un userform, voici ce que pourrait avoir l'air ta macro.

'-------------------------------
Sub SupprimComposantVba()

Dim Comp As Object
Dim tabVbEàEffacer()

tabVbEàEffacer = Array("BdD1", "BdD2", "BdD3", "BdD4", "BdD5")
On Error GoTo TraitementErreur

For i = 0 To UBound(tabVbEàEffacer)
With ThisWorkbook.VBProject.VBComponents
Set Comp = .Item(tabVbEàEffacer(i))
.Remove Comp
End With
Next i
Exit Sub

TraitementErreur:
CodeErreur = Err & " - " & Err.Description

End Sub


Avatar
michdenis
Bonjour Jean-Claude,

A ) La méthode "Remove" demande que nous lui passions un OBJET (module, userform) afin qu'elle puisse le supprimer.

- Ajoute la bibliothèque suivante à ton projet : "Microsoft Visual Basic For Applications Extensibility 5.3"

- À partir de la barre d'outils - Un clic sur l'explorateur d'objet

- Saisir dans la boîte de saisie "VBComponent"

- Dans la fenêtre du bas , section de gauche ayant l'étiquette "Classes" , recherche et clique sur l'item
"VBComponent" et observe à droite les méthodes et les propriétés de cette classe d'objet. La propriété "objet" n'est pas
défini. Si elle l'avait été, on aurait pu alors écrire :
ActiveWorkbook.VBProject.VBComponents.Remove _
ActiveWorkbook.VBProject.VBComponents(tabVbEàEffacer(i)).Object

Et cette dernière ligne de code aurait très bien fonctionné.

Comme la propriété objet n'est pas définie, j'ai utilisé une variable de type objet pour "personnaliser" chacun à tour
de rôle les objets à supprimer dans ton projet.
Set Comp = .Item(tabVbEàEffacer(i))
Je peux donc supprimer cet objet à la ligne suivante :
.remove Comp

Un autre exemple : Suppose que tu veuilles supprimer un bouton de commande issu de la barre d'outils "Contrôle"
Tu peux écrire comme ligne de commande :

Shapes("CommandButton1").Delete
Refais dans l'explorateur le même type d'exercice en saissisant "Shape" et tu va voir que la méthode "Delete" est bien
définie.

Et observe la différence de syntaxe, dans le deuxième exemple, la méthode delete est appliqué à un objet tandis que la
méthode "Remove" demande que tu lui passe un objet et rien d'autre.

J'espère que c'est un peu plus clair !!!!!!!!!!!!!!!!!


B ) J'ai apporté un correctif à ta gestion d'erreur dans la procédure
'----------------------------------
Sub SupprimComposantVba()

Dim Comp As Object
Dim tabVbEàEffacer()

tabVbEàEffacer = Array("BdD1", "BdD2", "BdD3", "BdD4", "BdD5")
On Error GoTo TraitementErreur

For i = 0 To UBound(tabVbEàEffacer)
With ThisWorkbook.VBProject.VBComponents
Set Comp = .Item(tabVbEàEffacer(i))
.Remove Comp
End With
Next i
Exit Sub

TraitementErreur:
codeerreur = Err & " - " & Err.Description & _
vbCrLf & "Ce composant """ & tabVbEàEffacer(i) & """ n'existe pas."
MsgBox codeerreur
Err = 0: i = i + 1
Resume
End Sub
'----------------------------------


Salutations!



"Jean-Claude" a écrit dans le message de news:ci4p2m$m5l$
Bonjour et merci
Pourquoi ça marche avec ce code ?
Jc
En supposant que les "BdD" représentent un module standard,
de classe ou un userform, voici ce que pourrait avoir l'air ta macro.

'-------------------------------
Sub SupprimComposantVba()

Dim Comp As Object
Dim tabVbEàEffacer()

tabVbEàEffacer = Array("BdD1", "BdD2", "BdD3", "BdD4", "BdD5")
On Error GoTo TraitementErreur

For i = 0 To UBound(tabVbEàEffacer)
With ThisWorkbook.VBProject.VBComponents
Set Comp = .Item(tabVbEàEffacer(i))
.Remove Comp
End With
Next i
Exit Sub

TraitementErreur:
CodeErreur = Err & " - " & Err.Description

End Sub


Avatar
Jean-Claude
Avatar
Nicolas
Bonjour a tous.

J'ai un probleme de bug par intermittance. Je souhaite mettre a jour par le
web des modules et des userforms. J'ai donc utilise la methode remove pour
eliminer le module ou le userform pour supprimer l'ancien code, puis la
methode load pour recharger le nouveau. Ce code fonctionne parfois, et
parfois je me retrouve dans l'impossibilite de supprimer les modules ou
userforms a modifier au sein du sous programme.
C'est comme si XL avait en memoire l'instruction, et ne realise le remove
que lorsque le sous programme est termine. Le load devient donc completement
inoperant.
Est ce que vous avez une idee sur la raison de ce comportement aleatoire, et
connaissez vous une instruction VBA qui force VBA a executer la suppression
du fichier.

D'avance merci pour vos commentaires
J'ai vraiment cherche un peu partout, et je n'arrive pas a comprendre


Bonjour Jean-Claude,

A ) La méthode "Remove" demande que nous lui passions un OBJET (module, userform) afin qu'elle puisse le supprimer.

- Ajoute la bibliothèque suivante à ton projet : "Microsoft Visual Basic For Applications Extensibility 5.3"

- À partir de la barre d'outils - Un clic sur l'explorateur d'objet

- Saisir dans la boîte de saisie "VBComponent"

- Dans la fenêtre du bas , section de gauche ayant l'étiquette "Classes" , recherche et clique sur l'item
"VBComponent" et observe à droite les méthodes et les propriétés de cette classe d'objet. La propriété "objet" n'est pas
défini. Si elle l'avait été, on aurait pu alors écrire :
ActiveWorkbook.VBProject.VBComponents.Remove _
ActiveWorkbook.VBProject.VBComponents(tabVbEàEffacer(i)).Object

Et cette dernière ligne de code aurait très bien fonctionné.

Comme la propriété objet n'est pas définie, j'ai utilisé une variable de type objet pour "personnaliser" chacun à tour
de rôle les objets à supprimer dans ton projet.
Set Comp = .Item(tabVbEàEffacer(i))
Je peux donc supprimer cet objet à la ligne suivante :
.remove Comp

Un autre exemple : Suppose que tu veuilles supprimer un bouton de commande issu de la barre d'outils "Contrôle"
Tu peux écrire comme ligne de commande :

Shapes("CommandButton1").Delete
Refais dans l'explorateur le même type d'exercice en saissisant "Shape" et tu va voir que la méthode "Delete" est bien
définie.

Et observe la différence de syntaxe, dans le deuxième exemple, la méthode delete est appliqué à un objet tandis que la
méthode "Remove" demande que tu lui passe un objet et rien d'autre.

J'espère que c'est un peu plus clair !!!!!!!!!!!!!!!!!


B ) J'ai apporté un correctif à ta gestion d'erreur dans la procédure
'----------------------------------
Sub SupprimComposantVba()

Dim Comp As Object
Dim tabVbEàEffacer()

tabVbEàEffacer = Array("BdD1", "BdD2", "BdD3", "BdD4", "BdD5")
On Error GoTo TraitementErreur

For i = 0 To UBound(tabVbEàEffacer)
With ThisWorkbook.VBProject.VBComponents
Set Comp = .Item(tabVbEàEffacer(i))
.Remove Comp
End With
Next i
Exit Sub

TraitementErreur:
codeerreur = Err & " - " & Err.Description & _
vbCrLf & "Ce composant """ & tabVbEàEffacer(i) & """ n'existe pas."
MsgBox codeerreur
Err = 0: i = i + 1
Resume
End Sub
'----------------------------------


Salutations!



"Jean-Claude" a écrit dans le message de news:ci4p2m$m5l$
Bonjour et merci
Pourquoi ça marche avec ce code ?
Jc
En supposant que les "BdD" représentent un module standard,
de classe ou un userform, voici ce que pourrait avoir l'air ta macro.

'-------------------------------
Sub SupprimComposantVba()

Dim Comp As Object
Dim tabVbEàEffacer()

tabVbEàEffacer = Array("BdD1", "BdD2", "BdD3", "BdD4", "BdD5")
On Error GoTo TraitementErreur

For i = 0 To UBound(tabVbEàEffacer)
With ThisWorkbook.VBProject.VBComponents
Set Comp = .Item(tabVbEàEffacer(i))
.Remove Comp
End With
Next i
Exit Sub

TraitementErreur:
CodeErreur = Err & " - " & Err.Description

End Sub








Avatar
michdenis
Bonjour Nicolas,


Après cette ligne de code dans mon exemple :

Set Comp = .Item(tabVbEàEffacer(i))

Ajoute :

Set Comp = Nothing
DoEvents


Est-ce que cela résout ton problème ?



"Nicolas" a écrit dans le message de
news:
Bonjour a tous.

J'ai un probleme de bug par intermittance. Je souhaite mettre a jour par le
web des modules et des userforms. J'ai donc utilise la methode remove pour
eliminer le module ou le userform pour supprimer l'ancien code, puis la
methode load pour recharger le nouveau. Ce code fonctionne parfois, et
parfois je me retrouve dans l'impossibilite de supprimer les modules ou
userforms a modifier au sein du sous programme.
C'est comme si XL avait en memoire l'instruction, et ne realise le remove
que lorsque le sous programme est termine. Le load devient donc completement
inoperant.
Est ce que vous avez une idee sur la raison de ce comportement aleatoire, et
connaissez vous une instruction VBA qui force VBA a executer la suppression
du fichier.

D'avance merci pour vos commentaires
J'ai vraiment cherche un peu partout, et je n'arrive pas a comprendre


Bonjour Jean-Claude,

A ) La méthode "Remove" demande que nous lui passions un OBJET (module, userform) afin qu'elle puisse le supprimer.

- Ajoute la bibliothèque suivante à ton projet : "Microsoft Visual Basic For Applications Extensibility 5.3"

- À partir de la barre d'outils - Un clic sur l'explorateur d'objet

- Saisir dans la boîte de saisie "VBComponent"

- Dans la fenêtre du bas , section de gauche ayant l'étiquette "Classes" , recherche et clique sur l'item
"VBComponent" et observe à droite les méthodes et les propriétés de cette classe d'objet. La propriété "objet" n'est
pas

défini. Si elle l'avait été, on aurait pu alors écrire :
ActiveWorkbook.VBProject.VBComponents.Remove _
ActiveWorkbook.VBProject.VBComponents(tabVbEàEffacer(i)).Object

Et cette dernière ligne de code aurait très bien fonctionné.

Comme la propriété objet n'est pas définie, j'ai utilisé une variable de type objet pour "personnaliser" chacun à tour
de rôle les objets à supprimer dans ton projet.
Set Comp = .Item(tabVbEàEffacer(i))
Je peux donc supprimer cet objet à la ligne suivante :
.remove Comp

Un autre exemple : Suppose que tu veuilles supprimer un bouton de commande issu de la barre d'outils "Contrôle"
Tu peux écrire comme ligne de commande :

Shapes("CommandButton1").Delete
Refais dans l'explorateur le même type d'exercice en saissisant "Shape" et tu va voir que la méthode "Delete" est bien
définie.

Et observe la différence de syntaxe, dans le deuxième exemple, la méthode delete est appliqué à un objet tandis que la
méthode "Remove" demande que tu lui passe un objet et rien d'autre.

J'espère que c'est un peu plus clair !!!!!!!!!!!!!!!!!


B ) J'ai apporté un correctif à ta gestion d'erreur dans la procédure
'----------------------------------
Sub SupprimComposantVba()

Dim Comp As Object
Dim tabVbEàEffacer()

tabVbEàEffacer = Array("BdD1", "BdD2", "BdD3", "BdD4", "BdD5")
On Error GoTo TraitementErreur

For i = 0 To UBound(tabVbEàEffacer)
With ThisWorkbook.VBProject.VBComponents
Set Comp = .Item(tabVbEàEffacer(i))
.Remove Comp
End With
Next i
Exit Sub

TraitementErreur:
codeerreur = Err & " - " & Err.Description & _
vbCrLf & "Ce composant """ & tabVbEàEffacer(i) & """ n'existe pas."
MsgBox codeerreur
Err = 0: i = i + 1
Resume
End Sub
'----------------------------------


Salutations!



"Jean-Claude" a écrit dans le message de news:ci4p2m$m5l$
Bonjour et merci
Pourquoi ça marche avec ce code ?
Jc
En supposant que les "BdD" représentent un module standard,
de classe ou un userform, voici ce que pourrait avoir l'air ta macro.

'-------------------------------
Sub SupprimComposantVba()

Dim Comp As Object
Dim tabVbEàEffacer()

tabVbEàEffacer = Array("BdD1", "BdD2", "BdD3", "BdD4", "BdD5")
On Error GoTo TraitementErreur

For i = 0 To UBound(tabVbEàEffacer)
With ThisWorkbook.VBProject.VBComponents
Set Comp = .Item(tabVbEàEffacer(i))
.Remove Comp
End With
Next i
Exit Sub

TraitementErreur:
CodeErreur = Err & " - " & Err.Description

End Sub