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

Problème d'affichage userform modal/non modal

2 réponses
Avatar
simulacre25
Bonjour,

Dans une application, je dispose de formulaires dont je réduit la taille via un bouton pour pouvoir accéder aux feuilles excel. Le show modal est donc à False pour pouvoir modifier et coller des données.

Un de mes formulaires non modaux (UserForm_Parametrage) fait appel à un formulaire modal (Userform_Choix_Periode) pour pouvoir saisir une donnée à effacer dans un champ en arrêtant la procédure. Sur ce formulaire intermédiaire se trouve un bouton Annuler avec le code suivant :

Application.ScreenUpdating = True

Userform_Choix_Periode.Hide
UserForm_Parametrage.Hide
Sheets("Accueil").Select
Range("H20").Select
UserForm_Parametrage.Show 1
DoEvents

End
end sub

Le souci est que si je ne force pas le réaffichage de mon formulaire avant d'arrêter la procédure en cours par le "end", le formulaire non modal ne se réaffiche pas. Seulement ensuite mon formulaire étant modal, je ne peux plus accéder aux cellules pour modification.

J'ai tenté un Unload puis un réaffichage en modal = 0 mais cela ne marche pas.

Merci de m'éclairer sur ce qui ne convient pas dans ma façon de procéder.

Bonne journée

2 réponses

Avatar
simulacre25
simulacre25 a écrit le 22/02/2011 à 14h33 :
Bonjour,

Dans une application, je dispose de formulaires dont je réduit la taille
via un bouton pour pouvoir accéder aux feuilles excel. Le show modal est
donc à False pour pouvoir modifier et coller des données.

Un de mes formulaires non modaux (UserForm_Parametrage) fait appel à un
formulaire modal (Userform_Choix_Periode) pour pouvoir saisir une donnée
à effacer dans un champ en arrêtant la procédure. Sur ce
formulaire intermédiaire se trouve un bouton Annuler avec le code
suivant :

Application.ScreenUpdating = True

Userform_Choix_Periode.Hide
UserForm_Parametrage.Hide
Sheets("Accueil").Select
Range("H20").Select
UserForm_Parametrage.Show 1
DoEvents

End
end sub

Le souci est que si je ne force pas le réaffichage de mon formulaire
avant d'arrêter la procédure en cours par le "end", le
formulaire non modal ne se réaffiche pas. Seulement ensuite mon
formulaire étant modal, je ne peux plus accéder aux cellules pour
modification.

J'ai tenté un Unload puis un réaffichage en modal = 0 mais cela
ne marche pas.

Merci de m'éclairer sur ce qui ne convient pas dans ma façon de
procéder.

Bonne journée


J'ai trouvé une solution qui fonctionne :

Au lieu d'utiliser un bouton "Annuler" autonome, j'ai placé au sein de ma sub une boite de dialogue vbOKCancel qui me permet de décharger le formulaire modal, de sortir facilement de la procédure et de réafficher mon formulaire non modal sans souci.

Sub Periode_Suppression()

Dim MonAnnee As Long
Userform_Choix_Periode.Show
MaPeriode = Sheets("Param").Range("B3").Value

Message = MsgBox("Suppression des données de la période " & MaPeriode & "", vbOKCancel)

If vbCancel = 2 Then
Unload Userform_Choix_Periode
Sheets("Accueil").Select
Range("H20").Select
UserForm_Parametrage_ALG.Show
DoEvents
Exit Sub
End If

Application.ScreenUpdating = False

'définition d'une plage de cellules contenant des données (test de la dernière cellule remplie)
Dim MaPlage As Range
Set MaPlage = Range("P1")
While Range(MaPlage.End(xlDown).Address(rowabsolute:lse, columnabsolute:lse)).Value <> ""
Set MaPlage = Range(MaPlage.End(xlDown).Address(rowabsolute:lse, columnabsolute:lse))
Wend

Dim DerLigne As Long
DerLigne = MaPlage.Row
'Supprimer les lignes contenant la période choisie
Dim Compteur As Long
For Compteur = DerLigne To 1 Step -1
If Range("P" & Compteur).Value = MaPeriode Then
Rows(Range("P" & Compteur).Row).Delete
End If
Next Compteur

Application.ScreenUpdating = True
End Sub

Voilà, si cela peut aider. En même temps des fois, je ne vois pas pourquoi je me complique la vie...
Avatar
simulacre25
simulacre25 a écrit le 22/02/2011 à 18h28 :
simulacre25 a écrit le 22/02/2011 à 14h33 :
Bonjour,

Dans une application, je dispose de formulaires dont je réduit la
taille
via un bouton pour pouvoir accéder aux feuilles excel. Le show modal
est
donc à False pour pouvoir modifier et coller des données.

Un de mes formulaires non modaux (UserForm_Parametrage) fait appel à un
formulaire modal (Userform_Choix_Periode) pour pouvoir saisir une
donnée
à effacer dans un champ en arrêtant la procédure. Sur ce
formulaire intermédiaire se trouve un bouton Annuler avec le code
suivant :

Application.ScreenUpdating = True

Userform_Choix_Periode.Hide
UserForm_Parametrage.Hide
Sheets("Accueil").Select
Range("H20").Select
UserForm_Parametrage.Show 1
DoEvents

End
end sub

Le souci est que si je ne force pas le réaffichage de mon formulaire
avant d'arrêter la procédure en cours par le "end", le
formulaire non modal ne se réaffiche pas. Seulement ensuite mon
formulaire étant modal, je ne peux plus accéder aux cellules
pour
modification.

J'ai tenté un Unload puis un réaffichage en modal = 0 mais cela
ne marche pas.

Merci de m'éclairer sur ce qui ne convient pas dans ma façon de
procéder.

Bonne journée



J'ai trouvé une solution qui fonctionne :

Au lieu d'utiliser un bouton "Annuler" autonome, j'ai placé au
sein de ma sub une boite de dialogue vbOKCancel qui me permet de
décharger le formulaire modal, de sortir facilement de la
procédure et de réafficher mon formulaire non modal sans souci.

Sub Periode_Suppression()

Dim MonAnnee As Long
Userform_Choix_Periode.Show
MaPeriode = Sheets("Param").Range("B3").Value

Message = MsgBox("Suppression des données de la période
" & MaPeriode & "", vbOKCancel)

If vbCancel = 2 Then
Unload Userform_Choix_Periode
Sheets("Accueil").Select
Range("H20").Select
UserForm_Parametrage_ALG.Show
DoEvents
Exit Sub
End If

Application.ScreenUpdating = False

'définition d'une plage de cellules contenant des données (test
de la dernière cellule remplie)
Dim MaPlage As Range
Set MaPlage = Range("P1")
While Range(MaPlage.End(xlDown).Address(rowabsolute:lse,
columnabsolute:lse)).Value <> ""
Set MaPlage = Range(MaPlage.End(xlDown).Address(rowabsolute:lse,
columnabsolute:lse))
Wend

Dim DerLigne As Long
DerLigne = MaPlage.Row
'Supprimer les lignes contenant la période choisie
Dim Compteur As Long
For Compteur = DerLigne To 1 Step -1
If Range("P" & Compteur).Value = MaPeriode Then
Rows(Range("P" & Compteur).Row).Delete
End If
Next Compteur

Application.ScreenUpdating = True
End Sub

Voilà, si cela peut aider. En même temps des fois, je ne vois pas
pourquoi je me complique la vie...


Un correction au code pour que cela fonctionne correctement (j'avais oublié de définir en variable la réponse à ma question afin de continuer ou non) :

Dim Message As Long
Message = MsgBox("Suppression des données de la période " & Maperiode & "", vbYesNo, "Wyrd")


If Message = vbNo Then
Unload Userform_Choix_Periode
Sheets("Accueil").Select
Range("H20").Select
UserForm_Parametrage_ALG.Show
DoEvents
Exit Sub
End If

Bonsoir