IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Selection d'une plage de cellule avec InputBox


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 32
    Par défaut
    Bonjour,

    Je viens de changer d'ordinateur professionnel (toujours sous win2000) et j'ai une fonction VBA qui marchait bien sur mon ancien PC qui ne marche plus sur le nouveau mais je ne comprends pas pourquoi.
    Cette fonction est appelée par une macro qui demande à l'utilisateur de saisir une cellule ou un plage de cellules et elle retourne le nom de la plage de cellules, sans le nom du fichier Excel. Veuillez la trouver ci-dessous.

    J'ai remarque sur ce PC tous les "Range" sont en minuscules tels que "range". Est-ce que cela pourrait avoir un lien ? Est-ce qu'il me manque une référence ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Private Function RangeSelection(ByVal Titre As String, ByVal DefaultRange As String) As String
    Dim RangeCells As range
    Dim StrSearch As String, StrReplace As String
        On Error Resume Next
        If DefaultRange <> "" Then
            range(DefaultRange).Select
            Err.Clear
        End If
        Set RangeCells = Application.InputBox(Prompt:="Veuillez selectionner une plage de cellule. ", _
                            Title:="RDExcel : " & Titre, _
                            Default:=DefaultRange, _
                            Type:=8)
        If Err.Number = 0 Then
            StrSearch = "[" & ActiveWorkbook.Name & "]"
            StrReplace = ""
            RangeSelection = Replace(RangeCells.Address(, , xlA1, True), StrSearch, StrReplace)
            RangeCells.Cells(1).Select
        Else
            RangeSelection = DefaultRange
            range(DefaultRange).Cells(1).Select
        End If
        On Error GoTo 0
        Set RangeCells = Nothing
    End Function
    Merci d'avance de votre aide.


    EDIT: 17h40
    Je viens de m'apercevoir que ça fonctionne si je selectionne une cellule dans la feuille déjà active. Mais si je vais chercher une cellule dans une autre feuille, ça plante.
    Sachant que sur mon ancien PC cela fonctionnait, je ne comprend pas pourquoi maintenant ça n'est plus le cas.
    J'espère que quelqu'un est en mesure de m'éclairer....
    Merci d'avance.

    je viens de tester chez moi avec mon ordi personnel avec Excel 2007 et la fonction fonctionne.
    Donc il doit manquer quelque chose sur mon ordi professionnel équipé d'Excel 2000.

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Et dans Excel 2003 fonctionne aussi

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 32
    Par défaut
    Sur mon PC perso, j'ai importé la macro XLA complète et les "range" sont aussi en minuscule. Mais elle fonctionne sur Excel 2007 et sur 2003 d'après mercatog.

    Je ne vois pas ce qu'il peux manquer sur mon PC pro pour que ça bug.

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour,

    Pourquoi (ne serait-ce que pour y voir un peu plus clair au lieu de "mettre une feuille sur la crotte") ne pas supprimer l'utilisation de ta gestion d'erreur par On Error Resume Next et ce qui s'y rapporte ?

    C'est par cela que je commencerais, personnellement .

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 32
    Par défaut
    Oui j'ai oublié de parler de l'erreur. C'est une erreur "424 : Objet requis" qui s'arrête sur la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Set RangeCells = Application.InputBox(Prompt:="Veuillez selectionner une plage de cellule. ", _
                            Title:="RDExcel : " & Titre, _
                            Default:=DefaultRange, _
                            Type:=8)
    si je gère l'erreur avec "On Error Resume Next" c'est pour gérer le bouton Annuler de l'InputBox.

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Hé oui ! "Que raro", no ?

    Ton objet (ce qu'attend un "set") te parait être un "string" ... (ta inputbox...) ???
    J'ignore la raison éventuelle du pourquoi la chose peut fonctionner dans certains cas et pas dans d'autres (mystères de vba ?).

    Alors :
    1) on ne gère pas le résultat d'un annuler d'une inputbox par un On Erroir Resume Next
    2) si l'on décide que l'inputbox retourne un String (ce que tu as fait ...!!!) , on travaille avec ce STRING, quitte à (si l'on n'a pas annulé) se servir de ce string pour créer un objet (ta plage, si je comprends bien).

    Voilà qui devrait te permettre d'éviter moult aléas !!

    Bonne étude.

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 32
    Par défaut
    Avec cette InputBox je souhaite récupérer l'adresse de la cellule sélectionnée. C'est pour cela que "Type:=8" .
    Le problème est que ce type d'InputBox (Type:=8) retourne une information de type Range et lorsqu'on clique sur le bouton Annuler elle retourne une valeur de type Boolean égale à Faux.
    Comme je ne sais pas comment gérer une variable de 2 types différents, alors je gère l'erreur.
    De plus, si je veux récupérer une valeur de type Range je suis obligé de placer "Set" avant la variable qui récupère le Range.

    Si je me trompe, je veux bien que vous me corrigiez car je me trouve fasse à une impasse pour le moment...

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Une suggestion (un exemple qui devrait déclencher certains réflexes), dans ce cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim RangeCells As Range
        On Error Resume Next
        Application.DisplayAlerts = False
         Set RangeCells = Application.InputBox(Prompt:=  "blabla",  Title:="spécifie une plage", Type:=8)
        On Error GoTo 0
        Application.DisplayAlerts = True
         If RangeCells Is Nothing Then
                Exit Sub
         Else
            RangeCells.Font.Bold = True
         End If
    Tu remarqueras
    - que l'on considère que l'annulation fait que l'objet n'est donc pas créé (tout simplement) ==>> Is Nothing
    - en utilisant de manière conjuguée On Error Resume Next et Application.DisplayAlerts = False, on "met un frein" à Excel qui ne peut alors traiter une entrée erronée (y compris donc résultatnt d'une annulation).

    Ca te parle ?
    Si non : essaye et tu vas voir ...
    Une précision : tu as intérêt à mettre ce code dans une routine séparée et à appeler cette routine (elle sera seule concernée par le "On Error Rersumer Next, mais également seule alors quittée par le Exit Sub)

    Mon observation : Je n'aime pas du tout ! (relis-moi, plus haut ...)

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 32
    Par défaut
    Merci pour ton exemple, je vois bien ce que tu veux dire dans cet exemple. Je me suis inspiré de ça : http://excel.developpez.com/faq/?pag...erenceInputBox

    Par contre, pour ce que tu as dis plus haut à propos d'utiliser des String plutôt que des Range, je veux bien mais si je déclare "Type:2" dans l'InputBox celle-ci me retourne la valeur de la cellule au format String... Moi c'est l'adresse dont j'ai besoin...

    Si t'as un bout de code permettant d'obtenir directement l'adresse sous forme de String, je suis preneur parce que je n'ai rien trouvé à ce sujet pour le moment.

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 32
    Par défaut
    Je pense avoir trouvé une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Public Sub test_selection()
        MsgBox RangeSelection( _
                Consigne:="Veuillez selectionner une plage de cellule. ", _
                Titre:="Plage des fonctions de contraintes", _
                DefaultRange:="Feuil1!B3")
     
    End Sub
     
    Public Function RangeSelection(ByVal Consigne As String, ByVal Titre As String, ByVal DefaultRange As String) As String
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' RangeSelection
    ' Retourne l'adresse Excel d'une plage de cellule sélectionnée par l'utilisateur.
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim RangeCells As String
        'si DefaultRange contient une adresse : selection de la plage
        If DefaultRange <> "" Then Application.Goto Range(DefaultRange)
     
        RangeCells = AdresseRangeSansWorkbook(Application.InputBox( _
                            Prompt:=Consigne, _
                            Title:="RDExcel : " & Titre, _
                            Default:=DefaultRange, _
                            Type:=8))
     
        If RangeCells <> "" Then
        ' si contient une chaine de caractères
            RangeSelection = RangeCells
            'selectionner la plage RangeCells
            Application.Goto Range(RangeCells)
        Else
        ' s'il y a une erreur: le bouton Annuler à été cliqué donc retour à l'initial
            RangeSelection = DefaultRange
            'selectionner la plage DefaultRange si elle contient une chaine
            If DefaultRange <> "" Then Application.Goto Range(DefaultRange)
        End If
    End Function
     
    Public Function AdresseRangeSansWorkbook(ByRef Plage) As String
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' AdresseRangeSansWorkbook
    ' Retourne l'adresse Excel d'une plage de cellule sans le nom du calsseur excel.
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim StrSearch As String, StrReplace As String
        If VarType(Plage) <> vbBoolean Then
            StrSearch = "[" & ActiveWorkbook.Name & "]"
            StrReplace = ""
            AdresseRangeSansWorkbook = Replace(Plage.Address(, , xlA1, True), StrSearch, StrReplace)
        Else
            AdresseRangeSansWorkbook = ""
        End If
    End Function
    Qu'en pensez-vous ?
    Il faudra que je teste ça demain au boulot.

  11. #11
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Si Range s'écrit en minuscules, je suis prêt à parier pour une référence cochée et marquée "MANQUANTE" dans la liste des références.

    Si tu y jetais un coup d'oeil?

    Une astuce pour en être certain:
    Taper VBA. devant.
    Si ça fonctionne avec cette syntaxe c'est le signe d'une référence manquante.

    Deux solutions alors.
    Soit la décocher si elle n'est pas nécessaire, soit chercher le fichier manquant à cette référence et le copier et l'enregistrer sur le nouveau PC.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 32
    Par défaut
    Citation Envoyé par AlainTech Voir le message
    Une astuce pour en être certain:
    Taper VBA. devant.
    Si ça fonctionne avec cette syntaxe c'est le signe d'une référence manquante.
    Merci pour l'astuce, c'est bon à savoir. Par contre, je n'ai pas eu à la mettre en application ce matin puisque tout les "Range" sont repassés avec la 1er lettre en majuscule. Pourquoi ? j'en sais rien...
    Bref ça n'était pas mon problème majeur, j'avais juste peur que ça ait un lien avec mon bug.


    Mon code précédent n'a pas corrigé mon bug, c'est vraiment lié au "Type:=8" de Application.InputBox.


    A priori il exite un bug aléatoire avec Application.InputBox, cf: http://excel.developpez.com/faq/?pag...el#bugInputBox pour les versions d'Excel jusqu'à 2003.
    J'ai trouvé un site où l'auteur propose un code pour palier à ce bug, cf: http://www.dailydoseofexcel.com/arch...tbox-function/ Je viens de l'implémenter à ma macro, celui-ci semble fonctionner.

    Merci de votre aide. Je vais tester ça pendant quelques temps et si ça fonctionne toujours je viendrais passer mon topic en "Résolu".

Discussions similaires

  1. Selection d'une plage de cellules dans DatagridView [Vb.Net]
    Par papy75 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 17/06/2008, 12h03
  2. Selection d'une plage de cellules variables
    Par bykeman dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/06/2008, 10h20
  3. Selection d'une suite de cellules avec cells
    Par olivier857 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/12/2006, 15h14
  4. Pb de lecture données dans une plage de cellule avec itération
    Par rond24 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/07/2006, 13h33
  5. [VBA-E] Copier une plage de cellules avec critère
    Par jfamiens dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 13/06/2006, 16h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo