Modifier le texte d'un MsgBox

Bonjour à tous,

Question toute bête : je voudrais personaliser le texte qui apparaît dans un message d'erreur
En construisant une nouvelle feuille dans mon WorkBook et surtout en lui donnant un nom qui existe déjà parmi ses feuilles, j'obtiens tout naturellement le message d'erreur suivant

image

Pour qu'il n'y ai aucune ambiguïté avec ce message je désire le remplacer par

Cette feuille existe déjà

Je vous propose de supprimer la feuille que vous êtes en train de construire ?

Comment procéder ?

mon fichier

9suppresson.xlsm (25.14 Ko)

Merci

Salut @Jacky,

Ah tu demandes quelque chose d'un peu compliqué cette fois-ci, c'est la gestion d'erreur customisée. Il faut faire très attention par contre à bien comprendre ce que l'on fait car on risque de se retrouver avec un programme bugué si on ne gère pas bien nous-même l'erreur.

En l'occurrence ici il y a 1 erreur : une feuille existe déjà avec ce nom, et deux issues possibles :

  • Ou bien tu veux supprimer la feuille
  • ou bien, (je suppose, mais tu ne l'as pas indiqué et c'est très important) on lui laisse son nom par défaut/on fait ce que l'on veut, mais il faut faire quelque chose !!

Dans le code ci-dessous j'ai choisi de lui laisser son nom par défaut. Je te laisse le lire j'ai mis des commentaires, l'idée c'est de vérifier la variable Err object | Microsoft Learn, dont la propriété .Number devient > 0 quand le code rencontre une erreur. En la testant on peut donc observer si une erreur a eu lieu, et le cas échéant la traiter.

Il est bon d'encadrer le stricte minimum du code avec "On Error Resume Next" de manière à vraiment gérer que ce que l'on a prévu.

Si tu as des questions n'hésite pas.

Private Sub CommandButton1_Click()

  Dim Modele As Worksheet: Set Modele = Worksheets("Feuil1")
  Modele.Copy After:=Sheets(Sheets.Count)

  ' c'est ici qu'on va lever l'erreur, donc on met on error resume next pour ne pas arreter le programme
  On Error Resume Next
  ActiveSheet.Name = "essai"

  ' gestion d'erreur custom
  If Err.Number > 0 Then
    Dim choixUtilisateur As Boolean
    choixUtilisateur = MsgBox("Cette feuille existe déjà" & _
      vbCrLf & "Je vous propose de supprimer la feuille que vous êtes en train de construire ?", _
      vbOKCancel + vbExclamation, "Erreur customisée") = vbOK

    If choixUtilisateur Then
      ' on désactive les alertes autrement lors de la suppression de la feuille on va retrouver le message d'erreur
      Application.DisplayAlerts = False
      ActiveSheet.Delete
      Application.DisplayAlerts = True
    Else
      ' on laisse le nom non modifié
    End If

    ' on nettoie l'erreur
    Err.Clear
  End If

  ' on a géré l'erreur, on repasse en mode normal
  On Error GoTo 0
End Sub

Bonjour Saboh,

Et oui je me doutais que ma question n'allait pas être des plus simples

J'ai regardé ton code qui évidemment est, comme à chaque fois, plus que correct
Le message d'erreur que tu as construit est cette fois ci explicite, et tu évites le message d'erreur qui accompagne une suppression de feuille. C'est parfait, ça répond exactement à ma question.
Mais, qu'est qu'une erreur customisée ?

Un grand merci une fois de plus et au plaisir

Salut @Jacky,

Dans le cas présent j'ai mal choisi mes mots, tu ne fais pas exactement des erreurs personnalisées (ou customisées) mais ça s'en approche.

L'idée des erreurs personnalisées c'est que tu peux, toi, lever une erreur (faire planter VBA si tu préfères). Ca se fait avec Err.Raise en VBA. Bon toi en réalité tu cherchais plutôt à gérer l'erreur que la lever/déclencher. Je t'ai expliqué comment faire.

Pour répondre quand même à ta question, une erreur personnalisée ça va être une erreur que tu créés, qui va se lancer si tu sais que la suite du code va planter. Un exemple simple : On demande à l'utilisateur de rentrer un nombre entre 2 bornes et il en entre un plus grand.

 
Sub test()
  Dim val as String
  val = InputBox("Entrez un nombre entre 1 et 10")

  ' si l'utilisateur a entré un nombre > 10, je ne veux pas exécuter la suite du programme
  ' donc je peux créer une erreur custom comme ceci 

  Dim num As Double
  num = CDbl(val)

  If num > 10 Then
    Err.Raise -10000000, ,"Vous avez entré un nombre non valide"
  Else
    Debug.Print "tout va bien"
  End If
End Sub

Merci beaucoup

Oui je veux gérer l'erreur et non la déclencher
Cette erreur est la conséquence d'une manip, elle est accompagnée d'un message et ce message ne me convient pas. Donc il s'agit bien d'une gestion
Je me disais aussi que j'aurais pu éviter l'apparition de ce message qui ne me convient pas dans le cas de fiigure que je traite, en utilisant

Application.DisplayAlerts = False

C'est un plaisir de communiquer avec toi car tu es toujours très expliciite et complet dans tes explications
Bonne sooirée

Plaisir partagé.

Bonne soirée à toi aussi, n'oublie pas de clôturer

Bonsoir @ vous deux,

une autre approche : test avant la création de la feuille.
Une des possibilité et d'essayer de récupérer un objet Range de la feuille portant le nom à tester.

Si cette récupération provoque une erreur = la feuille n'existe pas = on peut créer la feuille.
Si cette récupération ne provoque pas d'erreur = la feuille existe = on ne crée pas la feuille.

Le code :

Function TestExist(LeNom As String) As Boolean
    Dim Cel As Range
    ' mise en place de la gestion d'erreur
    On Error Resume Next
    ' ici on essaie de récupérer l'objet Range cellule A1 de la feuille portant le nom à tester
    Set Cel = Sheets(LeNom).Range("A1")
    ' si cela provoque une erreur c'est que la feuille n'existe pas
    ' on vide le journal d'erreur, on passe la fonction à FAUX et on quitte
    If Err.Number <> 0 Then Err.Clear: TestExist = False: Exit Function
    ' sinon c'est que la feuille existe
    ' on passe la fonction à VRAI
    TestExist = True
End Function

Sub LRD()
    Dim LeNom As String
    ' on récupère le nom voulu de la futur feuille qui se trouve en cellule A1
    LeNom = ActiveSheet.Range("A1")
    ' on teste si la feuille avec le nom de la cellule A1 existe
    ' si c'est le cas, on affiche l'information et on quitte
    If TestExist(LeNom) Then MsgBox ("Feuille existante"): Exit Sub
    ' sinon on peut créer la feuille, on la positionne en dernière position et on lui donne le nom de la cellule A1
    Worksheets.Add(After:=Sheets(Sheets.Count)).Name = LeNom
End Sub

Le fichier :

@ bientôt

LouReeD

Bonsoir LouReed,

Je comprends très bien ton code qui en définitive repose sur le fait que tu te reposes sur la récupératon d'un objet Range qui doit ou non coîncider avec le nom de la feuille à construire. Mais cela t'oblige à laisser "trainer dans un coin de ta feuille" le nom de celle que tu désires construire
C'est une idée
Quant à moi j'ai désiré simplifier mon problème en refusant les alertes et en imposant mon propre message d'erreur (solution minimaliste du fainéant que je peux être parfois), mais je reconnais que ton idée à un sens.
Bonne soirée à toi et au plaisir

Bonsoir,

le range("A1") n'est là que pour le test, le nom d'une feuille peut venir d'où vous voulez, dans votre code "Feuil1" est écrit en dur...

Sinon vous avez les InputBox afin de donner la main à l'utilisateur pour modifier le nom de la feuille à créer si celui "d'origine" est déjà créer.
Une boucle de test de présence de feuille est là afin que le nom proposé par l'utilisateur soit valable.

Le code :

Sub BoutonLRD()
    Dim LeNom As String, Ok As Boolean
    ' on récupère le nom voulu de la futur feuille qui se trouve en cellule A1
    LeNom = "essai"
    ' on lance une boucle indéterminée
    Do
        ' on rend la main à l'application
        DoEvents
        ' si la feuille existe
        If TestExist(LeNom) Then
            ' on demande un nouveau nom, ou d'annuler la procédure
            LeNom = InputBox("Le nom de feuille "" " & LeNom & " "" existe déjà." & Chr(10) & _
                "Veuillez indiquer un nouveau nom ou Annuler pour stopper la procédure", "Feuille existante - Modification du nom", LeNom)
        ' sinon la feuille n'existe pas
        Else
            'on passe la variable OK à VRAI pour sortir de la boucle indéterminée
            Ok = True
        End If
    ' on boucle tant que OK est égale à FAUX
    Loop While Ok = False
    ' si LeNom est égal à rien, l'oppération a été annulée, on quitte
    If LeNom = "" Then Exit Sub
    ' sinon on peut créer la feuille avec le nom proposé en copiant la feuil1
    Worksheets("Feuil1").Copy After:=Sheets(Sheets.Count)
    ActiveSheet.Name = LeNom
End Sub
Function TestExist(LeNom As String) As Boolean
    Dim Cel As Range
    ' mise en place de la gestion d'erreur
    On Error Resume Next
    ' ici on essaie de récupérer l'objet Range cellule A1 de la feuille portant le nom à tester
    Set Cel = Sheets(LeNom).Range("A1")
    ' si cela provoque une erreur c'est que la feuille n'existe pas
    ' on vide le journal d'erreur, on passe la fonction à FAUX et on quitte
    If Err.Number <> 0 Then Err.Clear: TestExist = False: Exit Function
    ' sinon c'est que la feuille existe
    ' on passe la fonction à VRAI
    TestExist = True
End Function

Le fichier :

@ bientôt

LouReeD

Rechercher des sujets similaires à "modifier texte msgbox"