Incompatibilité de type [Résolu/Fermé]

Signaler
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021
-
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021
-
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.


A voir également:

29 réponses

Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 669
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.
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021

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.

Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021

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
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 669
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).

Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021

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

Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 669
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 !
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 669 >
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021

PS : « Chez moi, les trois fichiers mentionnés s'ouvrent correctement » Avec les liens que tu as fourni ?
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021
>
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021

oui, avec les liens fournis
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021
>
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021

Chez 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.
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021
>
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021

Date 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.
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 669
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.
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021

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
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 669
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.
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021
>
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021

Bonjour Patrice,

J'espère que cela va marcher cette fois-ci.
https://www.cjoint.com/c/FKcnW1HTd6L
Je n'ai pas trouvé ajouter à l'archive. J'ai choisi ce qui me semblait le plus rapprochant.
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 669 >
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021

Tu as posté un fichier rar, pas un zip !
Pour trouver 7-Zip puis ajouter à l'archive, installes 7-Zip : https://www.7-zip.org/
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021

J'ai installé 7zip 64 bits mais à chaque fois que je clique dessus, il propose de l'installer !!!!!!!!!!!!!!!!!!!!!
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 669
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.
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021
>
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021

je 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
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 669
Re,


et

Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021

As-tu reçu mon dernier envoi ou faut-il que je recommence ?
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021

https://www.cjoint.com/c/FKcq7S4dLiL
J'espère que celle-là est la bonne. Au moins, j'aurai appris quelque chose. Merci
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 669
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
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021

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
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 669
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 !
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021
>
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021

https://www.cjoint.com/c/FKcvhgkDvQL
C'est la dernière liste qui doit correspondre à tous les fichiers xlsx et xltm.
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021
>
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021

Je viens de revérifier tout : il y a 48 fichiers.
https://www.cjoint.com/c/FKcv30AyzFL
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 669
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
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021

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
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021

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.
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 669
Voici un des meilleurs cours VBA gratuit pour débutants (et plus si affinités) :
ftp://ftp-developpez.com/bidou/Cours/VBA/formationVBA.pdf

et ici des explications sur l'emploi des variables en VBA :
https://silkyroad.developpez.com/VBA/LesVariables/
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 669 >
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021

PS : 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.
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021
>
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021

Certes 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 !
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021

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.
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 669
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.
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 669
PS : j'ai oublié le type Date à convertir avec CDate()
Messages postés
820
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
29 mai 2021

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.
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 669
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