Incompatibilité de type

Résolu
Bonjour,
J'ai quarante fichiers dont certains sont destinés à servir de liste de choix dans d'autres fichiers;ces derniers servent également de liste de choix pour le fichier Menus.xltm dont les données enregistrées iront dans le fichier Classeur menus.xltm. En ce qui concerne, les listes de choix, tout fonctionne correctement (ce travail avait fait l'objet d'une précédente question : transfert des données d'un fichier dans un autre autant que je me souvienne).
Mintenant, le problème se situe dans le fichier Menus.xltm qui comprend un module (listemenusjournaliers) qui regroupe toutes les données avec leur type (date, string, byte, etc.) et d'un UserForm frmListemenusjournaliers qui comprend des zones de liste modifiable (cbo), des zone de texte (une pour la date, une pour le numéro du menu, quatre pour les quantités), deux boutonds de commande (ajout menus journaliers et retour).
Les quantités sont des nombres à deux chiffres après la virgule;le numéro du menu est un chiffre sans virgule et sans rien après la virgule évidemment. Dans le classeur menus.xltm, il a deux feuilles (Récapitulatif menus, Menus dont une colonne commune (Date du menu) est formatée sous la forme Date (Lundi 31 octobre 2016).) .
Dans le fichier Menus.xltm; il est prévu un appel à Créermenusjournaliers et un autre à Remplacermenusjournaliers (call Créermenusjournaliers suivi de la liste de tout les objets de l'UserForm, chacun suivi de .value, call Remplacermenusjurnaliers suivi de la liste de tous les objets de l'UserForm, chacun suivi de .value). À l'exécution du programme, pour les outils de l'UserForm concerné, la liste des choix possibles s'affiche correctemnt, et quand je clique sur Ajoutmenujournalier, j'ai un message d'erreur "Incimpatibilité de typé" et le débogage entoure la procédure publique Créermenusjournaliers (qui est suivi du nom des outils de l'UserForme sans le préfixe : donc pas de cbo, pas de txt, etc). Je suis autodidacte en programmation et je n'ai malheureusement pas la science infuse et je ne comprends rien au message d'erreur.
Votre aide me serait très précieuse. D'avance, je vous en remercie.
Le cas échéant, quelque quarante fichiers compressés attendent d'être envoyés à qui le demandera (certainement en plusieurs fois).
Encore merci pour votre aide précieuse. Bonnes soirée et continuation.



--
BUDGETS

29 réponses

Résumé de la discussion

L'erreur d'incompatibilité de type survient lors de l'appel de Créermenusjournaliers via le formulaire, lorsque les valeurs des contrôles ne sont pas correctement converties vers leurs types destinés. Des conversions sont nécessaires, par exemple CDate pour les dates, CSng pour les quantités et CByte pour les numéros, et l'emploi d'un type personnalisé pour regrouper les champs dans une liste passée en paramètre. Des bonnes pratiques incluent renommer le module Listemenusjournaliers en mListemenusjournaliers pour éviter les conflits avec le type, déclarer une variable publique Meslistesmenusjournaliers et faire tendre Créermenusjournaliers vers cette liste. En pratique, l'appel passerait par Call Créermenusjournaliers(Meslistesmenusjournaliers) et, via With... End With, les données seraient écrites successivement dans les feuilles Récapitulatif menus et Menus, selon les champs renseignés.

Bobot (l’IA à votre service)
  1. Bonjour,

    "Incompatibilité de type" se produit lorsqu'on tente d'affecter une variable avec une valeur de type différent de celui déclaré pour cette variable (par exemple : affecter une valeur de type String à une variable déclarée comme Long), et uniquement dans ce cas.

    Pour éliminer toute ambigüité, il est préférable de déclarer toutes les variables utilisées, et de préférence avec le bon type de variable (plutôt que tout déclarer comme Variant).
    Pour être certain de ne pas en oublier, il suffit de commencer chaque module par
    Option Explicit
    .

    Si tu as déjà appliqué ces précautions, il est probable qu'il faille déclarer la variable concernée comme Variant, c'est le seul type qui accepte tous les autre (penser au Set lorsqu'on affecte un objet à un Variant).

    D'autre part, pour faciliter le débogage, il est préférable de mettre un maximum de procédures dans des modules standards plutôt que dans des modules de feuilles.
    0
    1. Bonjour Patrice,

      Je viens de taper une réponse avec les fichiers joints et tout a disparu. Je suis obligé de recommencer, cela a le don de m'énerver car ce n'est pas la première fois que cela se produit.
      En ce qui concerne la variable avec une propriété Variant, je ne l'ai jamais fait. Donc je ne sais pas commen écrire le code d'un objet dont la propriété est Variant.
      J'ai écrit ce programme à partir d'un modèle trouvé dans un livre et que j'ai modifié selon mes besoins. Dans le livre, en effet, les procédures Public sub Créermenus journaliers (je reprends mes termes à moi, ceux du livre étant évidemment différents), Public sub Remplacermenusjournaliers sont dans un module à part et non dans l'UserForm Listemenusjournaliers. Cette après-midi, je vais transférer des deux procèdures dans un module à part. Je verrais ainsi si Incompatiblité de type disparais;dans la négative, peut-être serais-je mieux renseigné sur l'objet fautif.
      Rappel des deux problèmes :
      À l'exécution du programme, je remplis les différents objets puis je clique sur Ajoutmenusjournaliers : 1) La date du menu disparaît (j'ai essayé cboDatedumenu comme txtDatedumenu, mais cela n'a rien changé);2)Dans la partie Ajout du nouveau menu,Call Créermenusjournaliers s'entoure entièrement de jaune (ou de vert) : l'erreur serait donc dans cette partie mais où, mystère.
      Dans le prochain message, tu aauras tous les fichiers.zip
      Encore merci pour ton aide.
      Bonnes journée et continuation.

      0
      1. Bonjour Patrice,

        Sans vouloir t'offusquer ni t'offenser et douter de ta compétance, pour exécuter mon programme, il y aura lieu de créer un dossier (en respectant la casse) ProgramFiles puis, dans le dossier ProgramFiles, un dossier Menus, le tout sur un disque dur D (sinon, modifier le code en conséquence)
        Merci encore pour ton aide.
        Bonnes journée et continuation.
        Les fichiers.zip
        https://www.cjoint.com/c/FKbledPFBcL
        https://www.cjoint.com/c/FKblCyuigrL
        https://www.cjoint.com/c/FKblC3nTskL
        https://www.cjoint.com/c/FKblDI1yHrL
        https://www.cjoint.com/c/FKblEvprtsL
        https://www.cjoint.com/c/FKblFbjTgCL
        https://www.cjoint.com/c/FKblFT1etBL
        https://www.cjoint.com/c/FKblGxMjLCL
        https://www.cjoint.com/c/FKblJrowdrL
        https://www.cjoint.com/c/FKblKkKOTWL
        https://www.cjoint.com/c/FKblKWSIeEL
        https://www.cjoint.com/c/FKblL6WlaSL
        https://www.cjoint.com/c/FKblMEOSNML
        https://www.cjoint.com/c/FKblOwetVhL
        https://www.cjoint.com/c/FKblO0TVctL
        https://www.cjoint.com/c/FKblPOPL4UL
        https://www.cjoint.com/c/FKblQryhMhL
        https://www.cjoint.com/c/FKblQ0FikOL
        https://www.cjoint.com/c/FKblRDEjniL
        https://www.cjoint.com/c/FKblSjF38rL
        https://www.cjoint.com/c/FKblSX5vuWL
        https://www.cjoint.com/c/FKblT1RI0KL
        https://www.cjoint.com/c/FKblUKnSyQL
        https://www.cjoint.com/c/FKblVqCR8ML
        https://www.cjoint.com/c/FKblXHowXXL
        https://www.cjoint.com/c/FKblYnWEb6L
        https://www.cjoint.com/c/FKblY7MzR7L
        https://www.cjoint.com/c/FKblZPAyVmL
        https://www.cjoint.com/c/FKbl0BhfeJL
        https://www.cjoint.com/c/FKbl1pI18uL
        https://www.cjoint.com/c/FKbl16g7slL
        https://www.cjoint.com/c/FKbl2QXGxWL
        https://www.cjoint.com/c/FKbl4BVuyfL
        https://www.cjoint.com/c/FKbl5qnqIAL
        https://www.cjoint.com/c/FKbl7Eu7VyL
        https://www.cjoint.com/c/FKbmaTjRDBL
        https://www.cjoint.com/c/FKbmbQQCipL
        https://www.cjoint.com/c/FKbmbQQCipL
        https://www.cjoint.com/c/FKbmdFCqbdL
        https://www.cjoint.com/c/FKbmfc4RdlL
        0
        1. Bonjour,

          Avec les liens ci-dessus, j'ai téléchargé 46 fichiers (certains sont présents plusieurs fois avec des dates différentes ! j'ai supposé qu'ils sont identiques.)

          3 fichiers sont corrompus, ils ne s'ouvrent pas :
          - classeur conditionnement légumes.xlsx
          - classeur jours légumes.xlsx
          - classeur légumes.xlsx

          Je ne comprends pas pourquoi il y a tous ces fichiers, je pense qu'un seul suffirait.
          Je ne sais pas comment se produit ton problème. J'ai lancé menu.xltm : l'usf s'ouvre mais le seul cbo qui offre un choix (à priori incorrect) est "code légume". les commandes semblent sans effet (à part Retour).

          0
          1. Bonsoir Patrice,

            Chez moi, les trois fichiers mentionnés s'ouvrent correctement.
            Mes cbo sont bien renseignés.
            Quand tu ouvres Mensu.xltm : tu cliques sur le bouton de commande, en haut, à gauche, Créer menus qui, après chargement des fichiers, aboutit à l'UserForm Listemenusjournaliers dans lequel je dois remplir tous les cbo, txt et cliquer enfin sur Ajout menus journaliers.
            Enfin, je n'ai mentionné dans la liste que 40 fichiers.zip

            0
            1. Re,

              La liste des fichiers issus des liens ci-dessus : https://www.cjoint.com/c/FKbvshyK0Yy

              « je dois remplir tous les cbo », avec quoi ? il n'y a rien dans les listes !
              Effectivement l'usf Listemenusjournaliers s'ouvre mais quand j'actionne Ajout menus journaliers il ne se passe apparemment rien, en tous cas il n'y a pas d'erreur !
              0
            2. @Patrice33740PS : « Chez moi, les trois fichiers mentionnés s'ouvrent correctement » Avec les liens que tu as fourni ?
              0
            3. @Patrice33740oui, avec les liens fournis
              0
            4. @BUDGETSChez moi, excepté Date du menu, les quantités et le numéro du menu, tous les cbo sont contiennent bien les renseignements adéquats.
              Je n'ai eu aucun problème avec les classeurs ni avec les fichiers non précédés du mot Classeur : ils sont faits sur le même principe à part qu'ils sont beaucoup plus courts. Seul Menus.xltm, construit sur le même principe, me pose problème quand je l'exécute.
              Essaie de faire des créations dans codes légumes.xltm par exemple, cela ne devrait pas de toper de problème, enfin, j'espère.
              Les fichiers sont sous XLTM car je pensais m'en servir comme modèles afin de ne pas avoir à recommencer tout d'une année à l'autre.
              0
            5. @Patrice33740Date du menu : 01/01/2017
              Code légume : LD03
              Légume : Frites
              Jourslégumes : Dimanche midi
              Conditionnement légume :20 frites par repas
              Destination légume : Menus journaliers
              Quantitélégumes : 20,00
              Codelégumedeux : LD01
              Légumedeux : Asperges
              Jourlégumedeux : Dimanche soir
              Conditionnementlégumedeux : 1 boîte par repas
              Destinationlégumedeux : Menus journaliers
              Quantitélégumedeux : 1,00
              Codesviandes : V22
              Viandes : Saucisson
              Joursviandes : Lundi à dimanche soirs
              Conditionnementviandes : 1 morceau de 400 grammes pour 3 repas
              Destinationviandes : Menus journaliers
              Quantitéviandes : 0,34
              Codesdesserts : D01
              Desserts : Ananas
              Jours desserts : samedi et dimanche midis et soirs
              Conditionnementdesserts : Unité : 1 pour 4 repas
              Destinationdesserts : Menus journaliers
              Quantitédesserts : 0,50
              Codesobservation : O06
              Observations : Jour de l'an
              Moisconcernés : Janvier 2017
              Numérodumenu 1
              Tout ce qui concerne légume deux ne sera rempli que si le code légume est LD03 (Frites) et alors le Code légume deux sera toujours LD01.
              Fais un essai avec ces renseignements et tiens-moi, s'il te plaît, au courant du résultat obtenu. Codes observations : la lettre O suivi d'un nombre à deux chiffres (de 01 à 13)
              Encore merci pour ton aide.
              0
          2. Re,

            Je ne peux rien faire si je n'ai pas les bon fichiers

            L'avant dernier lien que tu as donné au post 3 contient 44 fichiers.

            Crée une seule archive zip avec les 40 fichiers et poste-la sur cjoint.
            0
            1. Bonjour Patrice,

              https://www.cjoint.com/c/FKcjfsvlB0L

              J'ai essayé cela, je ne sais pas si cela va marcher. Dis-moi. Si cela ne marche pas, merci de me communiquer la méthode à suivre pour créer une archive unique. Actuellement,\ProgramFiles\Menus\Fichier zip\ avec tous les fichiers zip.
              BUDGETS
              0
              1. Re,

                Que de temps perdu !!!

                C'est pas bon :
                - Ton fichier archive (zip) contient 40 archives (40 zip au lieu de 40 fichiers excel).
                - 2 archives sont vides :
                - - classeur codes légumes.zip
                - - classeur conditionnement légumes.zip
                - 2 archives contiennent plusieurs fichiers
                - - classeur liste de choix viandes.zip contient 4 fichiers
                - - Observations.zip contient 44 fichiers !!!
                - Il n'y a pas d'archive du fichier Menu.xltm

                Pour créer une archive il faut disposer d'un logiciel d'archivage (de compression) qui crée un fichier zip, par exemple 7-Zip (gratuit).

                Pour créer une archive unique contenant les 40 fichiers, ouvres le répertoire menu, sélectionnes les 40 fichiers, clic droit, 7-Zip, ajouter à l'archive.
                Puis déposes cette archive sur Cjoint.
                0
              2. @BUDGETSTu as posté un fichier rar, pas un zip !
                Pour trouver 7-Zip puis ajouter à l'archive, installes 7-Zip : https://www.7-zip.org/
                0
            2. J'ai installé 7zip 64 bits mais à chaque fois que je clique dessus, il propose de l'installer !!!!!!!!!!!!!!!!!!!!!
              0
              1. une fois installé, il n'y a plus besoin de l'exécuter, dans le gestionnaire de fichier, il a été ajouté au clic droit.
                0
              2. @Patrice33740je suis allé dans programmes, menus, fichiers ZIP. J'ai cliqué sur ajouter une archive, on me demande le nom de l'archive mais l'extension est RAR, je n'ai pas trouvé d'extension.zip et je n'ai pas trouvé 7 Voilà ce que cela donne
                https://www.cjoint.com/c/FKcpO6eLfEL
                0
            3. As-tu reçu mon dernier envoi ou faut-il que je recommence ?
              0
              1. Re,

                Tout d'abord, j'ai réparé les deux fichiers qui ne fonctionnent pas correctement (que ce soit avec Excel 2003, Excel 2007, Excel 2010 ou Excel 2016) : EDIT aprés modif : https://www.cjoint.com/c/FKcstPkR6mY
                Je te conseille vivement de remplacer les tiens par ceux-ci.

                Avec les fichiers que tu fournis, menu.xltm a toujours le même comportement décrit ici Post 5

                J'ai un doute sur le fait que tu fournisses les bons fichiers : le fichier menu.xltm date du 20/10/16 22:47 . Est-ce normal ?

                Cordialement
                Patrice
                0
                1. Le fichier Menus.xltm arrêté au 30 octobre 2016.
                  https://www.cjoint.com/c/FKcs2xDCbGL

                  Tout d'abord, j'ai réparé les deux fichiers qui ne fonctionnent pas correctement (que ce soit avec Excel 2003, Excel 2007, Excel 2010 ou Excel 2016) : EDIT aprés modif : https://www.cjoint.com/c/FKcstPkR6mY
                  Je te conseille vivement de remplacer les tiens par ceux-ci.
                  Ma réponse : ces deux fichiers sont fait d'après le fichier XLTM correspondant. Je n'ai pas vu ce qui a été modifié. Peut être faut-il que j'aille dans le fichier XLTM correspondant pour l'éventuelle modification du code.
                  Avec les fichiers que tu fournis, menu.xltm a toujours le même comportement décrit ici Post 5
                  Ma réponse : ça veut dire quoi ? je clique sur Post 5 mais rien ne se passe.
                  BUDGETS
                  0
                  1. Avec ce fichier Menus.xltm c'est un peu mieux, les cbo contiennent une valeur (mais pas la liste attendue).
                    Il y a effectivement un bug à l'exécution mais c'est pas encore le comportement que tu décrit.

                    Une demi journée pour fournir un seul des 40 fichiers dans l'état où tu l'utilises !
                    J'espère qu'il ne faudra pas 20 jours supplémentaires pour que tu fournisses la totalité des les 40 fichiers (et pas 46) au dernier carat !
                    0
                2. Avec les bon fichiers c'est nettement mieux !

                  Enfin presque car les 3 fichiers suivants sont toujours corrompus :
                  - Classeur conditionnement légumes
                  - Classeur jours légumes
                  - Classeur légumes.

                  Je les ai réparés pour pouvoir faire fonctionner menu.

                  Il reste au moins 2 problèmes avec le formulaire :
                  - la date est un cbo, sans liste de choix : ça devrait être un TextBox.
                  - le numéro de menu est aussi un cbo : ça devrait aussi être un TextBox.

                  Lorsque j'exécute tes directives du post 10 : Post 10, j'ai une erreur "Incompatibilité de type" sur la ligne :
                  Call Créermenusjournaliers(.... ce qui est tout à fait normal :
                  - les cbo et tbx contiennent des variables de type string (texte).
                  - tu affectes directement certaines des ces valeurs à des variables date, single et byte sans les convertir d'où l'erreur.
                  Il faut utiliser CDate(), CSng() et CByte() pour les convertir

                  Un fois cette étape surmontée, il y aura des erreurs à cause de variables non déclarées ....

                  Bon courage
                  0
                  1. Bonjour Patrice,

                    J'espère que tu vas bien.

                    Je suis occupé là. Je répondrais à ton message dans la soirée. Si tu le souhaites et que tu penses que ce serait mieux ainsi, nous pourrions échanger nos adresses mail pour correspondre au lieu de passer par Commentçamarche.
                    Bonnes après-midi et continuation.

                    BUDGETS
                    0
                    1. Pour la date du menu et le numéro du menu, pas de problème, je vais modifier.
                      - les cbo et tbx contiennent des variables de type string (texte).
                      - tu affectes directement certaines des ces valeurs à des variables date, single et byte sans les convertir d'où l'erreur.
                      Il faut utiliser CDate(), CSng() et CByte() pour les convertir

                      a) Les cbo et txt (et non tbx) contiennent des variables de type string (texte) : les cbo sont tous des textes; par contre, les txt seront soit une date (date du menu soit sous la forme 03/11/2016 soit sous la forme jeudi 03 novembre 2017 : quel type alors ?), soit des quantités sous le forme de chiffres à deux chiffres après la virgule sauf pour le txtNuméro du menu qui n'aura pas de virgule.
                      b) Il faut utiliser Cdate(), CSng() et CByte() : Dans aucun livre, je n'ai rien trouvé de ressemblant donc je ne risquais pas de les utiliser. Alors la question: où les utiliser (dans le moduleListemenusjournaliers ? dans CallCréermenusjournaliers et dans CallRemplacermenusjournaliers ? dans les procédures Créermenusjournaliers() et Remplacermenusjournaliers() ? De quelle manière écrire alors le code ? J'ai cherché Cdate et les autres, conversion mais je n'ai rien trouvé
                      Variables non déclarées : normalement, il ne devrait pas en avoir puisque tout est déclaré dans le module Listemenusjournaliers ou dans les procédures sous forme d'un Dim.
                      Je ne sais pas si je te l'ai dit, mais je suis un programmeur néophyte et autodidacte. Je me suis basé sur un modèle trouvé dans un livre que j'ai modifié pour mes besoins : il emploie des nombres, des dates, des chaînes de caractères et son exécution ne pose aucun problème (pas d'incompatibilité de type), aussi j'ai été étonné que le mien sorte ce type d'erreur. Éventuellement, je pourrais te faire parvenir ce modèle.
                      Bonnes soirée et continuation.
                      Merci encore de ton aide.
                      0
                      1. @Patrice33740PS : l'aide VBA est aussi très bien fait. Dans le VBE (i.e. l'éditeur VBA), il suffit de taper le mot clé (par exemple Cdate) , de placer le curseur dessus et de taper F1 pour accéder directement à l'aide VBA sur la fonction Cdate.
                        0
                      2. @Patrice33740Certes cela donne des exemples mais je ne suis pas perspicace; D'après ce que j'ai compris, il faudrait créer des je ne sais quoi, les déclarer (puisque option explicit) : créer les je ne sais pas quoi où, les déclarer où, quel code écrire et où. Pour Microsoft, tout le monde est super programmeur, intelligent et je ne sais pas quoi encore mais hélas ce n'est pas le cas !
                        0
                    2. Bonsoir Patrice,

                      J'espère que tu vas bien.

                      J'ai modifié le type des quantités en variant, le numérodumenu en boolean. Je n'ai plus le message incompatibilité de type mais une nouvelle erreur, toujours au même emplacement : argument ou appel de procédure incorrect.
                      les quantités de type variant peuvent-elle avoir une propriété Value ? Sinon, laquelle faut-il mentionnée ?
                      Bonnes soirée et continuation.
                      0
                      1. Bonjour,

                        Il ne faut pas modifier le type de variable des éléments de la variable personnalisée nommée Listemenusjournaliers !
                        Les quantités en Single et Numérodumenu en Byte, c'est très bien.

                        Le problème ne se situe pas du tout à ce niveau, il s'agit d'une incompatibilité de type entre ces deux lignes :
                        Call Créermenusjournaliers(cboDatedumenu.Value, cboCodeslégumes.Value, cboLégumes.Value, cboJourslégumes.Value, cboConditionnementlégumes.Value, _
                        cboDestinationlégumes.Value, txtQuantitélégumes.Value, cboCodelégumedeux.Value, cboLégumedeux.Value, cboJourlégumedeux.Value, cboConditionnementlégumedeux.Value, _
                        cboDestinationlégumedeux.Value, txtQuantitélégumedeux.Value, cboCodesviandes.Value, cboViandes.Value, cboJoursviandes.Value, cboConditionnementviandes.Value, _
                        cboDestinationviandes.Value, txtQuantitéviandes.Value, cboCodesdesserts.Value, cboDesserts.Value, cboJoursdesserts.Value, cboConditionnementdesserts.Value, _
                        cboDestinationdesserts.Value, txtQuantitédesserts.Value, cboCodesobservations.Value, cboObservations.Value, cboMoisconcernés.Value, cboNumérodumenu.Value)
                        et
                        Public Sub Créermenusjournaliers(Datedumenu As Date, Codeslégumes As String, Légumes As String, Jourslégumes As String, Conditionnementlégumes As String, _
                        Destinationlégumes As String, Quantitélégumes As Single, Codelégumedeux As String, Légumedeux As String, Jourlégumedeux As String, Conditionnementlégumedeux As _
                        String, Destinationlégumedeux As String, Quantitélégumedeux As Single, Codesviandes As String, Viandes As String, Joursviandes As String, _
                        Conditionnementviandes As String, Destinationviandes As String, Quantitéviandes As Single, Codesdesserts As String, Desserts As String, _
                        Joursdesserts As String, Conditionnementdesserts As String, Destinationdesserts As String, Quantitédesserts As Single, Codesobservations As String, _
                        Observations As String, Moisécoulés As String, Numérodumenu As Byte)

                        Tous les arguments (données) que tu transfères à la procédure (2° ligne) depuis l'appel de procédure (1° ligne) sont directement issus de ComboBox ou de TextBox, c'est-à-dire qu'ils sont tous de type String.
                        De son coté, la procédure attend des données de type Single (les quantités), de type String (les textes) et de type Byte (le numéro du menu).

                        Quand un Single reçoit un String ou quand un Byte reçoit un String, celà provoque une erreur « Incompatibilité de type »

                        Pour résoudre ce problème il faut qu'il y ait concordance entre le type de chaque donnée envoyée et le type de chaque donnée attendue.
                        Trois solutions pour cela :
                        - envoyer les bonnes données (i.e. converties dans le type ad hoc) dans l'appel de procédure.
                        - modifier le type des données attendues par la procédure (tous en String) et convertir ces données dans la procédure pour éviter l''erreur "Incompatibilité de type" lors du traitement de ces données dans la procédure.
                        - Modifier la procédure (et donc l'appel de procédure) pour recevoir un type de donnée personnalisée qui contient toutes les données attendues.

                        Dans les trois cas, il faut utiliser les fonctions de conversion pour passer du type String provenant du formulaire vers le type Single (CSng) attendue pour les quantités ou vers le type Byte (CByte) pour le numéro du menu.

                        Bien qu'elle nécessite de revoir la totalité du code existant, la troisième option est celle qui apportera la plus grande facilité de lecture du code par tous, y compris par toi quand tu devra le modifier après une longue période d'utilisation sans problème (ça c'est du développement durable !)

                        La première ligne deviendrait :
                        Call Créermenusjournaliers(Meslistesmenusjouranliers)
                        et la seconde :
                        Public Sub Créermenusjournaliers(Meslistesmenusjouranliers)

                        C'est plus simple et plus lisible, d'autant qu'actuellement tu n'utilises pas la variable Meslistesmenusjouranliers.
                        0
                        1. PS : j'ai oublié le type Date à convertir avec CDate()
                          0
                      2. Bonsoir Patrice,
                        J'espère que tu vas bien et que tu as passé une bonne journée.

                        Je veux bien utiliser les fonctions de conversion mais je n'ai rien compris dans les exemples données dans l'aide. J'ai essayé en remplaçant dans le module Listemenusjournaliers String par CString, Date par NewCdate (il m'a été signalé d'utiliser New) et Byte par Cbyte. Mais j'ai eu encore une erreur différente des autres.
                        Pourrais-tu me donner un modèle de code qui utiliserait une conversion (d'après mon programme évidemment) et me préciser s'il conviendrait de le faire pour toutes les zones de liste modifiable, les zones de texte et un exemple pour les appels de procédure (Créermenusjournaliers et Remplacermenusjournaliers) et ailleur, éventuellement. Quelqu'un m'a conseillé d'utiliser ByVal : qu'en penses-tu ?
                        D'avance merci.
                        Bonnes soirée et continuation.
                        0
                        1. Bonjour,

                          Je ne t'ai jamais demandé de remplacer String, Date et Byte par quoi que ce soit !!!!

                          Quand à l'emploi de ByVal, je ne vois quel est le rapport avec ton problème d'incompatibilité de type

                          Je veux bien te proposer un début de solution (je l'ai déjà fait dans ma réponse précédente).
                          Avant tout, il faut changer le nom du module Listemenusjournaliers (je te conseille d'employer mListemenusjournaliers) pour éviter toute ambiguïté avec la variable de type personnalisée qui porte le même nom.
                          Ensuite, il faut que tu m'explique dans quel but tu as créé la variable Meslistesmenusjouranliers (ligne 35 du module ci-dessous, il faudrait peut-être l'appeler Meslistesmenusjournaliers mais pour l'instant c'est sans importance) et surtout pourquoi tu ne t'en sers jamais !

                          'Code du module Listemenusjournaliers
                          Option Explicit
                          'Type de données personnalisées
                          Type Listemenusjournaliers
                          Datedumenu As Date
                          Codeslégumes As String
                          Légumes As String
                          Jourslégumes As String
                          Conditionnementlégumes As String
                          Destinationlégumes As String
                          Quantitélégume As Single
                          Codelégumedeux As String
                          Légumedeux As String
                          Jourlégume As String
                          Conditionnementlégume As String
                          Destinationlégumedeux As String
                          Quantitélégumedeux As Single
                          Codesviandes As String
                          Viandes As String
                          Joursviandes As String
                          Conditionnementviandes As String
                          Destinationviandes As String
                          Quantitéviandes As Single
                          Codesdesserts As String
                          Desserts As String
                          Joursdesserts As String
                          Conditionnementdesserts As String
                          Destinationdessserts As String
                          Quantitédesserts As Single
                          Codesobservations As String
                          Observations As String
                          Moisconcernés As String
                          Numérodumenu As Byte
                          End Type
                          Public Meslistesmenusjouranliers As Listemenusjournaliers
                          Public Classeurmenus As Workbook
                          Public Classeurlistedechoixlégumes
                          Public Classeurlistedechoixviandes
                          Public Classeurlistedechoixdesserts
                          Public Classeurlistedechoixobservations
                          Public Classeurmoisconcernés
                          Public Monchemin

                          Comme je t'ai déjà dit : Bien qu'elle nécessite de revoir la totalité du code existant, la troisième option est celle qui apportera la plus grande facilité de lecture du code par tous, y compris par toi quand tu devra le modifier après une longue période d'utilisation sans problème (ça c'est du développement durable !)

                          L'appel de procédure deviendrait :
                          With Meslistesmenusjouranliers
                            .Datedumenu = CDate(cboDatedumenu.Value)
                            .Codeslégumes = cboCodeslégumes.Value
                            .Légumes = cboLégumes.Value
                            .Jourslégumes = cboJourslégumes.Value
                            .Conditionnementlégumes = cboConditionnementlégumes.Value
                            .Destinationlégumes = cboDestinationlégumes.Value
                            .Quantitélégume = CSng(txtQuantitélégumes.Value)
                            ' Etc.
                            ' Etc.
                            ' Jusqu'à :
                            .Numérodumenu = CByte(cboNumérodumenu.Value)
                          End With
                          Call Créermenusjournaliers(Meslistesmenusjouranliers)
                          
                          et bien sûr il faudrait modifier la procédure :
                          'Procédure Créermenusjournaliers
                          Public Sub Créermenusjournaliers(UneListe As Listemenusjournaliers)
                          Dim Ligneajout As Integer
                            With Classeurmenus.Sheets("Récapitulatif menus")
                              Ligneajout = .Range("A1").End(xlDown).Row + 1
                              .Range("A" & Ligneajout).Value = UneListe.Datedumenu
                              .Range("B" & Ligneajout).Value = UneListe.Codeslégumes
                              .Range("C" & Ligneajout).Value = UneListe.Légumes
                              'Etc.
                              'Jusqu'à :
                              .Range("AC" & Ligneajout).Value = UneListe.Numérodumenu
                            End With
                            With Classeurmenus.Sheets("Menus")
                              Ligneajout = .Range("A1").End(xlDown).Row + 1
                              .Range("A" & Ligneajout).Value = UneListe.Datedumenu
                              .Range("B" & Ligneajout).Value = UneListe.Légumes
                              'Etc.
                              'Jusqu'à :
                              .Range("C" & Ligneajout).Value = UneListe.Numérodumenu
                            End With
                           End Sub
                          

                          Il faut reconnaitre que c'est bien plus facile à lire et a comprendre que le code actuel !

                          Bien évidemment, cela suffit à régler ton problème actuel, mais pas les suivants, il faut aussi appliquer la même méthode aux autres procédures
                          0
                          • 1
                          • 2