Incompatibilité de type
RésoluJ'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
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.
-
Voici le nouveau fichier Codes légumes sans les procédure CréerCodeslégumes ni RemplacerCodesLégumes. J'espère avoir compris ton observations puisque j'ai déplacé les deux procédures après un end sub. Que penses-tu de ce nouveau fichier ? Faut-il prévoir un tri et un enregistrement du classeur Codes légumes.xlsx ? Une mise à jour de la liste déroulante est-elle toujours nécessaire ? L'initialisation de l'UserForm frmCodeslégumes est-elle toujours obligatoire ? Merci de me répondre à ces différentes questions afin que j'apporte les modification adéquates.
https://www.cjoint.com/c/FKiqNARjk4J -
Bonjour Patrice,
Normalement le classeur Légumes est de format xlsm (enfin chez moi).
J'envisage de créer des formulaires afin de prévoir mes menus 2017. Jusqu'ici, je le faisais avec des clics et je me suis inspiré de mes menus 2016 pour créer mes formulaires pour les menus 201.
Pour 2016, il y avait une feuille Paramètres, une feuille saisie, et différentes feuilles pour recevoir les données (menus midi retraite, menus journaliers, menus viandes week-end) et trois feuilles pour calculer les quantités (quantités légumes, quantités viandes, quantités desserts) qui se remplissaient à partir des trois feuilles menus grâce à des fonctions.
La feuille paramètre a été remplacée par les fichiers codes légumes, codes desserts, codes viandes, codes observations, légumes, desserts, viandes, etc. À partir de ces différentes ficjiers, j'ai créé les fichiers liste de choix Légumes, liste de choix viandes, liste de choix desserts qui se remplissent à partir des fichiers codes, légumes, viandes,etc de format xlsx. Le fichier menus.xltm est rempli à partir des trois fichiers Liste de choix légumes, liste de choix viandes, liste de choix desserts, liste de choix observations, ainsi que du classeur Mois concernés.xlsm. Ce qui serait bien c'est que le fichier Menus.xltm se remplisse automatiquement à partir des classeurs listes de choix : exemple : je tape un code légumes : les données légumes, jours légumes, conditionnement légumes, destination légumes correspondant à ce code devraient surgir alors automatiquement, quitte à transformer les cbo en zone de texte ou autre pouvant accepter cette manipulation. Voir fichier Menus 2015.xlsm joint.
https://www.cjoint.com/c/FKipxd5XcLJ
Initialement, je pensais créer des fichiers modèles pour m'en servir l'année suivante (d'où XLTM);vu la manière dont cela fonctionne, il est possible que des fichiers XSLM suffisent.
Voilà pour l'instant, une première réponse.
Je viens d'imprimer les deux livres dont tu m'as parlé (lex variables en vba excel et formation excel)
Merci pour ton aide très précieuse.
Bonnes fin de journée et continuation.
ps : excuses-mo si tu me trouves répétif pour les début et fin de message (bonjour Patrice, merci pour ton aide... et bonnes fin de journée et continuation), mais quand commencé à fréquenter le forum, je ne le mettais pas et j'ai eu des réflexions et même des insultes pour mon impolitesse.
BUDGETS -
Bonjour,
Tout reprendre à zéro est un bon début.
Cependant, pour que je puisse t'aider de façon constructive, il faut impérativement que je comprenne les différents objectifs du projet, ce qui est loin d'être le cas actuellement.
Il faut notamment que tu me précises la raison de certains choix qui m'échappent totalement :
1 - Pourquoi le Classeur Légumes est-il au format xltm (modèle) plutôt que xlsm (fichier normal avec macros) ?
2 - A quoi sert-il exactement ? : on peut seulement ajouter des codes mais pas les supprimer ni les modifier.
3 - Pourquoi ne pas simplement corriger directement le fichier « Classeur codes légumes » de façon manuelle ?
4 - Dans le cas ou l'utilité du formulaire serait avérée, pourquoi ne pas le mettre dans le même fichier que les codes ?
J'ai encore de très nombreuses interrogations, notamment pourquoi autant de fichiers lorsqu'un ou deux suffiraient, mais cela viendra plus tard, commençons par le début.
Pour répondre à ta question : « j'ai le message d'erreur un module n'est pas un type valable », c'est tout à fait normal :
On ne peut pas commencer à écrire une nouvelle procédure à l'intérieur d'une autre. Il faut impérativement terminer la précédente (par End Sub) avant d'en commencer une nouvelle.
Pour éviter ce genre de problème tu devrais indenter ton code, comme indiqué page 43 de cet Excellent Cours VBA que je t'ai déja conseillé au post 30 : ici. Cela permet de se rendre compte immédiatement qu'il manque une partie du code.
Cordialement
Patrice-
Dans le fichier joint, réponses à tes questions.
Si c'est plus facile pour toi, voici mon adresse mail (tu ne m'as répondu à ce sujet) : xxx@wanadoo.fr
https://www.cjoint.com/c/FKiuPCjB7RJ
(Adresse mail supprimée par la Modération CCM) -
Re,
Désolé il manque un mot dans ma première question et ça change toutes les réponses qui en découlent. :
1 - Pourquoi le classeur (ou fichier) Codes Légumes.xltm est-il au format xltm (modèle) plutôt que xlsm (fichier normal avec macros) ?
et en 4, il s'agit des codes VBA !
Un exemple d'indentation du code VBA : http://www.gaboly.com/VBA/Indentation.html -
@Patrice33740Bonjour Patrice,
J'espère que tu vas bien.
Je viens d'écrire le code de public sub RemplacerCodeslégumes et public sub XréerCodeslégumes. Exécution : message d'erreur : Un module n'est pas un type valide.
Bonnes fin de journée et continuation.
Les deux fichiers classeur codes légumes.xlsx et Codeslégumes.xltm
https://www.cjoint.com/c/FKjp1TelLJJ
https://www.cjoint.com/c/FKjp2wtzzhJ -
@Patrice33740Bonjour Patrice,
J'ai fait des modifications dans le code de public sub Créercodeslégumes et de public sub Remplacer codes légumes. Je ne sais pas si cela correspond à ce que tu avais en tête mais ça marche.
Nouveau fichier Codes légumes.xltm
https://www.cjoint.com/c/FKjqBezfarJ -
Bonjour,
Voici en retour le fichier de macro Code légumes.xlsm :
https://www.cjoint.com/c/FKjsas60lLm
P.S. : je l'ai mis au format normal des macro (xlsm) car tu ne m'as toujours pas dit pourquoi tu utilises le format xltm.
J'ai supprimé une partie ce qui est inutile (il en reste encore) : ce code fonctionne exactement comme le tien (il en reste encore des lignes inutiles que j'ai laissées pour conserver le même fonctionnement, où plutôt le même dysfonctionnement).
J'ai indenté le code pour que tu voies ce que ça présente comme avantage.
Je vois que tu ne comprends le fonctionnement des variables en programmation :
- il est inutiles de déclarer des variables si on ne les utilise pas.
- chaque variable doit être déclarée pour la portée dans laquelle elle est utilisée.
- le type des chaque variable doit correspondre à l'utilisation qu'on va en faire.
Tu t'es lancé dans ce développement en te disant que tu verrais au fur et à mesure plutôt que faire l'analyse préalable (indispensable) de ton besoin : « je suis preneur pour que Menus.xltm soit rempli automatiquement à partir des codes légumes, codes viandes et codes desserts » et de réfléchir à la façon d'obtenir ce résultat (tu aurais du commencer par ça).
Pour réaliser ce projet, il est évident que tu aura besoin d'une base de données correspondant, de préférence unique et qu'en aucun cas tu pourra résoudre ce problème avec une multitude de petits fichiers sans aucun lien entre eux. Il faut donc commencer par structurer cette base de données.
Compte tenu de sa simplicité, l'ensemble de ton projet devrait tenir dans un fichier unique contenant la base de données et toutes les macros.
Patrice
-
-
Bonjour Patrice,
J'ai essayé différentes modifications mais cela ne marche pas. Voir mes messages d'hier soir avec les deux fichiers joints.
Bonnes journée et continuation.
-
Bonsoir Patrice,
J'ai refait mon premier fichier (Codes légumes.xltm) en tenant compte de l'exemple ci-dessus.
À l'exécution, j'ai le message d'erreur un module n'est pas un type valable.
Voir les deux fichiers joints.
https://www.cjoint.com/c/FKhvPmQnY5J
Classeur codes légumes.xlsx
https://www.cjoint.com/c/FKhvP5tvG0J
Codes légumes.xltm
Faut-il prévoir également, comme dans les précédents fichiers, le tri et l'enregistrement du fichier Classeur codes légumes, la mise à jour de la liste déroulante, l'initialisation de l'UserForm, l'ajout de tous les codes légumes ?
Bonnes soirée et continuation.
-
Bonsoir Patrice,
J'ai refait mon premier fichier en tenant compte du modèle ci-dessus.
À l'exécution, j'ai le message d'erreur un module n'est pas un type valide. Voir les fichiers joints.
https://www.cjoint.com/c/FKhvIcg8xgJ
Classeur codes légumes.xlsx
https://www.cjoint.com/c/FKhvJaHibIJ
Codes légumes.xltm
BUDGETS -
Bonsoir Patrice,
J'espère que tu vas bien et que tu as passé une bonne journée.
Je vaiq recommencer tout depuis le départ à partir des renseignements que tu as eu la gentillesse de me fournir.
Tous les fichiers légumes, viandes, desserts (codes, noms, jours, conditionnement, destinations) serviront à exécuter les fichiers listes de choix (légumes, viandes, desserts) lesquels seront utiles pour créer le fichier Menus auxquels s'adjoindront les fichiers observations et mois concernés.
Dans l'hypothèse où j'aurai un problème quelconque, pourrais-je continuer à compter sur ton aide précieuse ?
Si tu as une idée et si cela est possible, pourrait-on envisager que dans le fichier Menus.xltm, si je tape un code légume par exemple, que tout le reste puisse s'inscrire directement à l'écran (nom du légume, jour légume, conditionnement légume, destination légumes) ?
Bonnes soirée et continuation.
BUDGETS -
Public Mesmenusjouranliers : c'est une erreur de frappe, il faut lire journaliers.
D'autre part, je suis basé sur le livre dont je t'ai déjà parlé, j'ai compris certaines choses, pas les autres et je l'ai modifié bêtement (il faut le reconnaître) pour qu'il corresponde à ce que je voulais.
-
Merci Patrice.
Je vais imprimer ton message puis modifier les appels callCréermenusjournaliers et call Remplacermenusjournaliers, les procédures public sub Créermenusjournaliers et public sub Remplacermenusjournaliers et le code d'écriture/lecture dans le fichier Classeur menus.
Bonnes nuit et continuation.
-
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
-
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.
-
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, _
et
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)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. -
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. -
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.-
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/ -
@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.
-
@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 !
-
-
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 -
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 -
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-
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 ! -
@Patrice33740https://www.cjoint.com/c/FKcvhgkDvQL
C'est la dernière liste qui doit correspondre à tous les fichiers xlsx et xltm. -
-
-
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 -
https://www.cjoint.com/c/FKcq7S4dLiL
J'espère que celle-là est la bonne. Au moins, j'aurai appris quelque chose. Merci -
As-tu reçu mon dernier envoi ou faut-il que je recommence ?
- 1
- 2