Bonjour,
J'ai une erreur quand j'essaye de lancer une userform automatiquement a l ouverture du fichier excel
Je vais vous decrire un moyen de reproduire l'erreur afin que vous compreniez mon probleme, et que vous puissiez m'aider s'il vous plait.
Creer un fichier excel avec "Blabla" en A1 et "123" en A2 de la Feuil1
Lancer VBA
Creer un userform, y inserer une "Zone de texte" et dans la propriété ControlSource de cette zone de texte, tapez "Feuil1!A2" ca recupere donc la valeur de A2 de Feuil1 tout va bien
Dans le ThisWorkbook pour ouvrir en automatique j ai utilise:
Private Sub Workbook_Open()
UserForm1.Show
End Sub
J'enregistre et referme Excel. Quand je le réouvre, l'erreur apparait. Impossible de debugger, et quand il tente de le réparer je perd tout le VBA.
Si quelqu'un peut m'expliquer l'erreur que j'ai fait, ca serait super, s'il vous plait.
Evidemment en utilisant un bouton dans la Feuil1 pour lancer la UserForm ca fonctionne nickel.
Si la propriete ControlSource de la zone de texte n'est pas specifiée, a l ouverture d'excel la UserForm se lance directement, ca fonctionne aussi.
Mais quand la ControlSource est specifiée, il ne veut pas lancer la UserForm1 directement.
C'est un problème classique de construction d'objets, tu viens de révéler un bug dans Excel. (Mais en fait, c'est plus un choix délibéré qu'un bug.)
un classeur est composé de feuilles, de fiches et de modules. Lorsqu'il se construit (au sens programmation objet) en mémoire à partir du fichier XLS, il construit aussi ses feuilles, ses fiches et ses modules. Selon l'ordre dans lequel cela est fait - et tu n'as pas la main la dessus, certaines méthodes (constructeurs) sont appelées avant ou après d'autres. Dans ces constructeurs, il existe ce genre de code :
Code :
Sub WorkBook_Constructor
Construire ( Moi )
Construire ( MesFeuilles )
Construire ( MesFiches )
Construire ( MesModules )
If Exists ( Workbook_Open ) Then Workbook_Open
End Sub
Le code de construction d'une feuille :
Code :
Sub WorkBook_Constructor
Construire ( Moi )
Construire ( MesCellules )
If Exists ( WorkSheet_Open ) Then WorkSheet_Open
End Sub
Si pour une raison x ou y, l'ordre des appels n'est pas celui-là, si les fiches sont construites avant les feuilles, avant les cellules, si l'appel des xxxxx_Open n'est pas dans cette ordre, ou que sais-je encore, tu peux te retrouver dans une situation où l'un n'est pas créer alors qu'on appelle déjà.
De plus, en forçant l'affichage d'une fiche, tu demandes peut-être à ce que la fiche soit créée avant la feuille mais il faut que la feuille soit créée avant pour que ton textbox soit rempli
(Tout ceci ne vient pas du code source d'Excel - je ne l'ai pas à disposition - mais d'un avis personnel)
As-tu compris un seul mot de ce que je viens de dire ?
Non ?! Ce n'est pas grave. Je te propose une solution :