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 :

Application.InputBox incompatibilité de type


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Par défaut Application.InputBox incompatibilité de type
    Bonjour à tous.

    Je ne comprends pas pourquoi j'obtiens une erreur d'execution sur la ligne de mon inputbox.
    J'ai dû exécuter la macro une cinquantaine de fois sans que jamais ça ne plante à cet endroit et voici que j'obtiens une erreur d'incompatibilité de type

    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
    Public TabNameSheets() As String
    Dim ChoixSheet As String 'variable STRING, et non numérique, représentant la sheet sélectionnée par l'utilisateur qui recevra le traitement de la macro
    Dim SortieWhile As Boolean 'variable qui teste la valeur de l'InputBox de sélection des sheets
    Dim listeSheets As String
     
    MsgBox prompt:="Veuillez parcourir les différentes feuilles du fichier ""Export_TRS"" pour déterminer celle qui va servir à la mise à jour des carnets."
     
    For z = 1 To nbSheetExportSAP 'nbSheetExportSAP = nb total de sheets dans le classeur
        TabNameSheets(z) = ExportSAP.Worksheets.Item(z).Name
        listeSheets = "Feuille numéro " & z & " = " & TabNameSheets(z) & Chr(10) & listeSheets
    Next
     
        SortieWhile = False
        While SortieWhile = False
        ChoixSheet = Application.InputBox(prompt:="Entrez le numéro de la feuille qui servira à importer les données TRS dans les carnets métro" & Chr(10) & Chr(10) & listeSheets, Title:="Entrer le numéro de la feuille", Type:=1 + 2) 'ATTENTION, ici il s'agit de la MÉTHODE InputBox
            If IsNumeric(ChoixSheet) = True Then 'si la variable STRING ChoixSheet peut être évaluée comme un nombre (ça signifie que le user a bien entré une valeur) alors
                SortieWhile = True               'SortieWhile = true et on peut sortir de la boucle
            End If
            If ChoixSheet = "Faux" Then 'si la variable STRING ChoixSheet est "FAUX" détecte si le bouton annuler ou la croix ont été cliqués. Permet de différencier un clic sur croix ou annuler d'un clic sur ok sans avoir entré de valeur
                ExportSAP.Close SaveChanges:=False
                Exit Sub
            End If
        Wend
    J'ai fait des modifs dans mon code mais pas sur ce pavé qui fonctionnait très bien auparavant.
    Bien avant que cela ne fonctionne, j'avais passé du temps (découvrant qu'il y avait une méthode et une fonction): j'ai bien essayé du 1, du 1+2, du 2 tout seul en respectant le typage de la variable et c'est cette solution qui convenait et fonctionnait parfaitement avant.
    Le 1 tout seul ou le 2 tout seul ne fonctionnent pas...
    Je ne comprends d'ailleurs pas pourquoi puisque les différents type permettent un type de données en entrée.
    Est-ce lié à ma variable qui affiche la liste des sheets du classeur ?

    Merci d'avance pour vos lumières.

    Bonne soirée.

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    comme pourtant expliqué dans l'aide du message d'erreur, ne pas mélanger torchons & serviettes !
    Soit mauvais type de variable soit mauvais type de la méthode InputBox
    Juste utiliser la fonction au lieu de la méthode !

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Stockholm, London, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    C'est pourtant simple (il suffit d'ouvrir la rubrique Application.InputBox, Méthode de l'aide interne VBA ... et ... de la lire, avant de crier "maman, bobo" )
    fait que type = 3
    Or, le type 3 est inconnu
    Déjà, hein ...
    Quant au reste :
    1) le choix du type adéquat, c'est le développeur qui le fait. Et il ne le fait pas au hasard, mais en fonction de ce qu'il souhaite (parmi quoi, ce qu'il souhaite que retourne la méthode et donc son type)..
    2)
    Je ne comprends d'ailleurs pas pourquoi puisque les différents type permettent un type de données en entrée.
    suffit lire la rubrique mentionnée ci-dessus. Elle me paraît personnellement on ne peut plus claire et je ne saurais sans me "polluer" moi-même et polluer dans la foulée le français, m'exprimer de manière meilleure que celle qui y est utilisée. On ne va tout de même pas me demander de sacrifier on français pour lui préférer une longue série de périphrases pour dire (moins clairement, d'ailleurs) ce que l'on sait dire très précisément en quelques mots !
    Je sors ...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Par défaut
    Bonsoir.

    @Marc: sauf erreur de ma part, il me semble que je ne mélange pas les torchons et les serviettes.
    Et comme, pourtant, expliqué dans mon premier message, j'ai très bien compris ce qu'est un problème d'incompatibilité et que c'est justement ça que je ne comprends pas.
    J'ai typé ma variable en string et la méthode inputBox a été utilisée avec un type de valeur renvoyée correspondant à du string et/ou du integer.
    J'ai passé beaucoup de temps sur cette inputBox et j'ai déjà essayé la fonction InputBox: c'est même elle que j'ai essayé en tout premier. Mais si j'ai laissé tombé, c'est à cause des choix de l'utilisateur (croix/annuler/mauvais type de valeur entrée) qu'il est plus facile de gérer.
    D'ailleurs dans mon code, juste au dessus de la ligne de la méthode InpuBox se trouve la même ligne mais avec la fonction Inputbox désactivée par l'apostrophe.

    @unparia: Je pense qu'il faut que tu arrêtes de vouloir m'aider. Je ne comprends pas cette agressivité.
    Alors, pour la faire courte, j'ai ouvert la rubrique "méthode Application.InputBox" sur MSDN (https://msdn.microsoft.com/fr-fr/lib.../ff839468.aspx) un paquet de fois il y a quelque temps et si toi, par contre, tu avais un peu mieux lu, tu aurais peut-être vu ce qu'il est écrit noir sur blanc, dans la remarque juste avant le tableau des valeurs:

    Remarques
    Les tableaux suivants répertorient les valeurs pouvant être passées dans l'argument Type. Il peut s'agir d'une seule valeur ou d'une somme de valeurs. Par exemple, pour une zone d'entrée qui peut accepter du texte et des nombres, affectez la valeur 1 + 2 à Type.
    C'est bizarre: ça me fait penser à quelque chose...
    Déjà, hein...
    Ça me rappelle vaguement une histoire de paille et de poutre dans l’œil, ou un truc du genre...
    Alors, j'ai trop peu d'expérience pour être critique sur le contenu des pages MSDN, mais j'aurais plutôt tendance à croire ce qui y est écrit.
    Le type adéquat était clair pour moi, en tant que "développeur", et comme je l'ai écrit, j'ai essayé plusieurs types séparément en faisant attention au typage correspondant.
    J'ai passé beaucoup de temps à écrire ce bloc et à me renseigner sur le net.
    Je ne suis pas du genre à crier "maman, bobo" sans prendre la peine de chercher avant surtout que cela a toujours fonctionné jusqu'à maintenant.
    Donc ce genre de commentaire, contre-productif, agressif et où tu écris des choses qui contredisent ce qui est dit dans MSDN en sous-entendant que j'ai "de la m... dans les yeux" et qu'il faut que je lise un peu mieux avant de venir "chialer": évite.
    En tout cas, si ce qui est écrit sur MSDN est faux, ce serait intéressant que tu leur remontes l'erreur, histoire d'éviter à d'autres "bleus du VBA" comme moi de se faire insulter ou molester dans un forum d'entraide, quand ils auront un problème avec l'InputBox.

    Franchement, si vous avez été échaudé par mes réactions à propos de mon autre sujet, abstenez-vous d'intervenir.
    Demandez à quelqu'un de neutre de lire vos réponses et demandez lui si ça ne transpire pas de l'agressivité, limite du mépris, de la condescendance.
    Elle où la bienveillance envers des débutants ?
    Là, vous ne m'apportez rien à part ce mépris gratuit.
    Relisez-vous un peu et si quelqu'un comme moi vous gonfle pour x ou y raisons, abstenez-vous d'intervenir.
    Si ça vous gonfle de voir 10 000 fois les mêmes erreurs de newbie, sans prendre la peine de savoir combien de temps a pu passer le requéreur avant de poster, quel est son parcours, remettez-vous en question.
    Ce n'est pas parce que l'on pose une question que l'on n'a pas passé du temps à chercher et à tester avant de la poser: encore faut-il le demander ou utiliser patience et bienveillance.
    Ça ne sert à rien d'avoir autant d'étoiles qu'on peut en compter un soir d'été et avoir le niveau de Bill Gates pour faire des réponses comme ça.

    Je sors...

  5. #5
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Ton affaire, mise dans une macro marche normalement chez-moi. (Excel 2016)

    Mais, tu ne dis pas si tu as changé de version d'Excel ou de Windows.

    Et puis, ton incompatibilité de type peut être dûe à autre chose que ta réponse, comme des chr(10), par exemple.

    Commence par construire ton invite et ton titre à l'extérieur de l'inputbox et mets juste les variables dans l'InputBox, au lieu des phrases. Si ce sont les chr(10) qui causent problème, le message d'horreur va sortir ailleurs que sur cette ligne-là. Ce n'est pas parce que VBA permet de "compacter" à outrance et de remplacer 3 lignes par une seule que c'est une bonne idée. Surtout quand vient le temps de déboguer

    Ceci dit, je ne vois rien de bien méchant dans les propos de Marc-L et de unparia.

    Et puis, à vrai dire, je suis extrêmement surpris que mon Excel 2016, laisse passer les parenthèses et les paramètres nommés dans la même instruction. Parce que, avec Excel 2010, c'était le plantage assuré.

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    De bon matin, pipout64 :
    Tout d'abord : mille excuses en ce qui concerne la lecture de la rubrique Application.InputBox, qui accepte en effet deux types

    Je dois dire à ma décharge que certains aspects du code que tu montrais n'étaient pas pour me mettre dans les meilleures dispositions :
    - on voit par exemple bien que TabNameSheets est une matrice, mais on ne voit nulle part où elle a été dimensionnée ****. Or ton code montre que tu tentes d'y écrire des éléments d'indice z (dont on ignore d'ailleurs également le typage)
    - on ignore (tu ne le précises pas) quelle est la ligne de code dénoncée en bogue
    - on ignore également où et comment a été déclarée et initialisée la variable nbSheetExportSAP
    etc ...
    Voilà. Je te laisse maintenant.

    EDIT :
    **** et d'alleurs :
    Déclarée et non dimensionnée ainsi :
    TabNameSheets() As String
    elle ne peut dés lors être dimensionnée que par une instruction Redim (je le la vois nulle part dans ton code).

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Par défaut
    Bonjour.

    @clementmarcotte: je suis sous Excel 2010 et cette instruction ne m'a jamais posé de problèmes à partir du moment où j'ai réussi à la mettre en oeuvre (et c'est vrai que j'ai pas mal galéré parce que je n'avais utilisé que la fonction InputBox).
    Ça ne me générait pas d'erreurs sous Excel 2013 (mais depuis l'erreur, je n'ai pas encore pu tester sous 2013).
    Je réalise une macro qui comporte en fait 3 macros.
    Ma macro (n° 2) qui contient cette inputBox a toujours tourné sans erreurs.
    Je suis d'ailleurs obligé de l’exécuter pour pourvoir lancer la macro 3: je l'ai exécutée des dizaines de fois.
    Je viens de passer 2 heures à vérifier tous les typages et les modifier à des fins de tests mais rien n'y fait.
    J'ai testé la suppression des & chr (10) &, ça ne change rien.
    Par contre, j'ai remplacé la variable listeSheets par "toto" et là, ça fonctionne.
    Je me suis donc penché, de nouveau, sur le typage des variables qui "génère" la variable listeSheets et je ne vois pas bien (j'ai utilisé TypeName pour chacune des variables et elles apparaissent toutes en string et sont toutes déclarées en string)...
    Dans tous les cas, la méthode InputBox "contraint" automatiquement la valeur à une chaîne avant qu'elle ne s'affiche: est-ce que contraindre signifie transformer ?
    Donc cette variable listeSheets semble poser problème sans avoir fait aucun changement depuis plusieurs semaines.
    Le surlignage et l'erreur sont bien positionnés sur la ligne de l'InputBox.

    Ce n'est pas parce que VBA permet de "compacter" à outrance et de remplacer 3 lignes par une seule que c'est une bonne idée
    Je suis plutôt d'accord mais je débute et je ne veux pas encore m'aventurer dans le monde des Userforms que je trouve complexes, pour l'instant.
    Ça viendra... Mais rien qu'à l'idée de voir ces codes qui se renvoient un peu partout... Je vais y passer des heures ! Déjà que je passe des heures pour des méthodes simples et "basiques" (comme cette InputBox).
    Donc cette InputBox était une solution palliative intéressante et qui fonctionnait très bien !
    Ceci dit, je ne vois rien de bien méchant dans les propos de Marc-L et de unparia
    Peut-être que tu t'y es habitué... Moi non. Et si je parle à ma femme de cette manière, ça risque de coincer.
    D'ailleurs quand je lui ai fait lire (elle n'y connait absolument rien en informatique et ne pouvait donc s'attacher qu'à la forme), elle m'a répondu: "heureusement que c'est pour s'entraider.".
    Quand j'étais mécanicien avionique sur aéronef et qu'un "jeune" me demandait de l'aide sur une panne, je ne l'envoyais pas paître en lui demandant de regarder la doc avant de savoir s'il l'avait fait et qu'est ce qu'il avait fait: pas super pédagogique...
    Au contraire, on reprenait le cheminement qu'il avait suivi depuis le début, pour l'amener à comprendre les erreurs de diagnostics, de consultation de la doc, etc...
    Bref, je vais me faire détester alors que je demande juste un peu de patience et de bienveillance... Je ne suis pas un pro, mais un passionné débutant. J'apprends au fur et à mesure mais je n'ai aucun recul sur la programmation et les codes, les évidences, les bons sens qui la régissent.
    Je suis à des années lumière de vos connaissances et apprends par touches, sursauts...
    Ton commentaire me convient très bien dans sa forme et dans son ton: c'est constructif et je ne suis pas jugé.

    @unparia:
    Je dois dire à ma décharge que certains aspects du code que tu montrais n'étaient pas pour me mettre dans les meilleures dispositions
    C'est bien ce que je dis: si les éléments que j'ai donnés ne sont pas suffisants et que ça te gonfle parce que tes connaissances pointues te permettent d'avoir la hauteur suffisante pour comprendre qu'il faut montrer plus de code, qu'il faut plus d'éléments, et bien n'interviens pas plutôt que de m'envoyer bouler.
    En termes de hauteur, j'en suis au niveau du carrelage.
    Je passe beaucoup de temps à chercher et trouver par moi-même plutôt que de demander de l'aide dès qu'un écueil se présente, alors quand on me juge comme ça: mon sang ne fait qu'un tour.
    Le pire c'est que je peux très bien comprendre que ça puisse gonfler, de rabâcher et voir les mêmes erreurs, mais il me semble que ça fait partie des évidences de ce genre de forums.
    Ou sinon, créez un test de connaissances en VBA et en fonction du résultat, invitez les membres qui ont des supers résultats pour créer un forum de super users VBA...
    mille excuses en ce qui concerne la lecture de la rubrique Application.InputBox, qui accepte en effet deux types
    Excuses acceptées ! ;)
    Quelqu'un qui se remet en question est une bonne personne...

    Je mets le code avec les variables à tout hasard...
    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
    Public TabNameSheets() As String
    Public nbSheetExportTRS As Integer
    Dim z As Integer
    Dim ChoixSheet As String 'variable STRING, et non numérique, représentant la sheet sélectionnée par l'utilisateur qui recevra le traitement de la macro
    Dim SortieWhile As Boolean 'variable qui teste la valeur de l'InputBox de sélection des sheets
    Dim listeSheets As String
     
    nbSheetExportTRS = ExportTRS.Worksheets.Count 'compte le nb de feuilles présentes dans le classeur "Export_TRS"
    ReDim TabNameSheets(nbSheetExportTRS) 'Redimensionne mon tableau avec le nb de feuilles du classeur
     
    MsgBox prompt:="Veuillez parcourir les différentes feuilles du fichier ""Export_TRS"" pour déterminer celle qui va servir à la mise à jour des carnets."
     
    For z = 1 To nbSheetExportTRS 'nbSheetExportTRS = nb total de sheets dans le classeur
        TabNameSheets(z) = ExportTRS.Worksheets.Item(z).Name
        listeSheets = "Feuille numéro " & z & " = " & TabNameSheets(z) & Chr(10) & listeSheets
    Next
     
        SortieWhile = False
        While SortieWhile = False
        ChoixSheet = Application.InputBox(prompt:="Entrez le numéro de la feuille qui servira à importer les données TRS dans les carnets métro" & Chr(10) & Chr(10) & listeSheets, Title:="Entrer le numéro de la feuille", Type:=1 + 2) 'ATTENTION, ici il s'agit de la MÉTHODE InputBox
            If IsNumeric(ChoixSheet) = True Then 'si la variable STRING ChoixSheet peut être évaluée comme un nombre (ça signifie que le user a bien entré une valeur) alors
                SortieWhile = True               'SortieWhile = true et on peut sortir de la boucle
            End If
            If ChoixSheet = "Faux" Then 'si la variable STRING ChoixSheet est "FAUX" détecte si le bouton annuler ou la croix ont été cliqués. Permet de différencier un clic sur croix ou annuler d'un clic sur ok sans avoir entré de valeur
                ExportTRS.Close SaveChanges:=False
                Exit Sub
            End If
        Wend
    Amitiés...

  8. #8
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Je "trouve" personnellement que le style "roman" n'a pas beaucoup de place dans un domaine technique.
    Je ne confonds par ailleurs pas un forum de développeurs avec un cours de développement.
    Je t'ai par ailleurs fait une remarque très précise concernant une matrice. --->> passée aux oubliettes "romancières ?"
    Je te salue donc. Et te quitte donc, en te souhaitant beaucoup de succès dans tes démarches.

    EDIT : je vois que ton second code corrige le premier en ce qui concerne l'aspect que je pointais du doigt. C'est un premier pas.

  9. #9
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Passe ton code au pas-à-pas avec des espions à la bonne place. et tu vas voir que ce bout-là est ou peut-être problématique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     If IsNumeric(ChoixSheet) = True Then 'si la variable STRING ChoixSheet peut être évaluée comme un nombre (ça signifie que le user a bien entré une valeur) alors
                SortieWhile = True               'SortieWhile = true et on peut sortir de la boucle
            End If
    Parce que dès que tu réponds avec un texte, ChoixSheet vaut zéro et isnumeric est toujours True. (J'ai vu cela au pas-à-pas et en utilisant des espions)

    Et puis, j'ai l'impression que tu pourrais t'en passer. Même si je ne suis pas partisan des sélections (Select) à outrance, tu pourrais tricher un peu obligeant ton utilisateur à cliquer dans la feuille qu'il veut utiliser. Rendu là, la feuille cliquée devient l'ActiveSheet.

  10. #10
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour clementmarcotte

    Je "vois" personnellement quelque-chose de plus gênant :
    La variable ChoixSheet a été typée en String
    J'espère que plus loin dans son code, il n'utilise pas directement Choixsheet comme index (que ce soit de la collection worksheets ou de la matrice TabNameSheets)

    Car ce ne serait ni Application.InputBox, ni le code montré, qui seraient alors "fautifs"

    Mais voilà : on ne voit qu'un bout de code (et encore : le premier était manifestement amputé de certaines petites choses) et on n' "entend" que ce que nous dit le demandeur.

  11. #11
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par unparia Voir le message
    Bonjour clementmarcotte

    Je "vois" personnellement quelque-chose de plus gênant :
    La variable ChoixSheet a été typée en String
    J'avais vu et je n'ai pas allumé. Et IsNumeric retourne un booléen. Donc, le zéro qui sort de l'espion est en fait un False qui semble avoir été transtypé pour une raison ou pour une autre. Et ce n'est probablement pas pour rien, que les exemples de Microsoft sur la page sont faits pour associer le résultat de IsNumeric à une variable. Personnellement, je fuis comme la peste des tests sur des booléens qui sont faits à moitié. Je mets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If isnumeric(machin) = true
    else
    end if
    C'est plus long à programmer, mais c'est sans équivoque, et à l'abri de la tolérance qui peut être imprécise de VB.

    Mais voilà : on ne voit qu'un bout de code (et encore : le premier était manifestement amputé de certaines petites choses) et on n' "entend" que ce que nous dit le demandeur.
    Exact

  12. #12
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    De toutes manières, de bon matin --->>
    Il n'est pas exact de dire que la fonction inputbox ne permet pas de savoir si l'on a annulé ou si l'on n'a rien saisi.
    La preuve (exemple) :

    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
    Private Sub CommandButton1_Click()
      ReDim TabNameSheets(1 To Worksheets.Count) As String
      Dim ChoixSheet As String
      Dim listeSheets As String
      For Each ws In Worksheets
        TabNameSheets(ws.Index) = ws.Name
        listeSheets = "Feuille numéro " & ws.Index & " = " & ws.Name & Chr(10) & listeSheets
      Next
      bon = False
      Do While Not bon
        ChoixSheet = InputBox("blablabla bla" & Chr(10) & Chr(10) & listeSheets, Title:="Entrer le numéro de la feuille")
        If Val(ChoixSheet) >= 1 And Val(ChoixSheet) <= Worksheets.Count Then
          bon = True
        ElseIf StrPtr(ChoixSheet) = 0 Then
          MsgBox "annulé": Exit Do
        End If
      Loop
     if bon then  MsgBox " LA PREUVE ? --->> t'as choisi la feuille " & TabNameSheets(ChoixSheet)
    End Sub
    Je travaille dans cet exemple sur le classeur actif (pour ne pas alourdir ce qui n'est qu'un exemple)
    Notons au passage la simplification de la matrice TabNameSheets ("au passage" car peu important)
    Notons enfin que le code écrit par le demandeur présentait de toutes façons un inconvénient. La saisie d'un N° inexistant étant acceptée, puisque ... numérique ...

    Ceci dit : je ne concevrais personnellement pas ainsi. J'offrirais une listbox où il suffirait de cliquer.


    EDIT : toujours de bon matin : j'ai décortiqué le "roman" du message 7 (je dis décortiqué car trop est l'ennemi du bien, y compris en nombre de mots).
    J'y "décèle" enfin, dans ce "flot", ceci :
    Par contre, j'ai remplacé la variable listeSheets par "toto" et là, ça fonctionne.
    qui met en exergue que ce n'était pas la méthode Application.InputBox, qui était défectueuse, mais très probablement un conflit de nom de variable ...
    Voilà ...
    Reste bien évidemment que si ce conflit de noms existe, même ma dernière proposition le "subira" (et pour cause).

    EDIT 2 : Nous n'aurions pas perdu tout ce temps si le demandeur avait dès le début et fort sobrement :
    - donné cette indication
    - mais aussi et surtout dit que l'erreur ne survenait pas après la saisie, mais que la boîte de dialogue ne s'affichait même pas !

  13. #13
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Tout à fait !

    Et comme l'aide associée au message d'erreur l'indique pourtant clairement - suffit-il encore de la lire -
    ayant indiqué « Soit mauvais type de variable » vu ce message d'erreur clairement explicite :
    il ne faut vraiment pas mélanger torchons et serviettes ‼
    Ce n'est vraiment pas compliqué de caler un type de variable avec celui attendu …

    ___________________________________________________________________________________________________________
    L'avenir n'appartient pas qu'à ceux se levant tôt mais surtout à ceux se donnant la peine de lire …

Discussions similaires

  1. Annuler InputBox en format date. Incompatibilité de type
    Par Mairequimby dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 18/12/2009, 16h01
  2. incompatibilité de type
    Par zooffy dans le forum Access
    Réponses: 2
    Dernier message: 13/06/2005, 16h12
  3. Incompatibilité de types dans un formulaire
    Par ahage4x4 dans le forum ASP
    Réponses: 3
    Dernier message: 03/05/2005, 16h39
  4. [XSD] Incompatibilité des types xs:ID et xs:IDREF ?
    Par Cpt.FLAM dans le forum Valider
    Réponses: 6
    Dernier message: 08/04/2005, 15h54
  5. Application Portable sur differents types de BDD
    Par sylvain_2020 dans le forum Décisions SGBD
    Réponses: 11
    Dernier message: 23/09/2003, 13h59

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