Gestion des erreurs avec une application.inputbox qui enregistre un Array

Bonjour,

J'ai un problème avec mon code qui concerne la gestion des erreurs (quand je clique sur le bouton cancel ou sur la croix du haut à droite de l'inputbox) avec une application.inputbox lors de l'enregistrement d'un Array :

Option Explicit

Sub Try1()

Dim ARR1() As Variant
Dim i As Long
Dim RNG1 As Range
Dim ANSWER1 As VbMsgBoxResult

ThisWorkbook.Worksheets("Sheet10").Select

StartAgain1:

25book12.xlsm (76.44 Ko)

On Error GoTo Handler1
ARR1 = Application.InputBox(prompt:="Select the Range that you want to pass in the Array.", Type:=64)
On Error GoTo 0

For i = LBound(ARR1, 1) To UBound(ARR1, 1)
ARR1(i, 1) = Int(ARR1(i, 1) / 60) & "h " & ARR1(i, 1) Mod 60 & "mn"
Next

Set RNG1 = Application.InputBox(prompt:="Select the cell that will serve as the first cell of the array.", Type:=8)

Range(RNG1, RNG1.Offset(UBound(ARR1, 1) - 1, 0)) = ARR1

Handler1:
If Err.Number = 13 Then
ANSWER1 = MsgBox(prompt:="Do you want to retry?", Title:="JMC Inc.", Buttons:=vbYesNo + vbQuestion)
If ANSWER1 = vbYes Then
GoTo StartAgain1
Else
Exit Sub
End If
End If

Erase ARR1

End Sub

Lorsque je clique lors du premier passage sur le bouton "Cancel" de mon inputbox, mon code passe bien par "Handler1" avec la msgbox qui me demande si je veux refaire un essai. Mais lors de ce 2ème essai, si je re-clique sur le bouton "Cancel", mon code ne repasse pas par "Handler1", et j'ai un message "Run-Time error 13" qui s'affiche. Pourquoi l'erreur "Run-Time error 13" est traitée lors de la première fois, mais pas lors de la deuxième fois ? Cela m'intrigue... Merci d'avance pour vos explications...!

Essaye de vider la variable ERR, mais sans proposer de nouvel essai. Ce n'est qu'une 1ère piste.

Err.Clear
On Error GoTo 0

Sacré pb. Pour reproposer un essai, j'ai ajouté un Resume dans le ErrHandler, ça a l'air de coller, mais à vérifier :

Option Explicit

Sub Try1()
Dim ARR1() As Variant
Dim i As Long
Dim RNG1 As Range
Dim ANSWER1 As VbMsgBoxResult

ThisWorkbook.Worksheets("Sheet10").Select

StartAgain1:
On Error GoTo Handler1
ARR1 = Application.InputBox(prompt:="Select the Range that you want to pass in the Array.", Type:=64)
Err.Clear
On Error GoTo 0

For i = LBound(ARR1, 1) To UBound(ARR1, 1)
ARR1(i, 1) = Int(ARR1(i, 1) / 60) & "h " & ARR1(i, 1) Mod 60 & "mn"
Next

Set RNG1 = Application.InputBox(prompt:="Select the cell that will serve as the first cell of the array.", Type:=8)

Range(RNG1, RNG1.Offset(UBound(ARR1, 1) - 1, 0)) = ARR1

Handler1:
If Err.Number = 13 Then
    ANSWER1 = MsgBox(prompt:="Do you want to retry?", Title:="JMC Inc.", Buttons:=vbYesNo + vbQuestion)
    If ANSWER1 = vbYes Then
        Resume
        GoTo StartAgain1
    Else
        Exit Sub
    End If
End If

Erase ARR1
End Sub

Merci ! Je me doutais que le problème venait du fait qu'il fallait réinitialiser l'objet "Err.", mais je n'arrivais pas à trouver comment (j'avais essayer de changer de place le "On error Goto 0", mais sans succès). En fait l'ajout du "Err.Clear" n'est pas nécessaire (je ne sais même pas à quoi cela sert vraiment, j'ai essayé de l'utilisé mais sans voir de changements). Il fallait en fait bien changer le "Goto StartAgain1" en "Resume StartAgain1" car en effet "The Err object is automatically reset when either a Resume, Exit Sub, Exit Function, Exit Property, or On Error statement is executed." Merci pour le coup de main....!

De rien, le genre de prise de tête qui permet de découvrir beaucoup de choses, en particulier que MS ne s'est pas trop foulé sur la gestion des erreurs. Entre la croix en haut à droite et le bouton Cancel, la modalité n'est pas tout à fait la même alors que l'erreur l'est 13.
Joli prg entre nous.

Oui, la gestion des erreurs c'est toujours un peu prise de tête. La même chose par exemple avec la gestion des erreurs pour une application.inputbox qui reçoit une donnée de type string et que l'on veut cliquer sur le bouton cancel ou la croix pour sortir, tout en autorisant la possibilité d'écrire "False" dans l'inputbox (parce que "False" c'est l avaleur que ressort l'inputbox quand on clique sur Cancel !!). Et la même chose avec les données de type Long et que l'on veut autoriser la valeur "0" comme donnée valide (qd on clique sur cancel, l'inputbox retourne 0 !!). Il faut donc passer par la fonction VarType et déclarer les variables non pas en string ou lang mais en variant... Vraiment toute une prise de tête... :)

Je hais le On Error goto ErrHandler que je traîne depuis trente ans (VB 2.0 1991).

Je m'apprête à apprendre python, j'espère que le langage a été mieux "designé" :). Merci en tout cas :)

Rechercher des sujets similaires à "gestion erreurs application inputbox qui enregistre array"