2010-12-09 59 views
1

J'ai actuellement construit un outil dans Excel 2003 qui affiche une série de formulaires de saisie de données. Le client a demandé qu'il y ait des boutons «Formulaire précédent» et «Formulaire suivant» sur les formulaires.Ouverture répétée de formulaires utilisateur à partir d'un userform - provoque des problèmes d'objet

Le code utilisé pour se déplacer entre les formes est la suivante

Sub NextForm(strFormName As String) 
    Dim intCurPos As Integer 
    Dim strNewForm As String 

    'Find out which form we are currently on from a list in a range 
    intCurPos = WorksheetFunction.Match(strFormName, Range("SYS.formlist"), 0) 
    If intCurPos = WorksheetFunction.CountA(Range("SYS.formlist")) Then 
     'We want to use the first one 
     intCurPos = 0 
    End If 

    'Get the name of the form to open 
    strNewForm = WorksheetFunction.Index(Range("SYS.formlist"), intCurPos + 1) 
    'Load the form into the Userforms Collection 
    Set newForm = VBA.UserForms.Add(strNewForm) 
    'Show the form 
    newForm.Show 
End Sub 

La question que j'ai est que lorsque vous faites cela 25 fois (oui je sais) le système se bloque. Je me rends compte que c'est parce que chaque fois que vous arrivez à la ligne newForm.Show ci-dessus le code ne se termine pas et reste donc en mémoire.

Les formulaires sans modèle arrêteraient ce problème mais l'utilisateur pourrait alors charger d'autres formulaires et faire d'autres choses qui pourraient causer des problèmes majeurs.

Quelqu'un a-t-il des suggestions pour vous aider? D'une manière ou d'une autre, pour forcer l'exécution du code, mais ne pas arrêter la capacité modale du formulaire?

Plan rapproché mais appréciez toute aide.

+0

Les 25 formulaires doivent-ils être ouverts? Avez-vous essayé de décharger un formulaire, puis ouvrez le suivant? – CaBieberach

+0

Avez-vous envisagé d'utiliser le contrôle MultiPage sur votre userform, c'est-à-dire de charger un userform et d'utiliser Next et Back pour parcourir les onglets sur MultiPage ... –

+0

@CaBieberach: Chaque formulaire est déchargé avant l'ouverture du suivant. Cependant le point de code où le traitement s'est arrêté pour le Formulaire 1 reste en mémoire, et ainsi de suite pour les autres 24. Ce n'est que lorsque le formulaire final est fermé qu'Excel revient pour exécuter le code (qui est dans ce cas un Exit Sub) . –

Répondre

1

Peut-être que vous devriez changer votre approche.

je suggère ce qui suit:

Dans la principale utilisation du module une boucle pour cycle ouvert la forme et la boucle à chaque fois que la presse utilisateur sur le bouton « formulaire suivant ».

'This sub in your main Module 
sub ShowAndCyleForms 
    Dim FormName As String 
    Dim MyForm as Object 
    Dim CloseForm as Boolean 

    FormName = "frmMyForm"   

    do while CloseForm=False 
     set MyForm = VBA.UserForms.Add(FormName)   
     MyForm.Show 
     CloseForm=MyForm.CloseStatus 
     FormName=MyForm.strNewForm 
     Unload MyForm 
     Set MyForm = Nothing 
    loop 

end sub 

sous toutes ses formes, déclare:

Public CloseStatus as Boolean 
Public strNewForm as String 

Dans tous les "Form Next" bouton, mettre quelque chose comme:

Private Sub btnNextForm_Click() 
    CloseStatus=False 
    strNewForm= NextForm(Me.Name) 
    Me.Hide 
End Sub 

Modifier votre sous pour être une fonction qui delievers la prochaine Nom du formulaire

Sub NextForm(strFormName As String) 
    Dim intCurPos As Integer 

    'Find out which form we are currently on from a list in a range 
    intCurPos = WorksheetFunction.Match(strFormName, Range("SYS.formlist"), 0) 
    If intCurPos = WorksheetFunction.CountA(Range("SYS.formlist")) Then 
     'We want to use the first one 
     intCurPos = 0 
    End If 

    'Get the name of the form to open 
    NewForm = WorksheetFunction.Index(Range("SYS.formlist"), intCurPos + 1) 
    ' 
End Sub 

Vous wi ll devra également modifier votre O.K. juste cacher le formulaire au lieu de le décharger et de mettre le CloseStatus à true.

L'idée est de contrôler tous vos formulaires de chargement/déchargement de l'extérieur de l'en une seule procédure.

Espérons que c'est assez clair.

+0

cela ressemble à une excellente solution - avez-vous testé pour voir si la mémoire est conservée et s'il y a une limite supérieure sur le processus de bouclage avant qu'il ne se bloque? – SpyJournal

+0

Merci. Cela ressemble à un bon début. Je vais faire un test pour voir comment ça se passe mais je ne peux pas voir un problème d'un coup d'oeil initial. –

+1

Tout d'abord, merci encore pour cela. Je l'ai mis dans un cas de test et cela fonctionne comme il se doit. Brillant. Une note pour ceux qui viennent à ce plus tard - dans le btnNextForm_Click, le CloseStatus = True devrait être CloseStatus = False. Vous ne voulez définir CloseStatus = True que lorsque vous ne souhaitez plus afficher de formulaire. Bravo :) –