Public Const nom = valeur ' Commentaire
1. En informatique, on ne peut pas utiliser un nom qui n'a pas été déclaré
Le message d'erreur est réaliste : "le préfixe 0 inconnu."
Vous pouvez vérifier que vous avez défini le premier préfixe indCaC1HPrefSevere et le dernier indCaC1HprefDemoniaque. C'est une optimisation qui vous a évité d'avoir à déclarer toutes les constantes intermédiaires entre les deux bornes minimum et maximum de préfixe.
Maintenant vous utilisez justement un préfixe non défini indCaC1HPrefAgile qui est un préfixe intermédiaire entre les deux bornes citées. Et comme l'optimisation a consisté à ne pas déclarer ces suffixes, indCaC1HPrefAgile n'existe donc pas et ne peut pas être utilisé lors de l'appel de la fonction IdObjFromProper(). Même problème pour le suffixe indCaC1HsuffSuicide, la constante n'a pas été définie pour faciliter l'ajout de l'objet CaC1H. Cela veut dire que l'on ne peut pas l'utiliser.
Alors comment faire ?
- Soit on annule l'optimisation et on décide de saisir toutes les constantes de supports, préfixes, suffixes mais cela risque d'être long...
- Soit comme il s'agit d'un test interne temporaire, on remplace lors de l'appel IdObjFromProper() dans la fenêtre d'Exécution immédiate les constantes intermédiaires manquantes par leur numéro dans la famille en consultant manuellement la table qui les positionnent.
Il ne faut pas perdre de vue l'idée du principe basique d'une constante. C'est donner un nom à un nombre. C'est tout. Pour faire comprendre cette association, on choisit un nom court judicieux et on commente sur la même ligne après la valeur de la constante.
Si le nom n'a pas été défini pour faciliter l'ajout d'objet, on ne peut pas utiliser un tel nom mais on doit utiliser le nombre que la constante représenterait si elle est définie.
Dans la fenêtre d'Exécution immédiate :
Code:
? IdObjFromProper(indObjCaC1H, indCaC1HSuppCieux, 17, 18)
303106563
Code:
? ObjToString(303106563)
Hand Gun1: Pg des cieux, Agile, Suicide
Si on ne veut pas aller chercher dans la table des préfixes quel n° a le préfixe "Agile", alors il faudrait définir la constante indCaC1HPrefAgile = 17 avant de l'utiliser pour le test d'IdObjFromProper().
Définir une constante c'est dire à VBA que je ne veux plus utiliser 17 qui n'a pas de sens. Je préfère utiliser indCaC1HPrefAgile. Si on ne dit pas à VBA que indCaC1HPrefAgile = 17, il ne peut pas le deviner. L'erreur a finalement été capturée : "Préfixe 0 inconnu".
Ainsi à la question si on pouvait supprimer les constantes de support et suffixe d'Aad, la réponse est oui. Vous l'avez fait en version 0.6. Mais le développeur ne pouvait plus utiliser leurs noms et il était obligé de consulter la table correspondante sur la feuille "Armes à distances" pour savoir quel n° elles représentaient.
Comme le travail de définition des constantes de Ring et Aad a été fait, on ne voit pas pourquoi le développeur se priverait de leurs noms pour tester la gestion du Stock par StockInit(). Ce n'est pas pour rien que l'on a demandé que le Stock et la Cible utilisent des objets déjà connus qui ont été complètement décrits alors que les nouveaux objets sont décrits de façon partielle.
2. Design vs. run-time
A votre question sur le bouton que vous ne pouvez plus déplacer, on a répondu en distinguant le mode design pour le développeur et le mode run-time pour l'utilisateur.
- Quand vous appelez la fonction IdObjFromProper() dans la fenêtre d'Exécution immédiate, vous êtes en mode design c-a-d que vous testez une fonction en tant que développeur.
- Quand vous cliquerez sur le bouton "Recherche des Solutions" sur la feuille, vous serez un utilisateur qui n'a même pas connaissance qu'il existe une fenêtre d'Exécution immédiate et comment l'utiliser pour tester unitairement chaque fonction.
Si on détaille les deux rôles, c'est qu'il peut avoir confusion entre les deux par rapport à votre réponse : "Dans mon idée, les colonnes sont bien placées actuellement sur la feuille Fusion".
C'est une réponse d'utilisateur de la feuille qui peut vouloir ou non arranger ses colonnes comme il le souhaite.
La question que je posais est une question de développeur. Il n'est pas demandé de changer l'organisation de la feuille Fusion mais de la décrire pour utilisation dans une macro.
3. L'analogie du robot
Imaginez que vous expliquez à un utilisateur comment utiliser votre feuille mais vous êtes à distance au téléphone. Cet utilisateur est un peu spécial. Il ne sait pas lire les intitulés des entêtes de tableau tant qu'on ne lui dit pas où est le tableau dans la feuille.
Imaginez que vous devez piloter un robot pour entrer la Cible dans la feuille "Fusion". Au téléphone, vous n'allez pas lui dire si les cellules qu'il doit saisir "sont bien placées actuellement sur la feuille Fusion".
Vous allez lui communiquez dans quelles colonnes et dans quelles rangées il doit cliquer et saisir la cible.
Le robot ne comprend que les déclarations de constantes. Il demande donc que vous définissiez, dans le module ModMerge ligne 298, le nom et la valeur de chaque colonne et les zones de rangées en commentant vos déclarations de constantes.
Si le robot doit lire la cible, indiquez où il doit la trouver.
Si le robot doit lire le stock, indiquez où le stock commence et où il finit.
Si le robot doit écrire les solutions, indiquez où il doit écrire la première solution, la seconde solution, etc.
Vous pouvez vous inspirer de la convention de nommage qui a été utilisé dans la description informatique de feuille "Données de fusion" dans le module ModMerge.
On notera que la description des constantes de rangée commence toujours par "row" + un nom dont la première lettre est en majuscule.
Idem pour les constantes de colonne où le préfixe est "col".
Si on prend l'exemple du premier tableau de corrélation, comment a-t-il été décrit ?
En ligne 38 on a indiqué au robot qu'il trouverait les rangées du tableau de corrélation des supports de l'objet Ring grâce aux deux constantes suivantes :
Code:
1 2
| Public Const rowRingSuppStart = 6 ' Première rangée de la famille RingSupp
Public Const rowRingSuppEnd = rowRingSuppStart + nbrMaxRingSupp - 1 ' Dernière rangée de la famille RingSupp |
Mais ce n'est pas suffisant de décrire la zone de rangées de début et de fin.
Il faut indiquer au robot également dans quelle colonne :
Code:
Public Const colObjFirst = 5 ' Colonne E de la matrice par support, prefixe, suffixe
Le robot demande alors : où dois-je trouver les noms de support car dans l'optimisation d'ajouts d'objets, il n'a été déclaré que le premier support et le dernier support des nouveaux objets ? La réponse que le robot comprend est alors un nom de colonne, une valeur, un commentaire :
Code:
Public Const colObjName = 35 ' Colonne AI Nom de chaque support, prefixe, suffixe
4. Décrire la feuille Fusion avec des constantes nommées et commentées
A vous maintenant de créer les nouvelles constantes de description de la feuille Fusion pour indiquer au robot où trouver la Cible, où trouver le Stock de quelle rangée à quelle rangée -- si la rangée de fin est variable indiquez le critère de fin tel que jusqu'à la prochaine ligne vide -- et finalement où afficher la ou les solutions ?
Le robot ne sait pas interpréter le langage naturel tel que "E15 F15 G15 étant vide".
Il ne comprend que le style de référence de cellule R1C1 décomposé en rowStroumphette = NN et colStroumphette = NN ' Commentaire
dans les déclarations de constantes commentées du module ModMerge :
Code:
Public Const nom = valeur ' Commentaire
La structuration par le nom de la constante
1. Les coordonnées L1C1 sont plus rapides que "B4" pour Excel VBA
Citation:
Envoyé par
Mangaku
La cible: B4 C4 D4
Le stock: E4 F4 G4 + E5 F5 G5 + E6 F6 G6 + .... Jusqu'a ce que Ex Fx Gx soit blank
Solution: soit à partir de la colonne "I" soit sur une nouvelle feuille.
Cette réponse est correcte mais le robot n'aime pas trop les coordonnées dans le style B4.
En réalité, il pourrait les comprendre avec l'expression Range("B4") mais c'est moins optimisé que d'utiliser la notation attendue car "B4" est une chaîne de caractère plus longue à traiter que les fameuses constantes numériques qui sont attendues.
Pour faciliter la traduction de B4, cliquez sur l'Excel menu "Outils" > "Options" > onglet "General"
Cochez l'option [x] L1C1 reference style (R1C1 en anglais)
Le B s'est transformé en 2 dans les entêtes de colonne sur la feuille car c'est la seconde lettre de l'alphabet.
C'est assez évident pour B. Ce l'est moins pour la colonne 35 "AI". La première fois que j'ai vu la feuille Données de Fusion, je n'ai pas eu l'idée de scroller horizontalement jusqu'à la 35ème colonne. Les constantes servent également à indiquer qu'il y a des noms en colonne 35.
2 sera donc la valeur attendue pour l'information de colonne où le robot trouvera le support de la cible.
2. Un nom de constante trop compliqué
Vous êtes très proche d'une solution.
Citation:
Envoyé par
Mangaku
Code:
Public Const rowTargetSuppStart = 4 ' Première ligne de l'objet cible
La première constante rowTargetSuppStart a été définie correctement. La valeur 4 est exactement ce qui était attendue.
Cependant sur cette rangée on trouve tout aussi bien le support, le préfixe et le suffixe de la cible et même du premier objet du Stock. Il n'est pas donc utile d'indiquer Supp. Cette information ne sera nécessaire que pour l'information de colonne.
Vous avez également complété le nom par Start, ce qui suppose qu'il y a un End. Hors il n'y a qu'une seule cible. Cela veut dire qu'il ne faut pas de Start dans le nom de la cible et encore moins le commentaire "Première ligne" puisqu'il n'y aura qu'une ligne cible. Réserver Start pour la constante de stock car il y a plusieurs objets dans le Stock.
En conclusion, le solution de la rangée de la cible est simplement :
Code:
Public Const rowTarget = 4 ' Ligne de l'objet cible
Reste à créer les noms des trois colonnes.
Idem pour le stock et la zone de solutions.