Microsoft 365 [RESOLU]UserForm qui revient à la fermeture d'un classeur, du fait le classeur se bloque et il faut fermer manuellement l'UserForm

  • Initiateur de la discussion Initiateur de la discussion Marboi
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Marboi

XLDnaute Occasionnel
Bonjour à tous, j'avais déjà un souci pour enregistrer un classeur contenant des macros avec un nouveau nom en xlsx. Fanch55 (que je remercie encore) m'a modifié complètement ma macro et cela fonctionne bien. J'ai voulu aller un peu plus loin en y intégrant un UserForm pour la saisie de la date à un format précis et cela fonctionne. Le classeur s'enregistre bien avec le nouveau nom, seulement le classeur contenant la macro ne se ferme pas car le UserForm revient à l'écran. J'appelle ce UserForm par la fonction show dans ThisWorkbook. J'ai essayé d'inclure dans la macro UserForm1.Delete mais ça ne marche pas.
Auriez-vous une solution, classeur joint, merci par avance, cordialement.
 

Pièces jointes

Solution
Tant qu'on y est 😁 comment faire pour valider le bouton validation par la touche "entrée" ?
Proposition de code complet pour le UserForm :
VB:
Public OK As Boolean

Private Sub CommandButton1_Click()
    Controle
    If Not OK Then
        MsgBox "La date saisie n'est pas valide"
        Exit Sub
    End If
    Sheets("Feuil1").Range("I3") = CDate(TextBox1)
    Unload Me
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim Val As Byte
    'Limiter le nb caracteres maxi dans textbox
    TextBox1.MaxLength = 5
    'Mettre un slash automatiquement 00/00/0000
     Val = Len(TextBox1)
     If Val = 2 Then TextBox1 = TextBox1 & "/"
    If KeyCode = 13 Then
        Controle...
Bonjour,
Essaie de mettre l'ouverture du UserForm dans une fonction Aut😵pen() plutôt quand dans le module ThisWorkbook.
VB:
Sub auto_open()
    UserForm1.Show
End Sub

J'ai pas bien compris pourquoi tu faisais un Workbooks.Open(WbName) mais cette instruction ne devrait pas générer un UserFomr1.Show car l'Aut😵pen() ne s'applique qu'aux ouvertures manuelles contrairement au Thisworkbook.Workbook_open().
 
Dernière édition:
Bonjour à tous, j'avais déjà un souci pour enregistrer un classeur contenant des macros avec un nouveau nom en xlsx. Fanch55 (que je remercie encore) m'a modifié complètement ma macro et cela fonctionne bien. J'ai voulu aller un peu plus loin en y intégrant un UserForm pour la saisie de la date à un format précis et cela fonctionne. Le classeur s'enregistre bien avec le nouveau nom, seulement le classeur contenant la macro ne se ferme pas car le UserForm revient à l'écran. J'appelle ce UserForm par la fonction show dans ThisWorkbook. J'ai essayé d'inclure dans la macro UserForm1.Delete mais ça ne marche pas.
Auriez-vous une solution, classeur joint, merci par avance, cordialement.
Bonjour,
Modifiez 'Module2' comme ça :
VB:
Sub Sauvegarde()
Dim NameNew As String, WbName As String, Wb As Workbook

    With Sheets("Feuil1")
        If .[I1] = "" Then Exit Sub
        WbName = ThisWorkbook.FullName ' nom du classeur en cours
        Application.DisplayAlerts = False
        NameNew = .[I1] & ".xlsx"
    End With
    ThisWorkbook.SaveAs Path & NameNew, xlWorkbookDefault
    ThisWorkbook.Saved = True
    Application.Quit

End Sub
Cordialement,
 
Merci Dudu2 & Gégé 45550, pour Dudu2, je dois la placer où la fonction auto_open(), dans le module 2 ça ne fonctionne pas ! Pour Application.Quit, c'est pas trop gênant car il n'y a généralement qu'un classeur ouvert. Pour Gégé 45550, ça fonctionne bien, j'ai juste ajouté ActiveSheet.[Button 2].Delete pour ne plus l'avoir sur la sauvegarde.

VB:
Sub Sauvegarde()
Dim NameNew As String, WbName As String, Wb As Workbook

    With Sheets("Feuil1")
        If .[I1] = "" Then Exit Sub
        WbName = ThisWorkbook.FullName ' nom du classeur en cours
        Application.DisplayAlerts = False
        NameNew = .[I1] & ".xlsx"
        ActiveSheet.[Button 2].Delete
    End With
    ThisWorkbook.SaveAs Path & NameNew, xlWorkbookDefault
    
    ThisWorkbook.Saved = True
    Application.Quit

End Sub

Ce que je ne comprends pas, c'est pourquoi je devais auparavant faire un clear sur les .Range et pas dans ta macro. En tout cas, merci à vous deux.
Code:
Set Wb = Workbooks.Open(WbName)
'    With Wb.Sheets("Feuil1")
'        .Range("B8:F32").ClearContents
'        .Range("I3:I4").ClearContents
'        .Range("I8:I32").ClearContents
'        .Range("I3").Select
'        .Parent.Save
'        .Parent.Close
'    End With
'
'    ThisWorkbook.Save

Tant qu'on y est 😁 comment faire pour valider le bouton validation par la touche "entrée" ?

Encore merci.
 
Ce que je ne comprends pas, c'est pourquoi je devais auparavant faire un clear sur les .Range et pas dans ta macro. En tout cas, merci à vous deux.
Code:
Set Wb = Workbooks.Open(WbName)
'    With Wb.Sheets("Feuil1")
'        .Range("B8:F32").ClearContents
'        .Range("I3:I4").ClearContents
'        .Range("I8:I32").ClearContents
'        .Range("I3").Select
'        .Parent.Save
'        .Parent.Close
'    End With
'
'    ThisWorkbook.Save

Tant qu'on y est 😁 comment faire pour valider le bouton validation par la touche "entrée" ?

Encore merci.
Re
Puisqu'on ne sauvegarde que le fichier modifié sans toucher à l'original qu'on referme sans le sauvegarder, on n'a pas besoin de nettoyer les Range. On retrouvera toujours l'original dans son état initial.
Cdlt
 
Merci Gégé 45550, une petite idée pour une validation de l'userform par la touche entrée (validation) ?
Pour Dudu2, effectivement ça fonctionne, mais je l'avais placé AVANT Option Explicit. Là je l'ai placé après et ça marche, désolé ! Pareil, une petite idée pour valider l'userform par la touche entrée (validation)?

Merci à vous deux de vos précieuses informations
 
Tant qu'on y est 😁 comment faire pour valider le bouton validation par la touche "entrée" ?
Proposition de code complet pour le UserForm :
VB:
Public OK As Boolean

Private Sub CommandButton1_Click()
    Controle
    If Not OK Then
        MsgBox "La date saisie n'est pas valide"
        Exit Sub
    End If
    Sheets("Feuil1").Range("I3") = CDate(TextBox1)
    Unload Me
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim Val As Byte
    'Limiter le nb caracteres maxi dans textbox
    TextBox1.MaxLength = 5
    'Mettre un slash automatiquement 00/00/0000
     Val = Len(TextBox1)
     If Val = 2 Then TextBox1 = TextBox1 & "/"
    If KeyCode = 13 Then
        Controle
        If OK Then
            Sheets("Feuil1").Range("I3") = CDate(TextBox1)
            Unload Me
        Else
            Exit Sub
        End If
    End If
End Sub

Sub Controle()
Dim Mois As Integer, Annee As Integer, Pos As String
    OK = False
    Pos = IIf(TextBox1 <> "", Mid(TextBox1, 3, 1), "*")
    If Pos <> "/" Then GoTo invalide
    If Len(TextBox1) < 5 Then GoTo invalide
    Mois = CInt(Left(TextBox1, 2))
    If Mois < 1  Or Mois > 12 Then GoTo invalide
    Annee = CInt(Right(TextBox1, 2))
    If Annee < 20 Or Annee > 50 Then GoTo invalide
    OK = True
    Exit Sub
invalide:
    Application.EnableEvents = False
    TextBox1.Value = ""
    MsgBox "La date saisie n'est pas valide"
    Application.EnableEvents = True
End Sub

Private Sub UserForm_Activate()
    OK = False
End Sub
Cdlt
 
Dernière édition:
Bonjour,

A tester
VB:
Option Explicit

Const Path As String = "K:\Mes documents\Temp\"

Sub Sauvegarde()
    Dim ws As Worksheet: Set ws = Sheets("Feuil1")
    Dim baseName As String: baseName = Trim(ws.Range("I1").Value)
    Dim originalPath As String: originalPath = ThisWorkbook.FullName
    Dim shp As Shape

    If baseName = "" Then Exit Sub

    Application.DisplayAlerts = False
    ThisWorkbook.SaveAs Path & baseName & ".xlsx", xlOpenXMLWorkbook

    For Each shp In ws.Shapes
        If shp.Name = "Button 2" Then shp.Delete: Exit For
    Next

    With Workbooks.Open(originalPath).Sheets("Feuil1")
        .Range("B8:F32,I3:I4,I8:I32").ClearContents
        .Range("I3").Select
        .Parent.Save
        .Parent.Close False
    End With

    ' Fermer le UserForm si ouvert
    On Error Resume Next
    Unload UserForm1 ' Remplace par le nom réel de ton UserForm
    On Error GoTo 0

    ThisWorkbook.Save
    Application.Quit
End Sub

Nicolas
 
Bonjour,

Question que je pose à chaque fois et à laquelle je n'ai jamais de réponse : si le classeur "Rt Km. test.xlsm" ne sert que de modèle pour créer d'autres classeurs, pourquoi ne pas simplement utiliser... un modèle ?
Bonjour, je ne suis pas sûr que la personne qui remplira le modèle fasse la sauvegarde au bon endroit avec les bons intitulés. Il faudra toujours la macro de sauvegarde, à moins que vous n'ayez une autre idée.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour