XL 2010 Imputbox qui ne fonctionne qu'a moitié

teddy33130

XLDnaute Nouveau
bonjour

dans cette sub l'imputbox s'ouvre et fonctionne tres bien

mais quand on veux quitter avant la fin ou cliquer sur la croix cela renvoie une erreur
VB:
Sub TotalisationCouleur1()
    Set Aselectionner = Application.InputBox _
    (prompt:="selectionner la plage de cellule ", _
     Title:=" Plage de cellules à sélectioner", Type:=8)
     Aselectionner.Select 'Selection de la plage souhaitée
     For Each Cel In Aselectionner
          If Cel.Interior.Color = RGB(255, 255, 255) Then Som = Som + Cel
     Next Cel
         MsgBox Som
End Sub
quelqu'un pourrait t'il voir cela

amicalement
 
Solution
Bonjour teddy33130, le forum

il faut gérer le cas ! et la sélection avant la boucle n'est pas utile !

Bien cordialement, @+
VB:
Sub TotalisationCouleur1()
    Dim Aselectionner
    On Error Resume Next
    Set Aselectionner = Application.InputBox _
    (prompt:="selectionner la plage de cellule ", _
     Title:=" Plage de cellules à sélectioner", Type:=8)
     If Aselectionner Is Nothing Then Exit Sub
     For Each Cel In Aselectionner
          If Cel.Interior.Color = RGB(255, 255, 255) Then Som = Som + Cel
     Next Cel
         MsgBox Som
End Sub

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour teddy33130, le forum

il faut gérer le cas ! et la sélection avant la boucle n'est pas utile !

Bien cordialement, @+
VB:
Sub TotalisationCouleur1()
    Dim Aselectionner
    On Error Resume Next
    Set Aselectionner = Application.InputBox _
    (prompt:="selectionner la plage de cellule ", _
     Title:=" Plage de cellules à sélectioner", Type:=8)
     If Aselectionner Is Nothing Then Exit Sub
     For Each Cel In Aselectionner
          If Cel.Interior.Color = RGB(255, 255, 255) Then Som = Som + Cel
     Next Cel
         MsgBox Som
End Sub
 

job75

XLDnaute Barbatruc
Bonjour teddy33130,

Testez ceci :
VB:
Sub TotalisationCouleur1()
Dim Aselectionner As Range, Cel As Range, som
Application.DisplayAlerts = False
On Error Resume Next
Set Aselectionner = Application.InputBox(prompt:="selectionner la plage de cellule ", Title:=" Plage de cellules à sélectioner", Type:=8)
If Err Then Exit Sub
On Error GoTo 0
For Each Cel In Aselectionner
    If IsNumeric(Cel) Then If Cel.Interior.Color = RGB(255, 255, 255) Then som = som + Cel
Next Cel
MsgBox som
End Sub
A+
 

patricktoulon

XLDnaute Barbatruc
Bonjour
c'est normal que ca plante
set ---> instancie un object ( en l’occurrence ici un range)

tu fait un set sur un imputbox type8 (pour selectionner une plage
si tu annule par la croix le set est incompatible avec rien
alors non seulement tu ne gère pas cette erreur mais pas non plus celle ou éventuellement tu annulerais ce qui vaut false pour le dialog inputbox

donc en premier lieu au plus simple on gere l'erreur d'incompatibilité avec une sortie direct
par on error resume next

ensuite on ajoute aussi la gestion d'erreur si on clique sur annuler

la gestion d'erreur 424 pour la croix ou le bouton annuler peut se gérer en un coup

ce qui nous donne
VB:
Sub TotalisationCouleur1()
    Dim som#, Aselectionner As Range, cel As Range' déclaration des variables necéssaires(IMPORTANT!!!)
    
    On Error Resume Next 'obligatioire  l'object inputbox ne gère pas l'erreur en amont
        Set Aselectionner = Application.InputBox _
                        (prompt:="selectionner la plage de cellule ", _
                         Title:=" Plage de cellules à sélectioner", Type:=8)

     ' cette sortie réunie le cas de la fermeture par la croix(erreur 424) ou le bouton annuler
     'car si tu annule par la croix ou le bouton annuler le dialog input renvoie false 
'donc  ""Aselectionner "" sera nothing car je l'ai déclaré comme un object range (TRÈS IMPORTANT!!!)
If Aselectionner Is Nothing Then MsgBox "vous avez annulé l'operation": Exit Sub
    
    For Each cel In Aselectionner.Cells
        If cel.Interior.Color = RGB(255, 255, 255) Then som = som + cel.Value
    Next cel
    MsgBox som

End Sub
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour job75

de mémoire, la désactivation des messages d'alerte n'est plus éphémère depuis Excel 2002. Ne pas les réactiver avant la sortie de sub fera qu'elles resteront désactivées le temps de la session Excel.

[édition: salut patrick , grillé sur ce coup là ! 😉 mais on est d'accord ! voir post 2]
[pour la déclaration range, pour moi pas nécessaire car impliquée par le set sur variant et la définition du type méthode inputbox en range]
[édition2: mais tu as raison quand même, c'est plus propre et compréhensible]

Bien cordialement, @+
Sub TotalisationCouleur1() Dim Aselectionner As Range, Cel As Range, som Application.DisplayAlerts = False On Error Resume Next Set Aselectionner = Application.InputBox(prompt:="selectionner la plage de cellule ", Title:=" Plage de cellules à sélectioner", Type:=8) If Err Then Exit Sub On Error GoTo 0 For Each Cel In Aselectionner If IsNumeric(Cel) Then If Cel.Interior.Color = RGB(255, 255, 255) Then som = som + Cel Next Cel MsgBox som End Sub
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
bonjour yeahou
ben en fait j'etait tout seul quand j'ai ouvert le post
mais j'ai la sale manie d'ouvrir 36 réponses en meme temps
mais bon le principe oui il est la
gestion d'erreur en amont
on travaille avec un range donc on dim range
on gère une éventuelles sorties avec un exit sub

c'est un peu ce que je reproche aux dialog input d'excel (pas de gestion de sortie d’échappement)
a voir si on peut différencier avec le return strptr mais j'en doute
 

job75

XLDnaute Barbatruc
Bonjour Yeahou, patricktoulon, je n'avais pas rafraîchi,
Bonjour job75

de mémoire, la désactivation des messages d'alerte n'est plus éphémère depuis Excel 2002. Ne pas les réactiver avant la sortie de sub fera qu'elles resteront désactivées le temps de la session Excel.
C'est faux et ça n'a jamais été le cas, il suffit de tester l'une après l'autre ces macros sur un fichier de 2 feuilles :
VB:
Sub Test()
Application.DisplayAlerts = False 'pour tester
End Sub

Sub Sup()
ActiveSheet.Delete
End Sub
Application.DisplayAlerts prend la valeur True après le End Sub (comme Application.ScreenUpdating).

A+
 

patricktoulon

XLDnaute Barbatruc
re
ou la!!! je viens de te relire @Yeahou
t'a tout faux
non non le dim est très important au contraire
surtout dans cet exercice ou il compare le interirioe.color donc on est bien dans un range
non dimé c'est un variant() que tu obtiens je t'en fait la démo quand tu veux
[pour la déclaration range, pour moi pas nécessaire car impliquée par le set sur variant et la définition du type méthode inputbox en range]
et pour le display alert non il est automatique remis a la sortie de la macro
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
tu as raison j'ai vérifié, j'ai pourtant eu ce problème à une époque.
désolé, j'aurais du vérifier avant.
quand ce problème est survenu il y a un paquet d'années, j'ai du modifier en urgence plusieurs applications déployées en opérationnel. Depuis j'ai pris l'habitude de toujours rétablir les paramètres que je modifie, même les éphémères, ce qui me garantit contre tout changement pouvant survenir sur la portée des modifications. Je ne me suis pas aperçu, du coup, que displayalerts refonctionnait correctement.

Bien cordialement, @+
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonjour @job75
tiens test yeahou en annulant en fermant avec la croix et en selectionant un plage

d'ou l'importance de dimer la variable dans son bon type des le départ quand on lance un input
VB:
Sub testreturn()
     On Error Resume Next 'obligatioire  l'object inputbox ne gère pas l'erreur en amont
         Aselectionner = Application.InputBox _
                        (prompt:="selectionner la plage de cellule ", _
                         Title:=" Plage de cellules à sélectioner", Type:=8)
MsgBox TypeName(Aselectionner)

End Sub
 

Membres actuellement en ligne

Statistiques des forums

Discussions
312 106
Messages
2 085 352
Membres
102 871
dernier inscrit
Maïmanko