Problème d'affichage sur un UserForm [VBA-Excel 2003]

Messages postés
12
Date d'inscription
jeudi 13 août 2009
Statut
Membre
Dernière intervention
3 mai 2013
- - Dernière réponse : ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 3 mai 2013 à 08:46
Bonjour à tous !


Ca fait longtemps que je m'aide de ce forum pour résoudre mes problèmes en codage VBA et à chaque fois j'ai trouvé la réponse ! Mais aujourd'hui bin... je n'ai pas trouvé ^^

Voici mon souci :

Je possède un formulaire de "Menu principal" à partir duquel j'ouvre d'autres formulaire qui correspondent à l'action désirée (saisie, modification...). Tous fonctionnent, je peux les ouvrir en cliquant sur un bouton puis les fermer via la "petite croix en haut à gauche" pour revenir au menu aucuns soucis. Sauf qu'il y a un vilain petit canard dans le lot !

Le vilain petit canard:

C'est un formulaire de recherche qui est simplement composé d'une SpreadSheet. Lors de la première ouverture tout va bien il copie les données de la base sans soucis (cette action de copie est contenu dans le UserForm_Initialize). On peut faire son travail puis le fermer pour revenir au menu principal.
Mais la si depuis le menu on veut le ré-ouvrir une deuxième fois.. Aucune procédure ne s'exécute et le formulaire s'affiche comme "figé" (en plus la copie ne s'est pas faite et tout est vide) et je ne peux même plus le fermer via la petite croix. Après l'après-midi d'hier consacrée a chercher toutes les méthodes différentes pour l'ouvrir a chaque fois comme si c'était la première fois.. Je n'ai toujours pas trouvé de solution. Je vous joins trois bouts de code qui permettent la navigation entre les formulaires. (Je suis très limité en diffusion et je ne peux pas tout vous montrer...)

V2_Menu Clic sur bouton du formulaire de recherche:
 Private Sub CommandButton2_Click()
    Me.Hide
    V2_Recherche.Show
End Sub



V2_Recherche Initialisation et copie :
Public Sub UserForm_Initialize()
Spreadsheet1.Sheets("Feuille1").Range("A1:IV65536").ClearContents
'Recopie les enregistrements de la base dans la spreadsheet de recherche
Sheets("Base").Activate
N = WorksheetFunction.CountA(Range(Cells(1, 10), Cells(65536, 10)))
For Ligne = 1 To N + 1
 If Sheets("Base").Cells(Ligne, 25) = False Then
    Spreadsheet1.Cells(Ligne, 1) = Sheets("Base").Cells(Ligne, 16)
    Spreadsheet1.Cells(Ligne, 2) = Sheets("Base").Cells(Ligne, 17)
    Spreadsheet1.Cells(Ligne, 3) = Sheets("Base").Cells(Ligne, 18)

    Spreadsheet1.Cells(Ligne, 4) = Sheets("Base").Cells(Ligne, 10)
    Spreadsheet1.Cells(Ligne, 5) = Sheets("Base").Cells(Ligne, 11)
    Spreadsheet1.Cells(Ligne, 6) = Sheets("Base").Cells(Ligne, 12)
    Spreadsheet1.Cells(Ligne, 7) = Sheets("Base").Cells(Ligne, 13)
    Spreadsheet1.Cells(Ligne, 8) = Sheets("Base").Cells(Ligne, 14)
    Spreadsheet1.Cells(Ligne, 9) = Sheets("Base").Cells(Ligne, 15)
    Spreadsheet1.Range("J1").Value = "Date d'acceptation"
    If Sheets("Base").Cells(Ligne, 3) <> "" And Ligne > 1 Then
    Spreadsheet1.Cells(Ligne, 10) = CStr(Sheets("Base").Cells(Ligne, 3))
    End If
  End If
Next Ligne

Spreadsheet1.Worksheets("Feuille1").Columns.AutoFit
Spreadsheet1.Worksheets("Feuille1").Range("A1:IV1").Font.Bold = True

End Sub


V2_Recherche Sur fermeture du formulaire :
Private Sub UserForm_Terminate()
V2_Menu.Show
Unload V2_Recherche
End Sub


Le pire c'est que j'ai pratiquement le même code pour tous les formulaires et ca fonctionne mais pas là. Peut être est-ce dû au SpreadSheet qui est un contrôle ActiveX ... J'en ai aucune idée..

Voilà si vous avez une idée elle sera la bienvenue ! Même les trucs les plus débiles, j'ai peut-être oublié un truc tout con mais la je vois pas ^^

Merci à ceux qui auront pris le temps de lire et de répondre !

Eltinquen

P.S: Si ce n'est pas le bon thème et/ou le bon endroit pour poster merci de me le signaler.
Afficher la suite 

11 réponses

Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Bonjour,
Il t'a déjà été dit que tu ne développe pas en VB.Net et tui cvontinues à ouvrir une discussion VBA dans la section :
Forum > VB.NET et VB 2005

Bon... J'attendrai donc, pour te lire, qu'un administrateur bienveillant ait déplacé ta discussion. Tu n'auras rien gagné à continuer à être "léger" dans le choix du thème.
Désolé, mais c'est ainsi.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
Messages postés
12
Date d'inscription
jeudi 13 août 2009
Statut
Membre
Dernière intervention
3 mai 2013
0
Merci
Salut,

Oui mais malheureusement dans le choix du thème il n'y a pas de section VBA... j'ai seulement le choix entre VB.net et VB6. Et il est bien spécifié que c'est du VBA ... Bref désolé pour l'avoir encore mal placé...

Sinon ne t'excuse pas c'est normal je préfére qu'on me le dise que de rester ignorant ^^
Commenter la réponse de eltinquen
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
0
Merci
Le lien VBA est plus bas dans la liste

Est-ce que tu "Unload" le formulaire en question ou tu le "Hide" ?


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Commenter la réponse de cs_MPi
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Je vois qu'un administrateur bienveillant a déplacé ta discussion. A toi de regarder (et de retenir) la section dans laquelle elle a été déplacée (Tu vois bien qu'elle existe, hein ...)


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
Messages postés
12
Date d'inscription
jeudi 13 août 2009
Statut
Membre
Dernière intervention
3 mai 2013
0
Merci
Salut,

D'abord merci à l'admin d'avoir déplacé mon sujet. Oui en effet il existe mais sur le coup je ne l'avait pas vu... bref

V2_Recherche est fermé par Unload. Mais je ne vois toujours pas pourquoi lors d'un deuxième ouverture il ne passe pas par UserForm_Initialize.. et surtout pourquoi il fige comme ca ..

Je pense à un problème avec ActiveX vu que les autres formulaires n'ayant pas de SpreadSheet n'on pas le problème.
Commenter la réponse de eltinquen
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
0
Merci
Il est possible qu'on ne voit pas tout le code...
Est-ce que la colonne Y a toujours des valeurs = "FAUX" après le 1er passage ?


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Commenter la réponse de cs_MPi
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Re-coucou .
Je ne travaille pas avec spreadsheets, mais tu nous expliques que ce n'est pas un objet Excel.
Dès lors : et uniquement si accepte l'automation ===>> une ligne comme celle-ci :
Spreadsheet1.Cells(Ligne, 1) = Sheets("Base").Cells(Ligne, 16)

ne peut fonctionner que si un objet Spreadsheet1 a été créé (que ce soit en liaison tardive ou en cochant une référence)
Cette phrase retient par ailleurs mon attention :
Le pire c'est que j'ai pratiquement le même code pour tous les formulaires et ca fonctionne mais pas là

Dans le même classeur ou dans d'autres ?
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Ah. Je viens de voir, en cherchant, que ce peut être également un des composants de Microsoft Office Web Components 9.0. (et donc un activex, comme tu le dis)
La référence Microsoft Office Web Components 9.0. a-elle bien été cochée ?
Je pense que oui, puisque tu écris que marche une première fois, mais pas une seconde fois.
C'est alors peut-être tout simplement dû au choix que tu as fait de l'évènement (Initialize). Essaye de mettre ce code dans l'évènement Activate, plutôt).
L'évènement Initialize ne se produit qu'au chargement de ton userform, avant même son affichage.
L'événement Activate se produit/reproduit par contre chaque fois que ton userform devient/redevient actif


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Fais l'expérience suivante, qui te fera mieux comprendre :
Sur une feuille de calcul, un bouton de commande et ce code :
Private Sub CommandButton1_Click()
  UserForm1.Show
End Sub


sur un userform1 ; un bouton de commande et ce code :
Private Sub UserForm_Activate()
  MsgBox "je passe par activate"
End Sub

Private Sub UserForm_Initialize()
  MsgBox "jue passe par initialize"
End Sub
Private Sub CommandButton1_Click()
 Me.Hide
End Sub

L'évènement initialize ne se produira qu'une seule fois (la toute première) et ne se reproduira plus après avoir affiché userform1 et cliqué sur son bouton
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
Messages postés
12
Date d'inscription
jeudi 13 août 2009
Statut
Membre
Dernière intervention
3 mai 2013
0
Merci
Salut!

@MPi : Tout le code est la le reste n'est pas en rapport avec l'initialisation du formulaire. Ce ne sont que des contrôles de saisie et d'ouverture d'autres formulaires.

@ucfoutu : Oui comme tu dis c'est bien un contrôle Microsoft Office Web Components 9.0. La référence est bien cochée et cela fonctionne toujours du premier coup mais tjr pas au deuxième... J'ai fait ta petite expérience, d'ailleurs sur le coup je me suis dit "Bhin oui pourquoi j'y ai pas pensé!". Mais finalement ca ne fonctionne pas .. Quand j'ai fait ta petite expériance j'ai fermé UserForm1 via la petite croix de fermeture de fenetre windows. Ce qui fait passer le code via UserFom_Terminate. Est-ce que le spreadsheet pourrait ne pas aprécier cette méthode ?

Car en effet si j'utilise un bouton avec la méthode "Hide" le formulaire passe bien par Activate seul si je le rappelle. En revanche en passant par une fermeture via la croix rouge, il repasse par initialize et par activate.

Le truc c'est que ce formulaire contient beaucoup de données et n'ayant des bêtes de courses pour utiliser cet utilitaire il faut libérer un maximum de place memoire. C'est donc pourquoi je n'utilise pas juste la méthode "Hide" qui ne fait que cacher le formulaire mais le garde en memoire. De plus les données étant mises à jour très rapidement il faut qu'a chaque ouverture le spreadsheet se remette à jour.

Je ne sais pas si je suis asser clair dans mes explications :/


Merci

Eltinquen
Commenter la réponse de eltinquen
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Hé bien ! N'utilise alors tout simplement pas le Hide ! C'est lui, qui est responsable d'un non redéclenchement du Initialize !
Décharge donc par unload systématiquement et le prochain show passera par initialize !

Ceci étant dit :
1) tes explications finissent par se contredire en matière de finalités ...
2) ton économie de mémoire n'en est pas une réelle. J'utiliserais à ta place le Hode et l'évènement Activate et interdirais de fermer par la croix
3) rien ne t'empêche d'utiliser les deux évènements et de n'exécuter le second que si pas exécuté par le 1er ! (une simple booléenne suffirait).
Allez ===>> en route les méninges.



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu