IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Macro de fusion de données


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur PI
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur PI
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Par défaut Macro de fusion de données
    Salut a tous.

    Je souhaiterais réaliser des macros excel pour.... je vais t'enter d'expliquer.
    J'ai des données d'entrées par type (support, prefixe, suffixe)(les trois étant obligatoire pour un objet complet) qui si on en mélange deux, en donne une troisième (sauf si on mélange les deux même forcément)

    Le but étant de savoir si avec x données on arrive en mélangeant (dans tous les sens possibles) on arrive au résultat que l'on désire (avec affichage de comment avec les données d'entrée arriver au résultat)


    C'est pour un jeux, dans lequel nous pouvons faire évoluer nos personnages avec leurs équipements (comme dans bcp de jeux RPG)
    Le but étant de faire de meilleurs équipements à moindre frais.


    Voici un exemple de donnée d'entées, et sous l'onglet "Fusion" une pseudo vue de ce que je souhaiterais obtenir
    A telecharger
    EDIT: je viens de voir que les liens externes étaient coupés... je ne sais donc pas si mon problème est assez explicite

    (n'est plus approprié)
    Dans mon exemple, les deux prix se tiennent.
    Cependant, j'aurais une préférence pour la deuxieme, car tous les objets utilisés sont moins cher et donc plus facile à trouver.
    Dans ma première solution, les objets de base utilisés sont très cher et donc pas simple à obtenir, et peuvent être utilisé pour faire plus tard de meilleurs équipements !
    J'espère que ca aidera à la compréhension

    Merci

    Kenavo =)

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Par défaut Description de la feuille Excel avec des constantes VBA
    Hello Mangaku,

    Citation Envoyé par Mangaku Voir le message
    J'ai des données d'entrées par type (support, prefixe, suffixe)
    Founir entre les balises [code] et [/code] la description de votre feuille suivant le modèle suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Option Explicit ' RPG game : indiquez ici le commentaire décrivant le projet
    ' =========================== Feuille source des données
    Public Const nameSheetSource = "...." ' nom de la feuille source des données
    Public Const rowObjFirst = 1 ' Première rangée pour l'objet ...
    Public Const rowObjLast = 10 ' Dernière rangée pou l'objet
     
    Public Const colSupport = 1 ' Première colonne de support. Commentez
    Public Const colPrefix = colSupport + 1 ' Qu'est-ce qu'un préfixe dans ce contexte ?
    Public Const colSuffix = colPrefix + 1 ' Qu'est-ce qu'un suffixe dans ce contexte ? Indiquez le type
    Public Const colCost = colSuffix + 1 ' Prix de l'équipement. Idem
    ' =========================== Feuille cible résultat ...
     
    ' Indiquez le nom de la procédure pour mélanger un objet, ses paramètres d'entrée
    ' ses éventuels paramètres de sortie et ce qu'elle doit faire
    Sub MergeObject()
    End Sub
    Suivant la structuration des noms de constantes, on devrait en déduire la structuration du code VBA. Indiquez en commentaire où sont les sources de données (telle que la constante rowSourceData et où on doit afficher le résultat : rowTargetData.

    Citation Envoyé par Mangaku Voir le message
    Le but étant de savoir si avec x données on arrive en mélangeant (dans tous les sens possibles) on arrive au résultat que l'on désire (avec affichage de comment avec les données d'entrée arriver au résultat)
    Le but étant de faire de meilleurs équipements à moindre frais.
    Evitez les parenthèses, cela complexifie inutilement.
    Etre concret au lieu de "x données", précisez le type des données et une exemple simple de jeu de test minimal.
    Décrire avec précision dans les commentaires des constantes les données en entrée et le résultat attenu.
    ___________

    En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert ci-dessous.

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur PI
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur PI
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Par défaut
    Une réponse
    Je me désespérais =)

    Pour répondre aux questions, j'ai justement mit le lien vers le fichier XLSX.

    Les données sont un tableaux.
    Ou le croisement en X et Y donne une valeur définie.
    Si on reprend cette valeur, et que l'on regarde ce qu'elle donne avec une autre valeur, donc toujours selon X ou Y, on obtiendra une nouvelle valeur.

    Le nom des constantes est tout a fait variable.
    Peut etre justement créer un code en mettant des 1,2,3,4,5,6,7 en fonction plutot que des noms?
    Un peu comme dans mon fichier sous l'onglet "anneau"
    ???

    Ma demande est assez étrange, et même moi je ne sais comment le définir.
    Je comprends ce que je veux (forcément) mais je ne vois pas comment l'expliquer plus qu'avec mon fichier joint au premier post

    Je suis pas dedans moi... les liens externes ne fonctionnent pas
    -____-'

    Je vous mets trois images du fichier explicatif:
    Le premier pour un onglet "anneau"
    Un pour l'onglet Arme a Distance
    L'autre pour ce que je souhaiterais: les fusions.
    Sachant qu'il y a de nombreux autres onglets d'objets: anneau, amulette, arme une main, arme deux main, pantalon, armure, casque...
    ---------------------------------
    ---------------------------------
    EDIT:
    Plus d'actualité
    ---------------------------------
    ---------------------------------

    Merci, et désolé de mon manque d'attention

    PS: les images sont grandes, mais le forum ne les accepte pas autrement

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Par défaut
    Probablement dans un premier temps les deux premières captures arrivent trop tôt.
    Partez de la dernière plus synthétique et décrivez chaque colonne telle que Cible, En Stock, Prix et comment retrouver l'information comme le Prix en commentaire selon le principe basique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Option Explicit ' RPG game to merge  object
    Public Const nomDeLaConstante = valeur ' Commentaire
    On voit deux solutions structurées en étapes. Expliquez en commentaire de votre programme MergeObject() la règle d'égalité, la création de la 1ere étape et le passage d'une étape à l'autre ainsi que l'optimisation du prix.

    Selon votre niveau d'implication dans votre projet, vous aurez des lecteurs qui pourront s'intéresser à votre projet et répondre à des questions précises.

    Citation Envoyé par Mangaku Voir le message
    Pour répondre aux questions, j'ai justement mis le lien vers le fichier XLSX.
    C'est beaucoup trop facile de dire aller voir dans mon classeur. Ce qui est demandé est la structuration du projet à travers les noms des constantes et le nom de la procédure à appeler car c'est votre projet. C'est vous qui allez le faire. Ceux ne sont pas les lecteurs qui participent à la discussion. On peut guider, mais on ne peut faire tout le job à votre place car en général cela ne conviendra pas à ce que vous souhaitez si ce n'est pas bien détaillé dès le départ en commentaire de votre module.

    Citation Envoyé par Mangaku Voir le message
    Les données sont un tableaux.
    Ou le croisement en X et Y donne une valeur définie.
    Si on reprend cette valeur, et que l'on regarde ce qu'elle donne avec une autre valeur, donc toujours selon X ou Y, on obtiendra une nouvelle valeur.
    Voilà une description extrêmement abstraite de n'importe quel classeur Excel alors qu'il faut être le plus concret possible et parlez de ce qu'il y a dans votre classeur. Où se trouve l'objet pouvoir magique, épée, armure, etc. S'il y en a beaucoup, vous vous demanderez et si je les classe en famille dont les objets ont des propriétés communes ? D'où le choix des libellés d'en-tête de colonnes.

    Qu'est-ce qu'on peut acheter ? Combien cela coûte ? De quelle rangée à quelle autre rangée ? Dans quelle colonne. Etc. Où doit-on afficher le résultat ?

    Citation Envoyé par Mangaku Voir le message
    Le nom des constantes est tout a fait variable.
    Peut être justement créer un code en mettant des 1,2,3,4,5,6,7 en fonction plutôt que des noms?
    C'est exactement ce qu'il faut éviter. La structuration du projet passe par une vision claire de ce qu'il y a dans les feuilles et ce qu'il faut produire. La valeur des constantes n'a aucune importance. Ce qui importe est comment vous allez nommer les constantes, les variables, au moins le nom de la procédure principale car cela participe à la construction de la structure du projet surtout si, comme cela a été conseillé, vous commentez chaque constante.

    Citation Envoyé par Mangaku Voir le message
    je ne vois pas comment l'expliquer plus qu'avec mon fichier joint au premier post
    C'est pour cela que j'ai pris le temps de fournir un exemple concret pour que vous puissiez dès maintenant créer votre module ModRpg et décrire ce que vous voyez dans votre feuille. Il ne faut pas répondre dans les dix minutes. Il faut prendre le temps d'analyser le projet.

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur PI
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur PI
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Par défaut
    Citation Envoyé par MattChess Voir le message
    Partez de la dernière est décrivez chaque colonne telle que Cible, En Stock, Prix et comment retrouver l'information comme le Prix.
    Pour ce qui est du stock disponible, il faudra le rentrer à la main.
    Car cela permettrait en plus de regarder les possibilités avec des objets que l'on serait susceptible d'obtenir, donc de prévoir un peu à l'avance.
    Pour le prix, ceci n'est qu'une indication. Comme je le dis, un prix plus élevé peut etre plus avantageux quand meme.
    C'est juste que au final, il n'est pas un facteur primordial, et que ce n'est un facteur que seul celui qui fera les fusions calculera et prendra en compte.


    Citation Envoyé par MattChess Voir le message
    On voit deux solutions structurées en étapes. Expliquez en commentaire de votre programme MergeObject() la règle d'égalité, la création de la 1ere étape et le passage d'une étape à l'autre ainsi que l'optimisation du prix.
    La première étape serait de:
    - fusionner deux objets
    => si objet obtenu = objet désiré, retenir la solution, et essayer avec une nouvelle combinaison
    => si objet obtenu différent de l'objet désiré, garder objet obtenu en vue de le fusionner avec un autre en stock + essayer avec une nouvelle combinaison d'objets


    Citation Envoyé par MattChess Voir le message
    Voilà une description extrêmement abstraite de n'importe quel classeur Excel alors qu'il faut être le plus concret possible et parlez de ce qu'il y a dans votre classeur. Où se trouve l'objet pouvoir magique, épée, armure, etc. Qu'est-ce qu'on peut acheter ? Combien cela coûte ? De quelle rangée à quelle autre rangée ? Dans quelle colonne. Etc. Où doit-on afficher le résultat ?
    Justement la est mon problème.
    On peut tout acheter. Mais on a pas tout en stock. Pour ca que le stock rentré "à la mano" semble la bonne solution.
    Avec ce stock, et avec les relations définies sous les autres onglets (onglet anneau par exemple) regarder avec le stock rentré à la main ce que l'on peut obtenir, et si on peut obtenir ce que l'on désire (l'objet que l'on aura renté comme désiré) afficher comment le faire.


    Citation Envoyé par MattChess Voir le message
    C'est exactement ce qu'il faut éviter. La structuration du projet passe par une vision claire de ce qu'il y a dans les feuilles et ce qu'il faut produire. La valeur des constantes n'a aucune importance. Ce qui importe est comment vous allez nommer les constantes, les variables, au moins le nom de la procédure principale car cela participe à la construction de la structure du projet surtout si, comme cela a été conseillé, vous commentez chaque constante.
    La structure principale peut se nommer merge(), mais selon que ce soit des anneau, des amulette, des pantalon, les relations entre les objets sont à chaque fois nouveau. D'ou les nombreux onglets/relations entre les données d'entrées


    Voici un exemple de ce que j'ai déjà pu faire:
    Chapeau Splendide Du Berger (+1) et Casquette Paresseuse De La Précognition (+1).
    Comme résultat, tu as obtenu: Diadème Sanglant Du Sang (+1).

    Casquette D`Assaut De L`Explorateur (+1) et Masque Serviable De La Punition (+1).
    Comme résultat, tu as obtenu: Masque Magnétique De La Protection (+1).

    Diadème Sanglant Du Sang (+1) et Masque Magnétique De La Protection (+1).
    Comme résultat, tu as obtenu: Cagoule Splendide Du Gladiateur (+1).

    Masque Guerrier De La Précognition (+1) et Cagoule Splendide Du Gladiateur (+1).
    Comme résultat, tu as obtenu: Cagoule Splendide De l`Adrénaline (+1).

    Diadème Tigre Du Sang (+1) et Cagoule Splendide De l`Adrénaline (+1).
    Comme résultat, tu as obtenu: Chapeau Tigre De l`Adrénaline (+1).
    J'avais donc comme stock:
    Chapeau Splendide Du Berger (+1)
    Casquette Paresseuse De La Précognition (+1)
    Casquette D`Assaut De L`Explorateur (+1)
    Masque Serviable De La Punition (+1)
    Diadème Tigre Du Sang (+1)
    On voit que des résultats intermédiaires ont été utilisés pour faire des fusions par la suite.
    Et que du A+B+C nous a donné le résultat final.


    En espérant avoir été plus explicite, ou plus clair.
    (jamais été très bon pour expliciter tout ce que j'ai en tête )

    EDIT: pas l'habitude de noter. Effectivement, +1 pour ton aide, et ton orientation dans les explications que je peux donner

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Par défaut Description statique des feuilles RPG Fusion en Excel VBA
    La description ci-dessus est parfaite ... dans un forum RPG.
    Dans un forum Excel VBA, vous allez transcrire vos réponses du langage naturel en langage VBA.

    Ce qui est demandé pour votre prochain message est de poster le code de votre module ModMerge entre les balises [code] et [/code]. Quand vous ne savez pas la syntaxe VBA, vous écrivez la ligne en commentaire VBA c-a-d avec une simple apostrophe ' (quote) en début de ligne. Il faut éviter la complexité des pronoms, relatives, etc. du langage naturel et écrire en commentaire des phrases courtes, une par ligne.

    1. Ouvrir votre classeur Fusion.xls

    2. Cliquez l'Excel menu "Outils" > "Macro" > "Visual Basic Editeur" (Alt+F11) appelé VBE
    Le VBE s'ouvre en avant-plan des feuilles Excel.

    Dans la fenêtre "Project - VBAProject", vous reconnaîtrez votre VBAProject (Fusion.xls) avec la branche "Microsoft Excel Objects" contenant vos trois feuilles "Anneaux", "Armes à Distance", "Fusion" et ThisWorkbook.

    1. Créez le module ModMerge

    Cliquez sur le VBE menu "Insérer" > "Module"
    Une nouvelle fenêtre s'ouvre dans le VBE : c'est la fenêtre d'Edition du code de Module1.

    Dans la fenêtre "Project - VBAProject", la nouvelle branche "Modules" est apparue.
    Elle contient Module1.

    1.1 Préparez l'environnement de développement

    En général on trouve la fenêtre "Propriétés" sous ou à côté de la fenêtre "Project - VBAProject".
    Si ce n'est pas le cas, cliquez sur le VBE menu "Affichage" > "Propriétés" (F4)
    Après un menu, on indique entre parenthèse le raccourci clavier.
    Suivant la langue d'Excel, les libellés des menus peuvent différer. Vous retrouverez le menu à cliquer également grâce au raccourci clavier.

    Tant que vous êtes dans le VBE menu "Affichage", cliquez sur :
    VBE menu "Affichage" > "Fenêtre d'Exécution" (Ctrl+G) (Immediate Window)
    VBE menu "Affichage" > "Fenêtre des Variables Locales" (Locals Window)

    Réarranger la fenêtre d'Exécution immédiate et Locale dans la même rangée sous la fenêtre d'Edition de code qui doit prendre la place prépondérante.

    Dans la fenêtre des Propriétés, renommer "Module1" en "ModMerge".
    Cela n'a pas de sens de laisser le nom par défaut. Bien sûr vous pouvez choisir un autre nom commençant par "Mod" puis un autre nom débutant par une majuscule tel que "ModFusion". Déjà cela montrera au lecteur, le but de votre module en choisissant un nom judicieux.

    2. Description de la feuille "Anneaux"

    Copier le modèle de code du message #2 et coller le dans ModMerge.
    En ligne 3, il y a la constante nameSheetSource = "..."
    C'est à vous à la renommer en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Const nomFeuilleSrcAnneaux = "Anneaux" ' Commentaire ...
    Notez comment on a structuré le nom de la constante par le préfixe "nomFeuille" pour indiquer qu'il s'agit d'une part d'un nom et d'autre part d'un nom de feuille.

    C'est à vous à trouver les abréviations telle que "Src" signifie "Source" de données en donnant l'explication en commentaire. Si on lit l'information dans la feuille nomFeuilleSrcAnneaux, si on n'y écrit jamais, utiliser "Src" dans son nom.
    Voilà le genre d'information indispensable pour qu'une macro puisse utiliser cette feuille.

    Si ce n'est pas le cas par exemple si on peut renseigner c-a-d écrire dans la zone de recherche, expliquez en commentaire de certaines rangées ou colonnes, que c'est là qu'il faudra écrire.

    Cela facilite le projet d'avoir certaines feuilles en lecture seule.
    S'il faut également y écrire, cela complexifie la description et le code final.

    Notez après la valeur "Anneaux" de la constante nomFeuilleSrcAnneaux, l'apostrophe ' qui annonce un commentaire obligatoire. Un commentaire apparaît en vert dans la fenêtre d'Edition de ModMerge.

    Si vous pouvez garantir que cette feuille restera en première position dans le classeur Fusion.xls, alors remplacer cette constante par un n° de feuille, cela sera plus efficace qu'un nom de feuille.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Const indFeuilleSrcAnneaux = 1 ' La feuille  "Anneaux" est la première du classeur. Elle  permet de ...
    Maintenant basculez du VBE vers la feuille Excel de nom nomFeuilleSrcAnneaux ou d'indice indFeuilleSrcAnneaux. On fait exprès d'y faire référence exactement comme le fera votre future macro au lieu de citer son nom "Anneaux".

    2.1 Le premier tableau "Recherche dans les tableaux"

    On y voit une zone "Recherche dans les tableaux"
    Décrivez à quelle rangée cette zone commence.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Const rowSearchSupport = 3 ' Un support est ...
    Public Const rowSearchPrefixe = rowSearchSupport + 1 ' Un préfixe est ...
    Public Const rowSearchSuffixe = rowSearchPrefixe + 1 ' Un suffixe est ...
    On aurait pu écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Const rowSearchSupport = 3 ' Un support est ...
    Public Const rowSearchPrefixe = 4 ' Un préfixe est ...
    Public Const rowSearchSuffixe = 5 ' Un suffixe est ...
    Mais si un jour vous avez besoin d'insérer une rangée ou d'en décaler un autre, il faudra alors tout renuméroter les constantes de rangée. Avec le principe de définir une constante relativement à la constante précédente + 1, on n'aura à modifier que la première constante rowSearchSupport et non pas toutes les constantes.

    Attention il ne faut jamais mettre d'accent dans les noms des constantes, variables, procédures.
    Ce tableau semble (il n'y a que vous pour savoir interpréter correctement chaque tableau) n'avoir qu'une colonne de ... Stroumph ... (inventer le terme qui caractérise cette colonne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Const colSearchStroumph = 3 ' En colonne C = 3ème lettre dans l'alphabet, on trouve ...
    Il vaudrait mieux passer en style de coordonnées R1C1, pour parler de la 3ème colonne au lieu de la colonne C.
    Excel menu "Outils" > "Options" > Onglet "General" Cochez l'option [x] R1C1 reference style

    Notez comment les coordonnées rowSearchSupport et colSearchStroumph partagent le même cœur "Search" qui identifie le fait qu'elles appartiennent au même tableau "Search".

    2.2 Le second tableau

    Dans le second tableau, il faudra trouver un nom bien sûr différent, et expliquez en commentaire pourquoi certaines cellules sont vertes.
    On voit également un chiffre de 1 à 3 au-dessus et à droite du tableau. Indiquez en commentaire le pourquoi de cette numérotation alors qu'on peut la déduire du nombre de rangées et de colonnes.

    2.3 Le troisième tableau

    Dans le troisième tableau étant donné que c'est une matrice 28 x 28, il y a intérêt à trouver une structuration de type : nombre maximum, début et fin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public const nbrMaxStroumphette = 28 ' La famille Stroumphette a 28 ...s
    Public Const rowStroumphetteStart = 15 ' Première rangée de la famille Stroumphette
    Public Const rowStroumphetteEnd = rowStroumphetteStart + nbrMaxStroumphette - 1 ' Dernière rangée de la famille Stroumphette
    C'est comme cela que vous voulez structurer en inventant la famille Stroumphette composée de 28 ...s. Comme pour le tableau précédent, indiquer la signification des cases vertes.

    Attention le fait d'éviter de définir les 28 constantes de rangées et 28 autres de colonnes n'empêche pas une description supplémentaire. la création de la famille Stroumphette impose de décrire chaque élément. Ce n'est plus en terme de colonne ou de rangée mais de n° d'item dans la famille Stroumphette.

    On parle alors de l'énumération des 28 éléments constituant la famille Stroumphette :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public const indStroumphetteBronze = 1 ' Premier élément de la famille Stroumphette. C'est ...
    Public const indStroumphetteArgent = indStroumphetteBronze + 1 ' Second élément. C'est ...
    '...
    Public const indStroumphetteNoir = indStroumphetteFaucon + 1 ' Dernier élément. C'est ...
    C'est clair qu'il conviendra de trouver un nom plus représentatif et plus court que Stroumphette.

    Appliquer la même approche descriptive pour le 4ème tableau.

    3. Description de la feuille "Armes à Distance"

    Maintenant que vous avez vu le principe de nommage des constantes, vous allez le décliner sur la seconde feuille.

    Notez comment en ligne 2 et 11 du modèle du message #2, on a utilisé un commentaire avec des séries de "=========" pour bien marquer (structurer) la séparation entre la description de deux feuilles et commencer la description d'une nouvelle feuille.

    La second feuille de nom nomFeuilleSrcGun ou d'indice indFeuilleSrcGun a une structure identique à la précédente. Il faudra être inventif pour créer des noms de famille représentatifs.

    4. Description de la feuille "Fusion"

    La troisième feuille de nom nomFeuilleTargetMerge ou d'indice indFeuilleTargetMerge a une structure de feuille cible (Target) sur laquelle il faudra vraisemblablement écrire un résultat attendu qu'il va falloir décrire avec précision en commentaire des constantes de rangées et de colonnes.

    On y voit en rangée rowCible = rowStock, une structure identique Objet, Préfixe, Suffixe sauf que le concept de "Support" de la feuille indFeuilleSrcAnneaux a disparu et a été remplacé par le concept d'"Objet" alors qu'il semblerait qu'ils recouvrent le même concept.

    C'est la que vous intervenez pour lever les ambiguïtés parce que si un "Support" est différent d'un "Objet", il va falloir expliquer la différence et donner les règles de passage de l'un à l'autre.

    Une notion de "Prix" est introduite en colonne colPrice. Il faudra indiquer comment on obtient chaque prix. En guise d'exemple, je commence pour vous montrer ce qui est attendu comme commentaire dans ModMerge.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ' Dans le tableau rowStockStart, colPrefix, on trouve "Diamant".
    ' Le prix en colonne colPrice apparaît dans une somme où on reconnaît le nombre "20". 
    ' Dans la feuille indFeuilleSrcAnneaux, "Diamant" est en rangée rowStroumphetteStart + 20 - 1.
    Autrement dit c'est la rangée du 20ème élément "Diamant" dans la famille des Stroumphette.
    Notez comment les phrases sont courtes et tiennent sur une seule ligne préfixée par '

    Si vous ne passez pas une bonne heure à structurer la description de vos feuilles, un tel langage sera incompréhensible si ce n'est pas vous qui crée chaque notion en inventant le nom le plus approprié, vos commentaires étant là pour que les lecteurs puissent vous relire.

    5. Résultat attendu de la fusion

    La feuille indFeuilleTargetMerge propose deux solutions. Cela signifie que l'algorithme doit lister une ou deux solutions dans une combinatoire à définir.

    Au-delà de la description statique par des constantes, on s'intéressera ultérieurement à l'aspect dynamique. Il faudra alors indiquer comment construire chaque solution, évaluer son score c-a-d son prix et lister la ou les deux meilleures.

    Il faudra indiquer en commentaire de la procédure Merge() dans le module ModMerge, le scénario d'une session tel que :
    1. Saisie du stock par l'utilisateur.
    2. Définir la cible souhaitée?
    3. Recherche et affichage du ou des solutions.

  7. #7
    Membre actif
    Homme Profil pro
    Ingénieur PI
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur PI
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Par défaut
    Pfiouuuu. Moi qui y connait rien, j'ai surnagé parfois :o

    J'ai commencé à créer ce qui me semblait... opportun.

    A noter que les feuilles nomFeuilleSrcAnneaux ne sont que des tableaux indicatifs.
    La coloration verte est dépendant de la case "Rechercher dans les tableaux" qui pearmet de faire ressortir ce que l'on cherche, dans le cadre d'une recherche de fusion à la main.

    J'ai refais mon fichier, pour qu'il corresponde peut être plus à ce qui serait utile.

    Citation Envoyé par MattChess Voir le message
    5. Résultat attendu de la fusion

    La feuille indFeuilleTargetMerge propose deux solutions. Cela signifie que l'algorithme doit lister une ou deux solutions dans une combinatoire à définir.
    Dans l'idéal, il faudrait en lister un maximum, afin de justement regarder quelle solution semble la plus "économe"

    Citation Envoyé par MattChess Voir le message
    Au-delà de la description statique par des constantes, on s'intéressera ultérieurement à l'aspect dynamique. Il faudra alors indiquer comment construire chaque solution, évaluer son score c-a-d son prix et lister la ou les deux meilleures.

    Il faudra indiquer en commentaire de la procédure Merge() dans le module ModRpg, le scénario d'une session tel que :
    1. Saisie du stock par l'utilisateur.
    2. Définir la cible souhaitée?
    3. Recherche et affichage du ou des solutions.

    J'ai supprimé la colonne prix, qui n'était qu'à titre indicatif.
    Elle ne sera utile que de manière manuelle. Donc pas à implémenter.

    J'ai aussi modifier Support/Objet. Il s'agissait bien de la même chose.
    Sorry pour l'ambiguité !

    Nouvelle question cependant: peut-on du coup mettre plusieurs données différentes dans la même feuille (Anneau et AAD par exemple) (comme je l'ai fait du coup) ou doit-on créer une feuille par type d'objet ?
    (il faut savoir que j'aurais a terme 10 objets différents possible. Anneau et AAD en étant que deux)

    En espérant avoir un peu comprit tout ça, et donc avoir rempli correctement le fichier.
    Et que ce sera plus clair du coup

    EDIT:
    Si on par sur le principe de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TargetMergeSupport = Range("B4")
    TargetMergePrefixe = Range("C4")
    TargetMergeSuffixe = Range("D4")
    Est ce que l'on a la possibilité de faire en sorte que la valeur de B4 soit comparé avec différentes cases, pour savoir quel type d'objet on va chercher à fusionner (Anneau ou AAD dans le cas du fichier exemple) et ainsi donc, reprendre comme je disais avant, un algorithme ou les support/prefixe/suffixe seront identifiés via des nombres (le but étant de ne partir que sur un algorithme qui prend en entrée un nombre déterminé de valeurs))
    J'ai comme l'impression que ca va pas être clair du tout, tout ce que je viens de rajouter en EDIT

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Par défaut Description de la feuille des objets en Excel VBA
    C'est un début prometteur !

    1. Fusion version 0.7

    Il sera intéressant que vous assurez la gestion d'un numéro de version.
    Le dernier indice .1 indique le nombre de republication pour évolution ou correction de bugs.

    Exemple Fusion07.xls que vous incrémenterez à chaque version.

    1. Ouvrir votre classeur Fusion07.xls
    2. Ouvrir le VBE (Alt+F11)

    Cliquez sur le module ModMerge pour ouvrir sa fenêtre d'Edition de code. Sélectionner l'ancien code et remplacer le par celui après un copier-coller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
    705
    706
    707
    708
    709
    710
    711
    712
    713
    714
    715
    716
    717
    718
    719
    720
    721
    722
    723
    724
    725
    726
    727
    728
    729
    730
    731
    732
    733
    734
    Option Explicit ' Merge : fusion des équipements d'un jeu en ligne
    ' dans le but de trouver un équipement recherché en fonction des équipements que l'on possède déjà
    ' By Mangaku and MattChess, August 20, 2011 Version 0.7
     
    ' =========================== Feuille source des données
    Public Const nomFeuilleSrcDFusion = "Données Fusion" ' Tableau de corrélation des fusions entre les différents éléments
     
    Public Const indObjRing = 1, indObjFirst = indObjRing ' Première famille d'objet Anneaux
    Public Const indObjAmu = indObjRing + 1 ' Amulettes
    Public Const indObjCaC1H = indObjAmu + 1 ' Armes 1 main
    Public Const indObjCaC2H = indObjCaC1H + 1 ' Armes 2 mains
    Public Const indObjHat = indObjCaC2H + 1 ' Casques
    Public Const indObjPant = indObjHat + 1 ' Pantalons
    Public Const indObjArmor = indObjPant + 1 ' Armures
    Public Const indObjAad = indObjArmor + 1 ' Armes à distance
    Public Const indObjLast = indObjAad ' Dernière famille d'objets
     
    Public Const indTypeObj = 0
    Public Const indSupport = 1, indTypePropertyFirst = indSupport ' Première propriété d'un objet
    Public Const indPrefixe = indSupport + 1
    Public Const indSuffixe = indPrefixe + 1
    Public Const indTypePropertyLast = indSuffixe  ' Dernière propriété d'un objet
     
    Public Const nbrRowHeader = 1
    Public Const nbrRowInter = 2 + nbrRowHeader ' Nombre de rangées entre deux tableaux dans une famille
    Public Const nbrRowFamily = 6 + nbrRowHeader ' Nombre de rangées entre deux familles
     
    Public Const colObjFirst = 5 ' Colonne E de la matrice par support, prefixe, suffixe
    Public Const colObjName = 35 ' Colonne AI Nom de chaque support, prefixe, suffixe
     
    ' =======================================================================================================
    ' ================================ Description de chaque famille d'objet ================================
    ' =======================================================================================================
     
    ' ================================ Ring ================================
    ' Données Anneaux Support
    Public Const nbrMaxRingSupp = 3 ' La famille RingSupp a 3 valeurs possibles
    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
     
    Public Const indPropertyFirst = 1
    Public Const indRingSuppAnneau = indPropertyFirst ' Premier support de la famille RingSupp
    Public Const indRingSuppFirst = indRingSuppAnneau
    Public Const indRingSuppBracelet = indRingSuppAnneau + 1
    Public Const indRingSuppChevaliere = indRingSuppBracelet + 1
    Public Const indRingSuppLast = indRingSuppChevaliere ' Dernier support de la famille RingSupp
     
    ' Données Anneaux Prefixe
    Public Const nbrMaxRingPref = 28 ' La famille RingPref a 28 prefixes possibles
    Public Const nbrMaxProperties = nbrMaxRingPref ' Nombre maximum de propriétés
    Public Const rowRingPrefStart = rowRingSuppStart + nbrMaxRingSupp + nbrRowInter ' Première rangée de la famille RingPref
    Public Const rowRingPrefEnd = rowRingPrefStart + nbrMaxRingPref - 1 ' Dernière rangée de la famille RingPref
     
    Public Const indRingPrefBronze = indPropertyFirst ' Premier prefixe de la famille RingPref
    Public Const indRingPrefFirst = indRingPrefBronze
    Public Const indRingPrefArgent = indRingPrefBronze + 1
    Public Const indRingPrefEmeraude = indRingPrefArgent + 1
    Public Const indRingPrefOr = indRingPrefEmeraude + 1
    Public Const indRingPrefPlatine = indRingPrefOr + 1
    Public Const indRingPrefTitane = indRingPrefPlatine + 1
    Public Const indRingPrefRubis = indRingPrefTitane + 1
    Public Const indRingPrefDistingue = indRingPrefRubis + 1
    Public Const indRingPrefAstucieux = indRingPrefDistingue + 1
    Public Const indRingPrefOurs = indRingPrefAstucieux + 1
    Public Const indRingPrefDur = indRingPrefOurs + 1
    Public Const indRingPrefAstral = indRingPrefDur + 1
    Public Const indRingPrefElastique = indRingPrefAstral + 1
    Public Const indRingPrefCardinal = indRingPrefElastique + 1
    Public Const indRingPrefNecromancien = indRingPrefCardinal + 1
    Public Const indRingPrefArchaique = indRingPrefNecromancien + 1
    Public Const indRingPrefHypnotique = indRingPrefArchaique + 1
    Public Const indRingPrefDansant = indRingPrefHypnotique + 1
    Public Const indRingPrefFauve = indRingPrefDansant + 1
    Public Const indRingPrefDiamant = indRingPrefFauve + 1
    Public Const indRingPrefVindicatif = indRingPrefDiamant + 1
    Public Const indRingPrefFausse = indRingPrefVindicatif + 1
    Public Const indRingPrefPlastique = indRingPrefFausse + 1
    Public Const indRingPrefInsidieux = indRingPrefPlastique + 1
    Public Const indRingPrefSolaire = indRingPrefInsidieux + 1
    Public Const indRingPrefAraignee = indRingPrefSolaire + 1
    Public Const indRingPrefFaucon = indRingPrefAraignee + 1
    Public Const indRingPrefNoir = indRingPrefFaucon + 1
    Public Const indRingPrefLast = indRingPrefNoir ' Dernier prefixe de la famille RingPref
     
    ' Données Anneaux Suffixe
    Public Const nbrMaxRingSuff = 20 ' La famille RingSuff a 20 suffixes possibles
    Public Const rowRingSuffStart = rowRingPrefStart + nbrMaxRingPref + nbrRowInter ' Première rangée de la famille RingSuff
    Public Const rowRingSuffEnd = rowRingSuffStart + nbrMaxRingSuff - 1 ' Dernière rangée de la famille RingSuff
     
    Public Const indRingSuffDelit = indPropertyFirst ' Premier suffixe de la famille RingSuff
    Public Const indRingSuffFirst = indRingSuffDelit
    Public Const indRingSuffBeaute = indRingSuffDelit + 1
    Public Const indRingSuffPouvoir = indRingSuffBeaute + 1
    Public Const indRingSuffForce = indRingSuffPouvoir + 1
    Public Const indRingSuffGenie = indRingSuffForce + 1
    Public Const indRingSuffSagesse = indRingSuffGenie + 1
    Public Const indRingSuffPeauDur = indRingSuffSagesse + 1
    Public Const indRingSuffLoupGarou = indRingSuffPeauDur + 1
    Public Const indRingSuffArt = indRingSuffLoupGarou + 1
    Public Const indRingSuffJustesse = indRingSuffArt + 1
    Public Const indRingSuffJouvence = indRingSuffJustesse + 1
    Public Const indRingSuffRenard = indRingSuffJouvence + 1
    Public Const indRingSuffChance = indRingSuffRenard + 1
    Public Const indRingSuffSang = indRingSuffChance + 1
    Public Const indRingSuffChauveSouris = indRingSuffSang + 1
    Public Const indRingSuffConcentration = indRingSuffChauveSouris + 1
    Public Const indRingSuffLevitation = indRingSuffConcentration + 1
    Public Const indRingSuffAstuce = indRingSuffLevitation + 1
    Public Const indRingSuffDement = indRingSuffAstuce + 1
    Public Const indRingSuffFacilite = indRingSuffDement + 1
    Public Const indRingSuffLast = indRingSuffFacilite ' Dernier suffixe de la famille RingSuff
     
    ' ================================ Amu ================================
    ' =====================================================================
    '
    ' Données Amulettes (Amu) Support
    Public Const nbrMaxAmuSupp = 5 ' La famille AmuSupp a 5 supports possibles
    Public Const rowAmuSuppStart = rowRingSuffStart + nbrMaxRingSuff + nbrRowFamily ' Première rangée de la famille AmuSupp
    Public Const rowAmuSuppEnd = rowAmuSuppStart + nbrMaxAmuSupp - 1 ' Dernière rangée de la famille AmuSupp
    Public Const indAmuSuppCollier = indPropertyFirst ' Premier support de la famille AmuSupp
    Public Const indAmuSuppCravate = nbrMaxAmuSupp ' Dernier support de la famille AmuSupp
     
    ' Donnée Amu Prefixe
    Public Const nbrMaxAmuPref = 28 ' La famille AmuPref a 28 Prefixes possibles
    Public Const rowAmuPrefStart = rowAmuSuppStart + nbrMaxAmuSupp + nbrRowInter ' Première rangée de la famille AmuPref
    Public Const rowAmuPrefEnd = rowAmuPrefStart + nbrMaxAmuPref - 1 ' Dernière rangée de la famille AmuPref
    Public Const indAmuPrefBronze = indPropertyFirst ' Premier prefixe de la famille AmuPref
    Public Const indAmuPrefNoir = nbrMaxAmuPref ' Dernier prefixe de la famille AmuPref
     
    ' Donnée Amu Suffixe
    Public Const nbrMaxAmuSuff = 20 ' La famille AmuSuff a 20 Suffixes possibles
    Public Const rowAmuSuffStart = rowAmuPrefStart + nbrMaxAmuPref + nbrRowInter ' Première rangée de la famille AmuSuff
    Public Const rowAmuSuffEnd = rowAmuSuffStart + nbrMaxAmuSuff - 1 ' Dernière rangée de la famille AmuSuff
    Public Const indAmuSuffDelit = indPropertyFirst ' Premier suffixe de la famille AmuSuff
    Public Const indAmuSuffFacilité = nbrMaxAmuSuff ' Dernier suffixe de la famille AmuSuff
     
    ' ================================ CaC1H ================================
    ' =======================================================================
    '
    ' Données Armes 1main (CaC1H) Support
    Public Const nbrMaxCaC1HSupp = 10 ' La famille CaC1HSupp a 10 supports possibles
    Public Const rowCaC1HSuppStart = rowAmuSuffStart + nbrMaxAmuSuff + nbrRowFamily ' Première rangée de la famille CaC1HSupp
    Public Const rowCaC1HSuppEnd = rowCaC1HSuppStart + nbrMaxCaC1HSupp - 1 ' Dernière rangée de la famille CaC1HSupp
    Public Const indCaC1HSuppMatraque = indPropertyFirst ' Premier support de la famille CaC1HSupp
    Public Const indCaC1HSuppCieux = nbrMaxCaC1HSupp ' Dernier support de la famille CaC1HSupp
     
    ' Donnée CaC1H Prefixe
    Public Const nbrMaxCaC1HPref = 20 ' La famille CaC1HPref a 20 Prefixes possibles
    Public Const rowCaC1HPrefStart = rowCaC1HSuppStart + nbrMaxCaC1HSupp + nbrRowInter ' Première rangée de la famille CaC1HPref
    Public Const rowCaC1HPrefEnd = rowCaC1HPrefStart + nbrMaxCaC1HPref - 1 ' Dernière rangée de la famille CaC1HPref
    Public Const indCaC1HPrefSevere = indPropertyFirst ' Premier prefixe de la famille CaC1HPref
    Public Const indCaC1HPrefDemoniaque = nbrMaxCaC1HPref ' Dernier prefixe de la famille CaC1HPref
     
    ' Donnée CaC1H Suffixe
    Public Const nbrMaxCaC1HSuff = 22 ' La famille CaC1HSuff a 22 Suffixes possibles
    Public Const rowCaC1HSuffStart = rowCaC1HPrefStart + nbrMaxCaC1HPref + nbrRowInter ' Première rangée de la famille CaC1HSuff
    Public Const rowCaC1HSuffEnd = rowCaC1HSuffStart + nbrMaxCaC1HSuff - 1 ' Dernière rangée de la famille CaC1HSuff
    Public Const indCaC1HSuffCommandant = indPropertyFirst ' Premier suffixe de la famille CaC1HSuff
    Public Const indCaC1HSuffEmpereur = nbrMaxCaC1HSuff ' Dernier suffixe de la famille CaC1HSuff
     
    ' ================================ CaC2H ================================
    ' =======================================================================
    '
    ' Données Armes 2mains (CaC2H) Support
    Public Const nbrMaxCaC2HSupp = 10 ' La famille CaC2HSupp a 10 supports possibles
    Public Const rowCaC2HSuppStart = rowCaC1HSuffStart + nbrMaxCaC1HSuff + nbrRowFamily ' Première rangée de la famille CaC2HSupp
    Public Const rowCaC2HSuppEnd = rowCaC2HSuppStart + nbrMaxCaC2HSupp - 1 ' Dernière rangée de la famille CaC2HSupp
    Public Const indCaC2HSuppMassue = indPropertyFirst ' Premier support de la famille CaC2HSupp
    Public Const indCaC2HSuppTronconneuse = nbrMaxCaC2HSupp ' Dernier support de la famille CaC2HSupp
     
    ' Donnée CaC2H Prefixe
    Public Const nbrMaxCaC2HPref = 21 ' La famille CaC2HPref a 21 Prefixes possibles
    Public Const rowCaC2HPrefStart = rowCaC2HSuppStart + nbrMaxCaC2HSupp + nbrRowInter ' Première rangée de la famille CaC2HPref
    Public Const rowCaC2HPrefEnd = rowCaC2HPrefStart + nbrMaxCaC2HPref - 1 ' Dernière rangée de la famille CaC2HPref
    Public Const indCaC2HPrefDispendieux = indPropertyFirst ' Premier prefixe de la famille CaC2HPref
    Public Const indCaC2HPrefDemoniaque = nbrMaxCaC2HPref ' Dernier prefixe de la famille CaC2HPref
     
    ' Donnée CaC2H Suffixe
    Public Const nbrMaxCaC2HSuff = 18 ' La famille CaC2HSuff a 18 Suffixes possibles
    Public Const rowCaC2HSuffStart = rowCaC2HPrefStart + nbrMaxCaC2HPref + nbrRowInter ' Première rangée de la famille CaC2HSuff
    Public Const rowCaC2HSuffEnd = rowCaC2HSuffStart + nbrMaxCaC2HSuff - 1 ' Dernière rangée de la famille CaC2HSuff
    Public Const indCaC2HSuffTrahison = indPropertyFirst ' Premier suffixe de la famille CaC2HSuff
    Public Const indCaC2HSuffDracula = nbrMaxCaC2HSuff ' Dernier suffixe de la famille CaC2HSuff
     
    ' ================================ Hat ================================
    ' =====================================================================
    '
    ' Données Casques (Hat) Support
    Public Const nbrMaxHatSupp = 10 ' La famille HatSupp a 10 supports possibles
    Public Const rowHatSuppStart = rowCaC2HSuffStart + nbrMaxCaC2HSuff + nbrRowFamily ' Première rangée de la famille HatSupp
    Public Const rowHatSuppEnd = rowHatSuppStart + nbrMaxHatSupp - 1 ' Dernière rangée de la famille HatSupp
    Public Const indHatSuppCasquette = indPropertyFirst ' Premier support de la famille HatSupp
    Public Const indHatSuppCouronne = nbrMaxHatSupp ' Dernier support de la famille HatSupp
     
    ' Donnée Hat Prefixe
    Public Const nbrMaxHatPref = 19 ' La famille HatPref a 19 Prefixes possibles
    Public Const rowHatPrefStart = rowHatSuppStart + nbrMaxHatSupp + nbrRowInter ' Première rangée de la famille HatPref
    Public Const rowHatPrefEnd = rowHatPrefStart + nbrMaxHatPref - 1 ' Dernière rangée de la famille HatPref
    Public Const indHatPrefEndurci = indPropertyFirst ' Premier prefixe de la famille HatPref
    Public Const indHatPrefRituel = nbrMaxHatPref ' Dernier prefixe de la famille HatPref
     
    ' Donnée Hat Suffixe
    Public Const nbrMaxHatSuff = 18 ' La famille HatSuff a 18 Suffixes possibles
    Public Const rowHatSuffStart = rowHatPrefStart + nbrMaxHatPref + nbrRowInter ' Première rangée de la famille HatSuff
    Public Const rowHatSuffEnd = rowHatSuffStart + nbrMaxHatSuff - 1 ' Dernière rangée de la famille HatSuff
    Public Const indHatSuffExplorateur = indPropertyFirst ' Premier suffixe de la famille HatSuff
    Public Const indHatSuffMagie = nbrMaxHatSuff ' Dernier suffixe de la famille HatSuff
     
    ' ================================ Pant ================================
    ' ======================================================================
    '
    ' Données Pantalons (Pant) Support
    Public Const nbrMaxPantSupp = 4 ' La famille PantSupp a 4 supports possibles
    Public Const rowPantSuppStart = rowHatSuffStart + nbrMaxHatSuff + nbrRowFamily ' Première rangée de la famille PantSupp
    Public Const rowPantSuppEnd = rowPantSuppStart + nbrMaxPantSupp - 1 ' Dernière rangée de la famille PantSupp
    Public Const indPantSuppShort = indPropertyFirst ' Premier support de la famille PantSupp
    Public Const indPantSuppKilt = nbrMaxPantSupp ' Dernier support de la famille PantSupp
     
    ' Donnée Pant Prefixe
    Public Const nbrMaxPantPref = 17 ' La famille PantPref a 17 Prefixes possibles
    Public Const rowPantPrefStart = rowPantSuppStart + nbrMaxPantSupp + nbrRowInter ' Première rangée de la famille PantPref
    Public Const rowPantPrefEnd = rowPantPrefStart + nbrMaxPantPref - 1 ' Dernière rangée de la famille PantPref
    Public Const indPantPrefCourt = indPropertyFirst ' Premier prefixe de la famille PantPref
    Public Const indPantPrefMortel = nbrMaxPantPref ' Dernier prefixe de la famille PantPref
     
    ' Donnée Pant Suffixe
    Public Const nbrMaxPantSuff = 15 ' La famille PantSuff a 15 Suffixes possibles
    Public Const rowPantSuffStart = rowPantPrefStart + nbrMaxPantPref + nbrRowInter ' Première rangée de la famille PantSuff
    Public Const rowPantSuffEnd = rowPantSuffStart + nbrMaxPantSuff - 1 ' Dernière rangée de la famille PantSuff
    Public Const indPantSuffBrigand = indPropertyFirst ' Premier suffixe de la famille PantSuff
    Public Const indPantSuffNuit = nbrMaxPantSuff ' Dernier suffixe de la famille PantSuff
     
    ' ================================ Armor ================================
    ' =======================================================================
    '
    ' Données Armoralons (Armor) Support
    Public Const nbrMaxArmorSupp = 10 ' La famille ArmorSupp a 10 supports possibles
    Public Const rowArmorSuppStart = rowPantSuffStart + nbrMaxPantSuff + nbrRowFamily ' Première rangée de la famille ArmorSupp
    Public Const rowArmorSuppEnd = rowArmorSuppStart + nbrMaxArmorSupp - 1 ' Dernière rangée de la famille ArmorSupp
    Public Const indArmorSuppTShirt = indPropertyFirst ' Premier support de la famille ArmorSupp
    Public Const indArmorSuppPleineArmure = nbrMaxArmorSupp ' Dernier support de la famille ArmorSupp
     
    ' Donnée Armor Prefixe
    Public Const nbrMaxArmorPref = 16 ' La famille ArmorPref a 16 Prefixes possibles
    Public Const rowArmorPrefStart = rowArmorSuppStart + nbrMaxArmorSupp + nbrRowInter ' Première rangée de la famille ArmorPref
    Public Const rowArmorPrefEnd = rowArmorPrefStart + nbrMaxArmorPref - 1 ' Dernière rangée de la famille ArmorPref
    Public Const indArmorPrefRenforce = indPropertyFirst ' Premier prefixe de la famille ArmorPref
    Public Const indArmorPrefMortel = nbrMaxArmorPref ' Dernier prefixe de la famille ArmorPref
     
    ' Donnée Armor Suffixe
    Public Const nbrMaxArmorSuff = 20 ' La famille ArmorSuff a 20 Suffixes possibles
    Public Const rowArmorSuffStart = rowArmorPrefStart + nbrMaxArmorPref + nbrRowInter ' Première rangée de la famille ArmorSuff
    Public Const rowArmorSuffEnd = rowArmorSuffStart + nbrMaxArmorSuff - 1 ' Dernière rangée de la famille ArmorSuff
    Public Const indArmorSuffVoleur = indPropertyFirst ' Premier suffixe de la famille ArmorSuff
    Public Const indArmorSuffOrchidee = nbrMaxArmorSuff ' Dernier suffixe de la famille ArmorSuff
     
    ' ================================ Aad ================================
    ' =======================================================================
    '
    ' Données Aadalons (Aad) Support
    Public Const nbrMaxAadSupp = 11 ' La famille AadSupp a 11 supports possibles
    Public Const rowAadSuppStart = rowArmorSuffStart + nbrMaxArmorSuff + nbrRowFamily ' Première rangée de la famille AadSupp
    Public Const rowAadSuppEnd = rowAadSuppStart + nbrMaxAadSupp - 1 ' Dernière rangée de la famille AadSupp
     
    Public Const indAadSuppArcCourt = indPropertyFirst ' Premier support de la famille AadSupp
    Public Const indAadSuppFirst = indAadSuppArcCourt
    Public Const indAadSuppArc = indAadSuppArcCourt + 1
    Public Const indAadSuppShuriken = indAadSuppArc + 1
    Public Const indAadSuppCouteauLancer = indAadSuppShuriken + 1
    Public Const indAadSuppArcLong = indAadSuppCouteauLancer + 1
    Public Const indAadSuppFranscique = indAadSuppArcLong + 1
    Public Const indAadSuppArbalete = indAadSuppFranscique + 1
    Public Const indAadSuppArcReflexe = indAadSuppArbalete + 1
    Public Const indAadSuppJavelot = indAadSuppArcReflexe + 1
    Public Const indAadSuppPilum = indAadSuppJavelot + 1
    Public Const indAadSuppArbaleteLourde = indAadSuppPilum + 1
    Public Const indAadSuppLast = indAadSuppArbaleteLourde ' Dernier support de la famille AadSupp
     
    ' Données Armes à Distance (AAD) Suffixe
    Public Const nbrMaxAadSuff = 8 ' La famille AadSuff a 8 suffixes possibles
    Public Const rowAadSuffStart = rowAadSuppStart + nbrMaxAadSupp + nbrRowInter ' Première rangée de la famille AadSuff
    Public Const rowAadSuffEnd = rowAadSuffStart + nbrMaxAadSuff - 1 ' Dernière rangée de la famille AadSuff
     
    Public Const indAadSuffLonguePortee = indPropertyFirst
    Public Const indAadSuffFirst = indAadSuffLonguePortee ' Premier suffixe de la famille AadSuff
    Public Const indAadSuffPerfection = indAadSuffLonguePortee + 1
    Public Const indAadSuffPrecision = indAadSuffPerfection + 1
    Public Const indAadSuffVengeance = indAadSuffPrecision + 1
    Public Const indAadSuffReaction = indAadSuffVengeance + 1
    Public Const indAadSuffDryades = indAadSuffReaction + 1
    Public Const indAadSuffMitraillage = indAadSuffDryades + 1
    Public Const indAadSuffLoups = indAadSuffMitraillage + 1
    Public Const indAadSuffLast = indAadSuffLoups ' Dernier suffixe de la famille AadSuff
     
    ' =========================== Feuille cible résultat à partir de la cible pour un stock donné
    ' Feuille d'insertion du Stock possédé, et de sélection de l'objet Cible désiré.
    Public Const nomFeuilleTarget = "Fusion" ' Bouton de lancement de recherche des solutions
     
    ' Définition de la   C I B L E
    ' Les paramètres d'entrée sont: l'objet cible = un support, un prefixe, un suffixe
    ' Pour les Armes a Distance, le prefixe est inexistant = 0
    ' La vérification syntaxique de l'objet cible est assurée par IsIndexOk()
     
    ' Les paramètres de sortie sont: les solutions pour obtenir l'objet cible.
    ' Un classement croissant fonction du nombre de fusions à réaliser pour obtenir l'objet cible serait un plus
     
    ' Définition du      S T O C K
    ' Les objets en stock devront être rentrés manuellement par l'utilisateur sur la feuille.
    ' Une colonne pour les supports, une pour les préfixes, une pour les suffixes
    ' La correlation pour le mélange entre deux objets étant fournies par le tableau arrObjName
    ' Exemple: Anneau + Chevalière = Bracelet
    ' La vérification syntaxique des objets en stock est assurée par IsObjOk()
     
    ' ============================================
     
    Type ObjectType ' Clé unique identifiant un objet
        Family As Byte
        Suppport As Byte
        Prefixe As Byte
        Suffixe As Byte
    End Type
     
    Type ObjIdType ' Vision d'ObjectType alignée sur un Long = 4 Bytes = 32-bit
        Value As Long
    End Type
     
    ' Tableau de corrélation entre propriétés par objet et type de propriétés
    Public arrObjRel(indObjFirst To indObjLast, indTypePropertyFirst To indTypePropertyLast, _
                     indPropertyFirst To nbrMaxProperties, indPropertyFirst To nbrMaxProperties) As Byte
    ' Nom de chaque propriétés
    Public arrObjName(indObjFirst To indObjLast, indTypePropertyFirst To indTypePropertyLast, _
                     indPropertyFirst To nbrMaxProperties) As String
     
    Public Const rankStockMax = 100 ' Nombre maximum d'objets dans le stock
    Public arrStock(1 To rankStockMax) As Long  ' array représentant le stock
    Public nbrObjStock As Integer               ' Nombre d'objets dans le stock
    Public varNameObj As Variant                ' Nom de chaque famille
    Public objTarget As Long                    ' Cible à atteindre
     
    Function MergeObject(ByVal obj1 As Long, ByVal obj2 As Long) As Long
    End Function
     
    Sub SearchTarget(ByVal indObjCible As Byte, ByVal indSuppCible As Byte, _
                     ByVal indPrefCible As Byte, ByVal indSuffCible As Byte)
    Dim indRank As Integer
     
        If Not IsObjOk(indObjCible, indSuppCible, indPrefCible, indSuffCible) Then Exit Sub
        objTarget = IdObjFromProper(indObjCible, indSuppCible, indPrefCible, indSuffCible)
        If IsObjInStock(objTarget) Then
             Debug.Print "La cible est déjà dans le Stock": Exit Sub
        End If
        Debug.Print vbCrLf + "La cible à atteindre est : " + vbCrLf + ObjToString(objTarget)
    End Sub
     
    Sub MergeDo()
    Dim result As Byte
     
        result = MergeObject(indObjRing, indRingSuppAnneau, indRingPrefTitane, indRingSuffJouvence)
    End Sub
     
    ' Initialisation du jeu
    Sub InitRpg()
    Dim indRow As Integer, indCol As Integer, rngCell As Range, rngName As Range
     
        ' Données Anneaux
        InitObject indObjRing, indSupport, rowRingSuppStart, rowRingSuppEnd, nbrMaxRingSupp
        InitObject indObjRing, indPrefixe, rowRingPrefStart, rowRingPrefEnd, nbrMaxRingPref
        InitObject indObjRing, indSuffixe, rowRingSuffStart, rowRingSuffEnd, nbrMaxRingSuff
         ' Données Amulettes
        InitObject indObjAmu, indSupport, rowAmuSuppStart, rowAmuSuppEnd, nbrMaxAmuSupp
        InitObject indObjAmu, indPrefixe, rowAmuPrefStart, rowAmuPrefEnd, nbrMaxAmuPref
        InitObject indObjAmu, indSuffixe, rowAmuSuffStart, rowAmuSuffEnd, nbrMaxAmuSuff
     
            ' Données Armes 1main
        InitObject indObjCaC1H, indSupport, rowCaC1HSuppStart, rowCaC1HSuppEnd, nbrMaxCaC1HSupp
        InitObject indObjCaC1H, indPrefixe, rowCaC1HPrefStart, rowCaC1HPrefEnd, nbrMaxCaC1HPref
        InitObject indObjCaC1H, indSuffixe, rowCaC1HSuffStart, rowCaC1HSuffEnd, nbrMaxCaC1HSuff
     
            ' Données Armes 2mains
        InitObject indObjCaC2H, indSupport, rowCaC2HSuppStart, rowCaC2HSuppEnd, nbrMaxCaC2HSupp
        InitObject indObjCaC2H, indPrefixe, rowCaC2HPrefStart, rowCaC2HPrefEnd, nbrMaxCaC2HPref
        InitObject indObjCaC2H, indSuffixe, rowCaC2HSuffStart, rowCaC2HSuffEnd, nbrMaxCaC2HSuff
     
            ' Données Casques
        InitObject indObjHat, indSupport, rowHatSuppStart, rowHatSuppEnd, nbrMaxHatSupp
        InitObject indObjHat, indPrefixe, rowHatPrefStart, rowHatPrefEnd, nbrMaxHatPref
        InitObject indObjHat, indSuffixe, rowHatSuffStart, rowHatSuffEnd, nbrMaxHatSuff
     
            ' Données Pantalons
        InitObject indObjPant, indSupport, rowPantSuppStart, rowPantSuppEnd, nbrMaxPantSupp
        InitObject indObjPant, indPrefixe, rowPantPrefStart, rowPantPrefEnd, nbrMaxPantPref
        InitObject indObjPant, indSuffixe, rowPantSuffStart, rowPantSuffEnd, nbrMaxPantSuff
     
        ' Données Armures
        InitObject indObjArmor, indSupport, rowArmorSuppStart, rowArmorSuppEnd, nbrMaxArmorSupp
        InitObject indObjArmor, indPrefixe, rowArmorPrefStart, rowArmorPrefEnd, nbrMaxArmorPref
        InitObject indObjArmor, indSuffixe, rowArmorSuffStart, rowArmorSuffEnd, nbrMaxArmorSuff
        ' Données Armes à Distance
        InitObject indObjAad, indSupport, rowAadSuppStart, rowAadSuppEnd, indAadSuppLast
        InitObject indObjAad, indSuffixe, rowAadSuffStart, rowAadSuffEnd, indAadSuffLast
     
        varNameObj = Array("Ring", "Amulettes", "Hand Gun1", "Hand Gun2", "Casques", "Pant", "Armor", "Distant Gun")
        StockClear
        StockInit   ' pour test
            Debug.Print "L'état du stock est : "
        StockDisplay
        SearchTarget indObjRing, indRingSuppAnneau, indRingPrefTitane, indRingSuffJouvence
    End Sub
     
    ' Initialisation d'un objet
    Sub InitObject(ByVal indObj As Byte, ByVal indType As Byte, _
                    ByVal indRowStart As Integer, ByVal indRowEnd As Integer, ByVal nbrMaxItem As Byte)
    Dim indRow As Integer, indCol As Integer, varCell As Variant, varName As Variant
     
        With Worksheets(nomFeuilleSrcDFusion) ' Lecture de tout le tableau en une seule fois dans un Variant
            varCell = .Range(.Cells(indRowStart, colObjFirst), .Cells(indRowEnd, colObjFirst + nbrMaxItem - 1)).Value
            varName = .Range(.Cells(indRowStart, colObjName), .Cells(indRowEnd, colObjName)).Value
        End With
        For indRow = indPropertyFirst To nbrMaxItem
            For indCol = indPropertyFirst To nbrMaxItem ' Initialisation de la matrice de corrélation
                arrObjRel(indObj, indType, indRow, indCol) = varCell(indRow, indCol)
            Next
            ' Initialisation du nom d'une propriété
            arrObjName(indObj, indType, indRow) = varName(indRow, 1)
        Next
    End Sub
     
    ' Les n° de propriétés de l'objet sont-ils valides ?
    Function IsObjOk(ByVal indObj As Byte, ByVal indSupp As Byte, ByVal indPref As Byte, _
                                            ByVal indSuff As Byte) As Boolean
        IsObjOk = False
        If indObj < indObjFirst Or indObj > indObjLast Then
            Warning "1000: Objet " & indObj & " inconnu": Exit Function
        End If
        If Not IsIndexOk(indObj, indSupport, indSupp) Then
            Warning "1100: Support " & indSupp & " inconnu": Exit Function
        End If
        If Not IsIndexOk(indObj, indPrefixe, indPref) Then
            Warning "1100: Prefixe " & indPref & " inconnu": Exit Function
        End If
        If Not IsIndexOk(indObj, indSuffixe, indSuff) Then
            Warning "1200: Suffixe " & indSuff & " inconnu": Exit Function
        End If
        IsObjOk = True
    End Function
     
    ' Vérifie que l'indice de propriété d'un type donné dans un objet est valide
    ' Quand on ajoute un nouvel objet, il faut checker ses indices en ajoutant un : Case indObjName
    Function IsIndexOk(ByVal indObj As Byte, ByVal typeProperty As Byte, ByVal indexProperty As Byte) As Boolean
        IsIndexOk = False
        If indexProperty < indPropertyFirst Then Exit Function
        Select Case indObj
        Case indObjRing
            Select Case typeProperty
            Case indSupport: If indexProperty > nbrMaxRingSupp Then Exit Function
            Case indPrefixe: If indexProperty > nbrMaxRingPref Then Exit Function
            Case indSuffixe: If indexProperty > nbrMaxRingSuff Then Exit Function
            Case Else: Exit Function
            End Select
     
        Case indObjAmu
            Select Case typeProperty
            Case indSupport: If indexProperty > nbrMaxAmuSupp Then Exit Function
            Case indPrefixe: If indexProperty > nbrMaxAmuPref Then Exit Function
            Case indSuffixe: If indexProperty > nbrMaxAmuSuff Then Exit Function
            Case Else: Exit Function
            End Select
     
        Case indObjCaC1H
            Select Case typeProperty
            Case indSupport: If indexProperty > nbrMaxCaC1HSupp Then Exit Function
            Case indPrefixe: If indexProperty > nbrMaxCaC1HPref Then Exit Function
            Case indSuffixe: If indexProperty > nbrMaxCaC1HSuff Then Exit Function
            Case Else: Exit Function
            End Select
     
        Case indObjCaC2H
            Select Case typeProperty
            Case indSupport: If indexProperty > nbrMaxCaC2HSupp Then Exit Function
            Case indPrefixe: If indexProperty > nbrMaxCaC2HPref Then Exit Function
            Case indSuffixe: If indexProperty > nbrMaxCaC2HSuff Then Exit Function
            Case Else: Exit Function
            End Select
     
        Case indObjHat
            Select Case typeProperty
            Case indSupport: If indexProperty > nbrMaxHatSupp Then Exit Function
            Case indPrefixe: If indexProperty > nbrMaxHatPref Then Exit Function
            Case indSuffixe: If indexProperty > nbrMaxHatSuff Then Exit Function
            Case Else: Exit Function
            End Select
     
        Case indObjPant
            Select Case typeProperty
            Case indSupport: If indexProperty > nbrMaxPantSupp Then Exit Function
            Case indPrefixe: If indexProperty > nbrMaxPantPref Then Exit Function
            Case indSuffixe: If indexProperty > nbrMaxPantSuff Then Exit Function
            Case Else: Exit Function
            End Select
     
        Case indObjArmor
            Select Case typeProperty
            Case indSupport: If indexProperty > nbrMaxArmorSupp Then Exit Function
            Case indPrefixe: If indexProperty > nbrMaxArmorPref Then Exit Function
            Case indSuffixe: If indexProperty > nbrMaxArmorSuff Then Exit Function
            Case Else: Exit Function
            End Select
     
        Case indObjAad
            Select Case typeProperty
            Case indSupport: If indexProperty > indAadSuppLast Then Exit Function
            Case indSuffixe: If indexProperty > indAadSuffLast Then Exit Function
            Case Else: Exit Function
            End Select
     
        Case Else: Exit Function
        End Select
        IsIndexOk = True
    End Function
     
    ' Nom d'un support d'un objet
    Function SupportToString(ByVal indObj As Byte, ByVal indSupp As Byte) As String
        If IsIndexOk(indObj, indSupport, indSupp) Then
            SupportToString = arrObjName(indObj, indSupport, indSupp)
        Else
            SupportToString = vbNullString
        End If
    End Function
     
    ' Nom d'un préfixe d'un objet
    Function PrefixeToString(ByVal indObj As Byte, ByVal indPref As Byte) As String
        If IsIndexOk(indObj, indPrefixe, indPref) Then
            PrefixeToString = arrObjName(indObj, indPrefixe, indPref)
        Else
            PrefixeToString = vbNullString
        End If
    End Function
     
    ' Nom d'un suffixe d'un objet
    Function SuffixeToString(ByVal indObj As Byte, ByVal indSuff As Byte) As String
        If IsIndexOk(indObj, indSuffixe, indSuff) Then
            SuffixeToString = arrObjName(indObj, indSuffixe, indSuff)
        Else
            SuffixeToString = vbNullString
        End If
    End Function
     
    ' Relation entre supports
    Function SupportRelation(ByVal indObj As Byte, ByVal indSupp1 As Byte, ByVal indSupp2 As Byte, _
                             Optional ByVal isCheckPrm As Boolean = True) As Byte
        If isCheckPrm Then
            SupportRelation = 0
            If indSupp1 = indSupp2 Then Exit Function
            If Not IsIndexOk(indObj, indSupport, indSupp1) Then Exit Function
            If Not IsIndexOk(indObj, indSupport, indSupp2) Then Exit Function
        End If
        SupportRelation = arrObjRel(indObj, indSupport, indSupp1, indSupp2)
    End Function
     
    ' Relation entre préfixes
    Function PrefixeRelation(ByVal indObj As Byte, ByVal indPref1 As Byte, ByVal indPref2 As Byte, _
                             Optional ByVal isCheckPrm As Boolean = True) As Byte
        If isCheckPrm Then
            PrefixeRelation = 0
            If indPref1 = indPref2 Then Exit Function
            If Not IsIndexOk(indObj, indPrefixe, indPref1) Then Exit Function
            If Not IsIndexOk(indObj, indPrefixe, indPref2) Then Exit Function
        End If
        PrefixeRelation = arrObjRel(indObj, indPrefixe, indPref1, indPref2)
    End Function
     
    ' Relation entre suffixes
    Function SuffixeRelation(ByVal indObj As Byte, ByVal indSuff1 As Byte, ByVal indSuff2 As Byte, _
                             Optional ByVal isCheckPrm As Boolean = True) As Byte
        If isCheckPrm Then
            SuffixeRelation = 0
            If indSuff1 = indSuff2 Then Exit Function
            If Not IsIndexOk(indObj, indSuffixe, indSuff1) Then Exit Function
            If Not IsIndexOk(indObj, indSuffixe, indSuff2) Then Exit Function
        End If
        SuffixeRelation = arrObjRel(indObj, indSuffixe, indSuff1, indSuff2)
    End Function
     
    ' Corrélation entre deux objets selon un type de propriété donnée. Résulat : propriété
    Function Correlation(ByVal indObj As Byte, ByVal typeProperty As Byte, ByVal indexProperty1 As Byte, _
                     ByVal indexProperty2 As Byte, Optional ByVal isCheckPrm As Boolean = True) As Byte
        If isCheckPrm Then
            Correlation = 0
            If indexProperty1 = indexProperty2 Then Exit Function
            If Not IsIndexOk(indObj, typeProperty, indexProperty1) Then Exit Function
            If Not IsIndexOk(indObj, typeProperty, indexProperty2) Then Exit Function
        End If
        Correlation = arrObjRel(indObj, typeProperty, indexProperty1, indexProperty2)
    End Function
     
    ' Corrélation entre deux objets selon un type de propriété donnée. Résultat : chaîne de la propriété
    Function CorrelationToString(ByVal indObj As Byte, ByVal typeProperty As Byte, _
                                 ByVal indexProperty1 As Byte, ByVal indexProperty2 As Byte) As String
    Dim indPropRel As Byte
     
        indPropRel = Correlation(indObj, typeProperty, indexProperty1, indexProperty2)
        If indPropRel > 0 Then
            CorrelationToString = PropertyToString(indObj, typeProperty, indPropRel)
        Else
            CorrelationToString = vbNullString
        End If
    End Function
     
    ' Nom d'une propriété d'un objet d'un type donné
    Function PropertyToString(ByVal indObj As Byte, ByVal typeProperty As Byte, ByVal indexProperty As Byte) As String
        If IsIndexOk(indObj, typeProperty, indexProperty) Then
            PropertyToString = arrObjName(indObj, typeProperty, indexProperty)
        Else
            PropertyToString = vbNullString
        End If
    End Function
     
    ' Retourne la chaîne de caractère de toutes les propriétés de l'objet identifié par son n°
    Function ObjToString(ByVal idObjet As Long) As String
    Const sepObj = ": ", sepPrm = ", "
    Dim indObj As Byte, indSupp As Byte, indPref As Byte, indSuff As Byte
     
        ProperFromIdObj idObjet, indObj, indSupp, indPref, indSuff
        If IsObjOk(indObj, indSupp, indPref, indSuff) Then
            ObjToString = varNameObj(indObj - 1) + sepObj + SupportToString(indObj, indSupp) + _
                sepPrm + PrefixeToString(indObj, indPref) + sepPrm + SuffixeToString(indObj, indSuff)
        Else
            ObjToString = "L'objet n° " & idObjet & " est inconnu."
        End If
    End Function
     
    ' Convertir les propriétés de l'objet en un n° unique
    Function IdObjFromProper(ByVal indObj As Byte, ByVal indSupp As Byte, _
                             ByVal indPref As Byte, ByVal indSuff As Byte) As Long
    Dim objRpg As ObjectType, objId As ObjIdType
        With objRpg
            .Family = indObj
            .Suppport = indSupp
            .Prefixe = indPref
            .Suffixe = indSuff
        End With
        LSet objId = objRpg
        IdObjFromProper = objId.Value
    End Function
     
    ' Convertir le n° unique de l'objet en ses propriétés
    Sub ProperFromIdObj(ByVal idObjet As Long, ByRef indObj As Byte, ByRef indSupp As Byte, _
                        ByRef indPref As Byte, ByRef indSuff As Byte)
    Dim objRpg As ObjectType, objId As ObjIdType
        objId.Value = idObjet
        LSet objRpg = objId
        With objRpg
            indObj = .Family
            indSupp = .Suppport
            indPref = .Prefixe
            indSuff = .Suffixe
        End With
    End Sub
     
    ' L'objet de n° idObjet est-il dans le stock ?
    Function IsObjInStock(ByVal idObjet As Long) As Boolean
    Dim indRank As Integer
     
        For indRank = 1 To nbrObjStock
            If arrStock(indRank) = idObjet Then
                IsObjInStock = True: Exit Function
            End If
        Next
        IsObjInStock = False
    End Function
     
    ' Initialisation du stock sans lire la feuille
    Sub StockInit()
        StockAdd indObjRing, indRingSuppAnneau, indRingPrefDiamant, indRingSuffDelit
        StockAdd indObjRing, indRingSuppAnneau, indRingPrefDur, indRingSuffPeauDur
        StockAdd indObjRing, indRingSuppAnneau, indRingPrefArgent, indRingSuffAstuce
        StockAdd indObjRing, indRingSuppAnneau, indRingPrefPlatine, indRingSuffJustesse
        StockAdd indObjRing, indRingSuppAnneau, indRingPrefDistingue, indRingSuffArt
        StockAdd indObjRing, indRingSuppAnneau, indRingPrefArgent, indRingSuffSagesse
     
        StockAdd indObjRing, indRingSuppBracelet, indRingPrefAstral, indRingSuffSagesse
        StockAdd indObjRing, indRingSuppBracelet, indRingPrefBronze, indRingSuffSagesse
        StockAdd indObjRing, indRingSuppBracelet, indRingPrefBronze, indRingSuffPeauDur
     
        StockAdd indObjRing, indRingSuppChevaliere, indRingPrefBronze, indRingSuffGenie
        StockAdd indObjRing, indRingSuppChevaliere, indRingPrefOr, indRingSuffSagesse
    End Sub
     
    Function StockAdd(ByVal indObj As Byte, ByVal indSupp As Byte, ByVal indPref As Byte, _
                                            ByVal indSuff As Byte) As Boolean
    Dim idObjet As Long
     
        StockAdd = False
        If nbrObjStock > rankStockMax Then Warning "2000: Trop d'objets": Exit Function
        If Not IsObjOk(indObj, indSupp, indPref, indSuff) Then Exit Function
        idObjet = IdObjFromProper(indObj, indSupp, indPref, indSuff)
        If IsObjInStock(idObjet) Then Warning "2100: objet déjà en stock": Exit Function
     
        nbrObjStock = nbrObjStock + 1
        arrStock(nbrObjStock) = idObjet
        StockAdd = True
    End Function
     
    Sub StockClear()
        Erase arrStock
        nbrObjStock = 0
    End Sub
     
    Sub StockDelLast()
        If nbrObjStock > 0 Then
            nbrObjStock = nbrObjStock - 1
        End If
        If nbrObjStock = 0 Then
            StockClear
        End If
    End Sub
     
    Sub StockDisplay()
    Dim indRank As Integer
    Dim indObj As Byte, indSupp As Byte, indPref As Byte, indSuff As Byte
     
        If nbrObjStock = 0 Then Debug.Print "Le stock est vide"
        For indRank = 1 To nbrObjStock
            Debug.Print Format(indRank, "00 ") + ObjToString(arrStock(indRank))
        Next
    End Sub
     
    Sub Warning(ByVal strMsg As String) 'Common error management
    Const lenErr = 4 ' Number of digits of the error code beginning the message
        If Err.Number <> 0 Then
            strMsg = strMsg + vbCrLf + "Error " + Str(Err.Number) + ": " + Err.Description
        End If
        MsgBox Mid(strMsg, lenErr + 3), vbExclamation, "Fusion warning " + Left(strMsg, lenErr)
    End Sub
    Le préfixe pour les tableaux est l'abréviation "arr" signifiant array. "var" pour les Variants.

    2. Tester le module ModMerge

    Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE d'Excel, copier-coller et valider par ENTER :
    La feuille "Données Fusion" a été lue par VBA en moins d'une seconde.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? indRingSuppChevaliere
    3
    Le "?" signifie que l'on pose une question à VBA. Et il répond à la ligne suivante dans la fenêtre d'Exécution immédiate.

    Attention il ne faut pas d'accent dans les noms de constantes comme indRingSuppChevalière ou indRingPrefDistingué, variables et procédures.
    On ne peut mettre des accents que dans des chaînes littérales comme "Chevalière".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? SupportToString(indObjRing, indRingSuppChevaliere)
    Chevalière

    La fonction SupportToString() convertit, pour l'objet indObjRing, le support indRingSuppChevaliere en chaîne de caractère : "Chevalière".
    On a renommé le nom de la constante en mettant le nom de l'objet "Ring" avant sa propriété "Supp" signifiant support. Les noms sont plus courts.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? PrefixeToString(indObjRing, indRingPrefAstucieux)
    Astucieux
    Voici un préfixe de l'objet Ring.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? SuffixeToString(indObjAad, indAadSuffPerfection)
    Perfection
    Notez comment on a changé d'objet avec le premier paramètre indObjAad.

    Le second paramètre de SuffixeToString() est le n° de suffixe que l'on obtient en interrogeant la relation entre les propriétés "Beauté" et "Concentration".
    Vous vérifierez plusieurs combinaisons pour chaque objet et comparerez avec la feuille des supports, préfixes et suffixes afin de valider qu'il n'y a pas de bugs dans ce tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? SuffixeToString(indObjRing, SuffixeRelation(indObjRing, indRingSuffBeaute, indRingSuffConcentration))
    Justesse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? CorrelationToString(indObjAad, indSupport, indAadSuppPilum, indAadSuppShuriken)
    Arc Reflex
    CorrelationToString() est plus générique puisqu'on passe en paramètre le type d'objet, le type de propriété et les deux propriétés dont on cherche la troisième.

    3. Questions et réponses

    Citation Envoyé par Mangaku Voir le message
    Dans l'idéal, il faudrait lister une solution maximum, afin de justement regarder quelle solution semble la plus "économe"
    S'il n'y a qu'une solution à afficher, alors supprimez la seconde solution. Cela sera plus simple à décrire avec des constantes.

    Citation Envoyé par Mangaku Voir le message
    peut-on mettre plusieurs données différentes dans la même feuille (Anneau et AAD par exemple) ?
    Oui. C'est plus simple de les regrouper sur une seule feuille comme c'est le cas actuellement.
    Il faut veiller à respecter le même nombre de rangées vides entre deux familles d'objets.

    Citation Envoyé par Mangaku Voir le message
    Si on part sur le principe de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TargetMergeSupport = Range("B4")
    Est ce que l'on a la possibilité de faire en sorte que la valeur de B4 soit comparée avec différentes cases, pour savoir quel type d'objet on va chercher à fusionner (Anneau ou AAD) et ainsi donc, reprendre un algorithme ou les support/préfixe/suffixe seront identifiés via des nombres : le but étant de ne partir que sur un algorithme qui prend en entrée un nombre déterminé de valeurs
    On peut tout faire. C'est vous qui choisissez si vous préférez des nombres ou des chaînes pour la saisie. En général, c'est plus lisible de choisir des chaînes de caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ' Peut-on envisager une macro de vérification syntaxique de l'objet cible, et des objets en stock
    Oui. Une fois la saisie validée, le choix du joueur sera converti par une des constantes définies. Dans la solution, on pourra afficher la chaîne correspondante comme dans la session ci-dessus dans la fenêtre d'Exécution immédiate.

    4. Décrire la feuille "Fusion"

    Pour le bouton "Recherche des Solutions", préférerez "Fusion" puisqu'il ne faut trouver qu'une solution au singulier. Comme il s'agit d'un bouton, préfixer son nom par "Btn" signifiant bouton.
    Dans ses propriétés, la première est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Name): RechercheSolutions
    Elle peut devenir :
    C'est un nom interne connu que du développeur de macro.
    Ce que voit le joueur est la propriété Caption = "Fusion" ou "Solution".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ' Un classement croissant fonction du nombre d'iteration a réaliser pour obtenir l'objet cible serait un plus
    Il faut définir :

    • Les itérations pour recherche une nouvelle solution
    • La fonction d'évaluation d'une solution permettant de trier chaque essai selon un score.


    Raffinez la description de MergeObject(). Passe-t-on comme paramètre l'objet cible à atteindre ? Quelle est la relation entre l'objet cible et les objets en Stock ?
    Répondez sous forme de commentaire VBA dans un extrait de ModMerge décrivant le Stock et l'objet cible.

  9. #9
    Membre actif
    Homme Profil pro
    Ingénieur PI
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur PI
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Par défaut
    Et bhe...
    Quelle évolution !

    Citation Envoyé par MattChess Voir le message
    C'est un début prometteur !
    Merci déjà.
    Ca m'encourage à vraiment comprendre ce qui se passe et y mettre mon petit grain de "folie"


    Sinon, il y a pas mal de choses que je ne comprends plus du coup faut bien avouer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public arrRingSuppRel(indRingSuppFirst To indRingSuppLast, indRingSuppFirst To indRingSuppLast) As Byte
    Public arrRingSuppName(indRingSuppFirst To indRingSuppLast) As String
     
    Public arrRingPrefRel(indRingPrefFirst To indRingPrefLast, indRingPrefFirst To indRingPrefLast) As Byte
    Public arrRingPrefName(indRingPrefFirst To indRingPrefLast) As String
     
    Public arrRingSuffRel(indRingSuffFirst To indRingSuffLast, indRingSuffFirst To indRingSuffLast) As Byte
    Public arrRingSuffName(indRingSuffFirst To indRingSuffLast) As String
    La, j'avoue ne pas comprendre ces lignes...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? SuffixeToString(indObjRing, SuffixeRelation(indObjRing, indRingSuffBeaute, indRingSuffConcentration))
    Ok. Il apparait que cette fonction sera la fonction de base à la fusion des objets.
    Merci !


    Citation Envoyé par MattChess Voir le message
    S'il n'y a qu'une solution à afficher, alors supprimez la seconde solution. Cela sera plus simple à décrire avec des constantes.
    Oui effectivement, si il n'y a qu'une unique solution, il n'y en aura qu'une.
    Mais je souhaiterais que si la fonction Merge() trouve, par exemple, 7 solutions elle m'indique ces 7 soltions afin que je puisse décider de quelle solution semble la plue pérenne pour moi dans le jeux.

    Citation Envoyé par MattChess Voir le message
    Il faut veiller à respecter le même nombre de rangées vides entre deux familles d'objets.
    Je vais faire attention à ça alors !
    Quand j'aurais implémenté les 8 autre types d'objets (avec leur supports, préfixes et suffixes, je regarderais ça de plus prêt !)

    Citation Envoyé par MattChess Voir le message
    On peut tout faire. C'est vous qui choisissez si vous préférez des nombres ou des chaînes pour la saisie. En général, c'est plus lisible de choisir des chaînes de caractères.
    Ok.
    Je me demandais juste si cela aurait favorisé le codage, et la durée de traitement par excel.

    Citation Envoyé par MattChess Voir le message
    Oui. Une fois la saisie validée, le choix du joueur sera converti par une des constantes définies. Dans la solution, on pourra afficher la chaîne correspondante comme dans la session ci-dessus dans la fenêtre d'Exécution immédiate.
    Oui, mais lorsque l'on aura rempli (à la main) la cible que l'on désire et les objets que l'on a en stock, il serait peut être bon de vérifier que l'on a bien tout rentré correctement. Vérifier si il n'y a pas une faute d'orthographe par exemple.
    En simplifiant: faire un bouton qui lance la macro: vérifier l'orthogaphe ET un autre bouton qui lance la macro Merge().
    Non?


    Citation Envoyé par MattChess Voir le message
    Il faut définir la fonction d'évaluation d'une solution permettant de trier chaque essai selon un score.
    Justement, il n'y a pas d'évaluation.
    Mais si la fonction merge trouve une solution en 3étapes, une autre en 4étapes, et deux dernières en 5étapes, ce serait bien qu'elle affiche dans l'ordre:
    3étapes - 4étapes - 5étapes - 5étapes


    J'ai tenté de décrire encore un peu la fonction merge !

    Merci...again

    PS: j'aurais donc les données, comme dans mon fichier d'hier à implémenter pour les autres types d'objets
    La fonction Sub InitRpg()
    Toutes les parties Case des fonctions suivantes
    C'est bien cela?
    (en espérant que je ne me tromperais pas !)

    PS2: je dois zipper le fichier car il fait 150Ko et c'est au dessus de la limite autorisée par le forum

    EDIT: à noter que je n'ai plus accès au clique droit sur mon bouton, lorsque je suis sur le feuille Fusion. Et que je ne peux plus le déplacer non plus
    -___-'

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Par défaut La quatrième dimension avec Excel VBA
    Citation Envoyé par Mangaku Voir le message
    Ca m'encourage à vraiment comprendre ce qui se passe et y mettre mon petit grain de "folie"


    1. La quatrième dimension

    Citation Envoyé par Mangaku Voir le message
    il y a pas mal de choses que je ne comprends plus du coup faut bien avouer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public arrRingSuppRel(indRingSuppFirst To indRingSuppLast, indRingSuppFirst To indRingSuppLast) As Byte
    Dans la nouvelle version 0.3.1, on a regroupé les anciens tableaux (array) de l'objet Ring :

    • arrRingSuppRel de l'objet "Ring", type "Support" de corrélation,
    • arrRingPrefRel de type "Prefixe" et
    • arrRingSuffRel de type "Suffixe"


    en un seul tableau à ... 4 dimensions. Cela simplifiera les modifications pour ajout d'autres objets.

    Les quatre dimensions sont :

    • l'indice de l'objet parmi Ring, Aad.
    • type de propriété parmi "Support", "Prefixe" et "Suffixe"
    • la matrice 2D de corrélation nbrProperties x nbrProperties.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ' Tableau de corrélation entre propriétés par objet et type de propriétés
    Public arrObjRel(indObjFirst To indObjLast, indTypePropertyFirst To indTypePropertyLast, _
                     indPropertyFirst To nbrMaxProperties, indPropertyFirst To nbrMaxProperties) As Byte
    On déclare pour chaque indice les limites de sa borne minimum à (To) sa borne maximum.

    Les tableaux de corrélation sont déjà décrits dans la feuille "Donnés fusion".
    InitRpg() lit le tableau et copie chaque relation dans le tableau interne arrObjRel dont le nom est construit en prenant les 3 premières lettres de array, objet, relation. Si on copie ces relations dans un tableau VBA, c'est que l'accès sera beaucoup plus rapide que de relire plusieurs fois les cellules de la feuille.

    2. Description simplifiée des objets

    Citation Envoyé par Mangaku Voir le message
    Quand j'aurais implémenté les 8 autre types d'objets (avec leur supports, préfixes et suffixes,)
    Dans la nouvelle version 0.3.1, on a considérablement simplifier la description des futurs objets puisqu'on ne déclarera que la première et la dernière des propriétés par type "Support", "Prefixe" et "Suffixe". Les propriétés intermédiaires ne seront pas nécessaires car leurs noms existent dans la colonne d'indice colObjName = 35 ' Colonne AI. Voir le chapitre 3. Comment ajouter un nouvel objet ? dans le message précédent qui a été mis à jour.

    3. Comment utiliser la fenêtre d'Exécution immédiate ?

    Citation Envoyé par Mangaku Voir le message
    La, j'avoue ne pas comprendre ces lignes...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? SuffixeToString(indObjRing, SuffixeRelation(indObjRing, indRingSuffBeaute, indRingSuffConcentration))
    Comme on ne sait pas à partir d'où -- dès le "?" ou à la fin avec les deux parenthèses fermantes imbriquées "))" -- on peut décrocher, on va détailler avec plus information comment utiliser cette fenêtre d'Exécution immédiate parce qu'on l'utilisera tout au long du projet du module ModMerge. Si vous connaissez déjà, sautez les lignes en lisant en diagonale.

    Vous avez dû ouvrir la fenêtre d'Exécution immédiate dans 1.1 Préparez l'environnement de développement du message #8. Sinon ouvrez cette fenêtre.

    Cliquez sur le VBE menu "Affichage" > "Fenêtre d'Exécution" (Ctrl+G)
    Cette fenêtre permet de lancer une macro en indiquant son nom ou tester une expression VBA en ajoutant un point d'interrogation devant ou apprendre le langage VBA.

    Copier-coller l'expression suivante et valider par ENTER :
    18/08/2011

    Contrairement au français où le point d'interrogation se trouve en fin de phrase, en informatique il faut souvent inverser les choses. Le point d'interrogation débute la requête dans la fenêtre d'Exécution immédiate pour demander à VBA d'évaluer l'expression qui suit.

    On a demandé à VBA d'afficher la date courante en utilisant le mot-clé "Date" qui est une fonction intégrée dans VBA retournant la date courante. Cette fonction VBA est basique. Elle n'a pas de paramètre à mettre entre parenthèse.
    Ce n'est pas le cas de la fonction SuffixeToString() qui demande deux paramètres : l'objet et la propriété de type "Suffixe".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? SuffixeToString(indObjRing, SuffixeRelation(indObjRing, indRingSuffBeaute, indRingSuffConcentration))
    Justesse

    La chaîne littérale "Justesse" a été écrite dans la fenêtre d'Exécution immédiate par la macro SuffixeToString() qui convertit une propriété de type "Suffixe" en String c-a-d en chaîne de caractère.

    Cette propriété de type "Suffixe" appartient à l'objet Ring identifié par le 1er paramètre à savoir son indice indObjRing dans la famille des objets.

    L'indice de la propriété de type "Suffixe" a été calculé par une autre macro que l'on pourrait lancer indépendamment par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? SuffixeRelation(indObjRing, indRingSuffBeaute, indRingSuffConcentration)
    10
    C'est la propriété de corrélation entre "Beauté" et "Concentration" dans la propriété Suffixe de l'objet Ring.

    Seulement 10, ce n'est pas très parlant d'afficher que c'est la 10ème propriété de type "Suffixe" de l'objet Ring. C'est pourquoi on a demandé de convertir ce nombre en une String.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? SuffixeToString(indObjRing, 10)
    Justesse

    Maintenant si vous remplacez le 10 par l'appel de la fonction SuffixeRelation() avec ses deux paramètres, vous obtiendrez l'expression initiale avec ses parenthèses imbriquées. C'est l'imbrication de fonctions en mathématique : f(x, g(y)) d'où les deux parenthèses fermantes imbriquées "))".

    Le but est de vérifier que la corrélation entre "Beauté" et "Concentration" donne bien "Justesse" même si cela a été indiqué dans la feuille "Données Fusion". S'il y a une erreur d'indice, un décalage, un mauvais n° de description de la 1ere rangée ou de colonne, la fonction renverra la chaîne vide invisible ou n'importe quoi au lieu de "Justesse". Il faut donc bien vérifier que cette fonction SuffixeRelation() ainsi que les autres fonctionnent correctement en prenant d'autres exemples de propriétés de type "Suffixe". Idem pour les autres types.

    4. Modification du classeur vs. du module

    Citation Envoyé par Mangaku Voir le message
    je dois zipper le fichier car il fait 150Ko
    Vous avez ajouté un commentaire en fin de ModMerge. Il vaut mieux éviter de publier le .zip s'il n'a pas modification importante d'une feuille.

    Copier-coller l'extrait du module entre les balises [code] et [/code]. Dans la barre d'outils de l'éditeur du message du forum, sélectionner l'extrait de code à la souris et cliquez sur le bouton "#" qui ajoutera ces deux balises automatiquement pour vous.

    Il faut faire des phrases courtes dans un style télégraphique en utilisant les constantes définies dans ModMerge. Une seule phrase par ligne sans parenthèses.

    5. Commentaire en pseudo-code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ' Exemple de mon casque. J'ai comme objet cible un chapeau tigre de l'adrénaline.
    Please, stop! "chapeau tigre de l'adrénaline" est une expression en français.
    Il faut indiquer son nom de constante ou la mettre entre guillemets et décomposer si nécessaire chaque élément en terme de support, préfixe et suffixe. Je suis incapable de dire si "Chapeau" est un support, "Tigre" un préfixe et "adrénaline" un suffixe ou si l'ensemble "chapeau tigre de l'adrénaline " est un support. Comparer avec les deux lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ' Dans l'ordre : support, prefixe, suffixe
    ' cible  = "chapeau", "tigre", "adrénaline" ' Exemple de mon casque
    Il faut donner le type de chaque donnée en commentaire c-a-d si c'est un objet, un support, un préfixe, un suffixe, une String, un nombre, un tableau. Cela s'appelle la déclaration des variables ou Dimensionnement des variables et VBA a le mot-clé Dim ou Public pour cela.

    Citation Envoyé par Mangaku Voir le message
    si la fonction MergeObject() trouve une solution en 3étapes, une autre en 4étapes, et deux dernières en 5étapes, ce serait bien qu'elle affiche dans l'ordre:
    3étapes - 4étapes - 5étapes - 5étapes
    La succession de n° d'étapes de 3 à 5 sur une seule ligne n'aide pas trop à savoir qu'est-ce qu'il y a dans chaque étape.

    Refaire un exemple avec un objet Cible déjà connu tel que Ring et/ou Aad et un Stock minimal que l'on décrira.
    Lister chaque étape dans le détail, d'où l'idée d'avoir un Stock minimal et une Cible, les deux les plus simples possibles pour limiter le nombre d'étapes. Cela devrait tenir sur une seule ligne par itération éventuellement avec un commentaire en fin de ligne.
    Si la description d'une étape comme la première nécessite plus d'une ligne, on pourra la raffiner.

    Décrire en pseudo-code VBA sans se préoccuper de la syntaxe puisque c'est du commentaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ' Données d'entrée Cible et Stock
    ' Cible : Support = indRingSuppBracelet. Prefixe = indRingPrefBronze. Suffixe = ?
    ' Stock : à définir...
    
    ' Itération sur ...; indiquez l'indice ou les indices de boucles.
    ' Etape n°1 :  Support = indRingSuppBracelet . Prefixe = indRingPrefBronze. Suffixe = indRingSuffDelit ' premier suffixe de Ring
    ' Pour passer à l'étape j'incrémente ...
    
    ' Etape n°2 : Support = indRingSuppBracelet . Prefixe = indRingPrefBronze. Suffixe = indRingSuffBeaute ' second suffixe de Ring
    ' Pourquoi je ne passe pas à l'étape suivante ? Quel est le critère d'arrêt ?
    
    ' Le résultat le plus optimal est dans la ligne suivante :
    ' ...
    ' La raison est parce que ...
    Comment comparer les deux dernières solutions qui ont toutes les deux 5 étapes ?

    Le pseudo-code est un style télégraphique, court où on a isolé les termes utilisés par ModMerge.
    Chaque phrase commence par un majuscule. Cela signifie que la précédente est terminée.
    Ce n'est surtout pas littéraire avec des relatives et des pronoms mais syntaxique avec des délimiteurs, des séparateurs, des guillemets, un point d'interrogation pour poser une question, des égalités, des justifications sur les indices de boucles, étape suivante, critère d'arrêt.

    Il faut qu'à la lecture, on puisse en déduire le cas général pour une famille d'objets ou pour plusieurs types de propriétés.
    Qu'est-ce qui est fixe d'une itération à l'autre ?
    Qu'est-ce qui change d'une itération à l'autre ? Réponse en commentaire.

    6. Interface Graphique Utilisateur (GUI) sur la feuille "Fusion"

    Citation Envoyé par Mangaku Voir le message
    vérifier que l'on a bien tout rentré correctement.
    En simplifiant: faire un bouton qui lance la macro: vérifier l'orthographe ET un autre bouton qui lance la macro MergeObject().
    Pour le moment, on n'a pas besoin de mettre de bouton sur la feuille Fusion.
    On pourra lancer les procédures et fonctions dans la fenêtre d'Exécution immédiate pour les tester.

    Citation Envoyé par Mangaku Voir le message
    à noter que je n'ai plus accès au clique droit sur mon bouton, lorsque je suis sur la feuille Fusion. Et que je ne peux plus le déplacer non plus
    C'est la différence entre :

    • le mode conception (design) où on crée les boutons, on les déplace, on peut changer leurs noms, leurs Captions, on peut créer et coder l'événement Click.
    • le mode d'exécution où on ne peut que cliquer sur un bouton.


    Pour passer d'un mode à l'autre, il y a dans la barre d'outils de VBA au-dessus de la feuille "Fusion", le bouton "Design Mode" dont l'icône est une équerre bleue. Il faut au préalable avoir mis la barre d'outil VBA qui montre également l'enregistreur de macros.

  11. #11
    Membre actif
    Homme Profil pro
    Ingénieur PI
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur PI
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Par défaut
    Sincèrement... merci !
    C'est juste génial de lire vos post.
    Vous arrivez à expliquer clairement les lignes de code !
    Je ne sais pas si on arrivera au terme de ce projet, mais j'en retire déjà baucoup d'enseignements.
    Franchement, encore et encore merci !


    Je vais donc refaire la partie description que j'ai mit en fin de code VBA comme vous le demandez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    ' Données d'entrée Cible et Stock
    ' Cible : Support = indRingSuppAnneau. Prefixe = indRingPrefTitane. Suffixe = indRingSuffJouvence.
    ' Stock : Support = indRingSuppAnneau. Prefixe = indRingPrefDiamant. Suffixe = indRingSuffDelit.
    '         Support = indRingSuppAnneau. Prefixe = indRingPrefDur. Suffixe = indRingSuffPeauDur.
    '         Support = indRingSuppAnneau. Prefixe = indRingPrefArgent. Suffixe = indRingSuffAstuce.
    '         Support = indRingSuppAnneau. Prefixe = indRingPrefPlatine. Suffixe = indRingSuffJustesse.
    '         Support = indRingSuppAnneau. Prefixe = indRingPrefDistingue. Suffixe = indRingSuffArt.
    '         Support = indRingSuppAnneau. Prefixe = indRingPrefArgent. Suffixe = indRingSuffSagesse.
    '         Support = indRingSuppBracelet. Prefixe = indRingPrefAstra. Suffixe = indRingSuffSagesse.
    '         Support = indRingSuppBracelet. Prefixe = indRingPrefBronze. Suffixe = indRingSuffSagesse.
    '         Support = indRingSuppBracelet. Prefixe = indRingPrefBronze. Suffixe = indRingSuffPeauDur.
    '         Support = indRingSuppChevaliere. Prefixe = indRingPrefBronze. Suffixe = indRingSuffGenie.
    '         Support = indRingSuppChevaliere. Prefixe = indRingPrefOr. Suffixe = indRingSuffSagesse.
    '
    ' Itération sur ???; indiquez l'indice ou les indices de boucles => limite = toutes combinaisons testées
    '
    'Première solution
    ' Etape n°1 :  Support = indRingSuppAnneau . Prefixe = indRingPrefArgent. Suffixe = indRingSuffAstuce.
    ' Je Merge() avec: Support = indRingSuppAnneau . Prefixe = indRingPrefDur. Suffixe = indRingSuffPeauDur.
    ' Résultat: Support = indRingSuppAnneau . Prefixe = indRingPrefDistingue. Suffixe = indRingSuffSang. ' Pas la cible, donc continuer avec un autre objet du stock
    ' Etape n°2 :  Support = indRingSuppAnneau . Prefixe = indRingPrefDistingue. Suffixe = indRingSuffSang.
    ' Je Merge() avec: Support = indRingSuppAnneau . Prefixe = indRingPrefArgent. Suffixe = indRingSuffSagesse.
    ' Résultat: Support = indRingSuppAnneau. Prefixe = indRingPrefTitane. Suffixe = indRingSuffJouvence. 'C'est la cible. Donc afficher les différentes étapes sur la feuille "Fusion"
    '
    'Deuxième solution
    ' Etape n°1 :  Support = indRingSuppChevaliere. Prefixe = indRingPrefBronze. Suffixe = indRingSuffGenie.
    ' Je Merge() avec: Support = indRingSuppBracelet. Prefixe = indRingPrefBronze. Suffixe = indRingSuffSagesse.
    ' Résultat: Support = indRingSuppAnneau . Prefixe = indRingPrefBronze. Suffixe = indRingSuffPeauDur. ' Pas la cible, donc continuer avec un autre objet du stock
    ' Etape n°2 :  Support = indRingSuppBracelet. Prefixe = indRingPrefBronze. Suffixe = indRingSuffPeauDur.
    ' Je Merge() avec: Support = indRingSuppChevaliere. Prefixe = indRingPrefOr. Suffixe = indRingSuffSagesse.
    ' Résultat: Support = indRingSuppAnneau . Prefixe = indRingPrefOr. Suffixe = indRingSuffLoupGarou. ' Pas la cible, donc continuer avec un autre objet du stock
    ' Etape n°3 :  Support = indRingSuppAnneau . Prefixe = indRingPrefBronze. Suffixe = indRingSuffPeauDur.
    ' Je Merge() avec: Support = indRingSuppAnneau . Prefixe = indRingPrefOr. Suffixe = indRingSuffLoupGarou.
    ' Résultat: Support = indRingSuppAnneau . Prefixe = indRingPrefOr. Suffixe = indRingSuffArt. ' Pas la cible, donc continuer avec un autre objet du stock
    ' Etape n°4 :  Support = indRingSuppAnneau . Prefixe = indRingPrefOr. Suffixe = indRingSuffArt.
    ' Je Merge() avec: Support = indRingSuppAnneau. Prefixe = indRingPrefPlatine. Suffixe = indRingSuffJustesse.
    ' Résultat: Support = indRingSuppAnneau. Prefixe = indRingPrefTitane. Suffixe = indRingSuffJouvence. 'C'est la cible. Donc afficher les différentes étapes sur la feuille "Fusion"
    Il n'y a pas d'optimum ou autre à chercher.
    Le but ici étant d'afficher TOUTES les solutions possibles.

    Encore moi.
    Je me permets de poster une archive ZIP, car j'ai rajouté toutes les feuilles manquantes, et incrémentés ma feuille de données.

    Par contre, dans les macros, pour implémenter les nouveaux objets... je bloque.
    Je ne comprends pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    '__________________________________ Modèle pour ajouter un nouvel objet Name
     
    ' Name  Support
    Public Const nbrMaxNameSupp = 15 ' La famille NameSupp a 15 supports possibles
    Public Const rowNameSuppStart = rowAadSuffStart + nbrMaxAadSuff + nbrRowFamily ' Première rangée de la famille NameSupp
    Public Const rowNameSuppEnd = rowNameSuppStart + nbrMaxNameSupp - 1 ' Dernière rangée de la famille NameSupp
     
    Public Const indNameSuppPropty1 = indPropertyFirst ' Premier élément de la famille NameSupp
    ' ... Il n'est plus utile de créer les Propty2 à 14 intermédiaires
    Public Const indNameSuppPropty15 = nbrMaxNameSupp ' Dernier élément de la famille NameSupp
     
    ' Name  Prefixe
    Public Const nbrMaxNamePref = 7 ' La famille NamePref a 7 Prefixes possibles
    Public Const rowNamePrefStart = rowNameSuppStart + nbrMaxNameSupp + nbrRowInter ' Première rangée de la famille NamePref
    Public Const rowNamePrefEnd = rowNamePrefStart + nbrMaxNamePref - 1 ' Dernière rangée de la famille NamePref
     
    Public Const indNamePrefErrance = indPropertyFirst ' Premier élément de la famille NamePref
    ' ... Il n'est plus utile de créer les Prefixes intermédiaires
    Public Const indNamePrefSalvage = nbrMaxNamePref ' Dernier élément de la famille NamePref
     
    ' Name  Suffixe
    Public Const nbrMaxNameSuff = 11 ' La famille NameSuff a 11 suffixes possibles
    Public Const rowNameSuffStart = rowNamePrefStart + nbrMaxNamePref + nbrRowInter ' Première rangée de la famille NameSuff
    Public Const rowNameSuffEnd = rowNameSuffStart + nbrMaxNameSuff - 1 ' Dernière rangée de la famille NameSuff
     
    Public Const indNameSuffExpander = indPropertyFirst ' Premier élément de la famille NameSuff
    ' ... Il n'est plus utile de créer les suffixes intermédiaires
    Public Const indNameSuffColapser = nbrMaxNameSuff ' Dernier élément de la famille NameSuff
    Je n'ai pas contre pas encore regardé les [case], donc je ne sais pas si j'y arriverais. Mais à première vu, cela semble plus à ma portée.


    PS: j'ai un message d'erreur lorsque je ferme mon fichier:
    Erreur de compilation:
    nom ambigu détecté: nbrMaxAadSupp
    Apparemment cela ne semble pas déranger. Je laisse comme ça?

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Par défaut Fusion multiple ou unique ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nom ambigu détecté: nbrMaxAadSupp
    parce qu'il est défini deux fois : oubli de le renommer dans Amu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ' Données Amulettes (Amu) Support
    Public Const nbrMaxAadSupp = 5 ' La famille AmuSupp a 5 supports possibles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ' Données Armes à Distance (AAD) Support
    Public Const nbrMaxAadSupp = 11 ' La famille AadSupp a 11 supports possibles
    Fusion multiple ou unique ?

    Quand deux objets ont été fusionnés pour en générer un troisième,
    est-ce qu'on peut réutiliser une nouvelle fois les deux objets --bien qu'ils soient déjà fusionnés --
    ou on ne peut utiliser que l'objet fusionné résultant ?

  13. #13
    Membre actif
    Homme Profil pro
    Ingénieur PI
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur PI
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Par défaut
    Merci pour la réponse.
    Effectivement, me suis raté sur un remplacement de nom de variable !


    Pour les fusions: imaginons qu'en stock nous ayons:
    A,B,C,D et E

    Si A+B=Z
    Si on utilise Z par la suite pour obtenir le résultat désiré (Z+D=cible), on ne peut donc pas utiliser A.

    Mais peut etre par contre que A+D=cible. Donc il ne faut pas oublier quand même de vérifier avec chaque élément de base du stock.

    Tout comme: A+B=Z, D+E=Y, Z+Y=cible.


    PS: pour l'insertion d'objet?

    EDIT: j'ai continué à implémenter des objets.
    J'ai donc rempli totues les [case]
    Merci

    J'ai continué à chercher à comprendre

    Je me suis donc essayé à renommer les données d'entrées pour les Ring et en ai profité pour ajouter les données pour Amu

    Voila ce que cela donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    ' ================================ Description de chaque famille d'objet ================================
    ' =======================================================================================================
     
    ' ================================ Ring ================================
    ' Données Anneaux Support
    Public Const nbrMaxRingSupp = 3 ' La famille RingSupp a 3 valeurs possibles
    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
    Public Const indRingSuppAnneau = indRingSuppFirst ' Premier élément de la famille RingSupp
    Public Const indRingSuppChevaliere = nbrMaxRingSupp ' Dernier élément de la famille RingSupp
     
    ' Données Anneaux Prefixe
    Public Const nbrMaxRingPref = 28 ' La famille RingPref a 28 prefixes possibles
    Public Const rowRingPrefStart = rowRingSuppStart + nbrMaxRingSupp + nbrRowInter ' Première rangée de la famille RingPref
    Public Const rowRingPrefEnd = rowRingPrefStart + nbrMaxRingPref - 1 ' Dernière rangée de la famille RingPref
    Public Const indRingPrefBronze = indRingPrefFirst ' Premier élément de la famille RingPref
    Public Const indRingPrefNoir = nbrMaxRingPref ' Dernier élément de la famille RingPref
     
    ' Données Anneaux Suffixe
    Public Const nbrMaxRingSuff = 20 ' La famille RingSuff a 20 suffixes possibles
    Public Const rowRingSuffStart = rowRingPrefStart + nbrMaxRingPref + nbrRowInter ' Première rangée de la famille RingSuff
    Public Const rowRingSuffEnd = rowRingSuffStart + nbrMaxRingSuff - 1 ' Dernière rangée de la famille RingSuff
    Public Const indRingSuffDelit = indRingSuffFirst ' Premier élément de la famille RingSuff
    Public Const indRingSuffFacilite = nbrMaxRingSuff ' Dernier élément de la famille RingSuff
     
    ' Relations entre les différents éléments de la famille Ring
    Public arrRingSuppRel(indRingSuppFirst To indRingSuppLast, indRingSuppFirst To indRingSuppLast) As Byte
    Public arrRingSuppName(indRingSuppFirst To indRingSuppLast) As String
     
    Public arrRingPrefRel(indRingPrefFirst To indRingPrefLast, indRingPrefFirst To indRingPrefLast) As Byte
    Public arrRingPrefName(indRingPrefFirst To indRingPrefLast) As String
     
    Public arrRingSuffRel(indRingSuffFirst To indRingSuffLast, indRingSuffFirst To indRingSuffLast) As Byte
    Public arrRingSuffName(indRingSuffFirst To indRingSuffLast) As String
    '
    ' ================================ Amu ================================
    ' =====================================================================
    '
    ' Données Amulettes (Amu) Support
    Public Const nbrMaxAmuSupp = 5 ' La famille AmuSupp a 5 supports possibles
    Public Const rowAmuSuppStart = rowRingSuffStart + nbrMaxRingSuff + nbrRowFamily ' Première rangée de la famille AmuSupp
    Public Const rowAmuSuppEnd = rowAmuSuppStart + nbrMaxAmuSupp - 1 ' Dernière rangée de la famille AmuSupp
    Public Const indAmuSuppCollier = indPropertyFirst ' Premier élément de la famille AmuSupp
    Public Const indAmuSuppCravate = nbrMaxAmuSupp ' Dernier élément de la famille NameSupp
     
    ' Donnée Amu Prefixe
    Public Const nbrMaxAmuPref = 28 ' La famille AmuPref a 28 Prefixes possibles
    Public Const rowAmuPrefStart = rowAmuSuppStart + nbrMaxAmuSupp + nbrRowInter ' Première rangée de la famille AmuPref
    Public Const rowAmuPrefEnd = rowAmuPrefStart + nbrMaxAmuPref - 1 ' Dernière rangée de la famille AmuPref
    Public Const indAmuPrefBronze = indPropertyFirst ' Premier élément de la famille AmuPref
    Public Const indAmuPrefNoir = nbrMaxAmuPref ' Dernier élément de la famille AmuPref
     
    ' Donnée Amu Suffixe
    Public Const nbrMaxAmuSuff = 20 ' La famille AmuSuff a 20 Suffixes possibles
    Public Const rowAmuSuffStart = rowAmuPrefStart + nbrMaxAmuPref + nbrRowInter ' Première rangée de la famille AmuSuff
    Public Const rowAmuSuffEnd = rowAmuSuffStart + nbrMaxAmuSuff - 1 ' Dernière rangée de la famille AmuSuff
    Public Const indAmuSuffDelit = indPropertyFirst ' Premier élément de la famille AmuSuff
    Public Const indAmuSuffFacilité = nbrMaxAmuSuff ' Dernier élément de la famille AmuSuff
     
    ' Relations entre les différents éléments de la famille Amu
    Public arrAmuSuppRel(indAmuSuppFirst To indAmuSuppLast, indAmuSuppFirst To indAmuSuppLast) As Byte
    Public arrAmuSuppName(indAmuSuppFirst To indAmuSuppLast) As String
     
    Public arrAmuPrefRel(indAmuPrefFirst To indAmuPrefLast, indAmuPrefFirst To indAmuPrefLast) As Byte
    Public arrAmuPrefName(indAmuPrefFirst To indAmuPrefLast) As String
     
    Public arrAmuSuffRel(indAmuSuffFirst To indAmuSuffLast, indAmuSuffFirst To indAmuSuffLast) As Byte
    Public arrAmuSuffName(indAmuSuffFirst To indAmuSuffLast) As String
    Est ce correct?
    Si oui, je vais continuer à renter les données pour les autres types d'objets !

    En tout cas, j'avoue que cela m'amuse d'essayer de comprendre, et de faire évoluer ces macros !

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Par défaut Combinatoire dans le Stock
    1. Impacts de l'absence des constantes intermédiaires

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ' Données Amulettes (Amu) Support
    Public Const nbrMaxAmuSupp = 5 ' La famille AmuSupp a 5 supports possibles
    Public Const rowAmuSuppStart = rowRingSuffStart + nbrMaxRingSuff + nbrRowFamily ' Première rangée de la famille AmuSupp
    Public Const rowAmuSuppEnd = rowAmuSuppStart + nbrMaxAmuSupp - 1 ' Dernière rangée de la famille AmuSupp
    Public Const indAmuSuppCollier = indPropertyFirst ' Premier élément de la famille AmuSupp
    Public Const indAmuSuppCravate = nbrMaxAmuSupp ' Dernier élément de la famille NameSupp
    Cette forme simplifiée où on omet les supports intermédiaires entre indAmuSuppCollier et indAmuSuppCravate est valable si on accepte que la saisie du stock ne fasse avec des n° sans pouvoir utiliser des noms de constantes.

    Voici la future procédure de test pour initialiser le Stock grâce aux constantes nommées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub StockInit()
        StockAdd indObjRing, indRingSuppAnneau, indRingPrefDiamant, indRingSuffDelit
    End Sub
    S'il n'y a plus les constantes indRingSuppAnneau, indRingPrefDiamant ou indRingSuffDelit, il faudra remplacer les trois derniers paramètres par leur n° dans leur famille Support, Prefixe, Suffixe de l'objet Ring.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub StockInit()
        StockAdd indObjRing, 1, 20, 1 ' Ajoute l'objet Ring, support Anneau, prefixe Diamant, suffixe Delit
    End Sub
    En final, on sélectionnera certainement un Support dans une listbox sur la feuille, ce qui fait que l'on n'a pas besoin de définir les constantes de supports intermédiaires. Les constantes, qui existent déjà, n'ont pas besoin d'être effacées.

    Pour résumer, les constantes intermédiaires de support ne sont réellement utiles que pendant le test dans StockInit().

    Il n'est plus nécessaire de définir les tableaux arrAmuSuppRel, arrAmuSuppName et compagnie car ils ont été remplacés par arrObjRel dans 1. La quatrième dimension du message #11.

    2. Questions

    Quel est le nombre maximum d'objets dans le Stock ?
    Peut-on toujours atteindre la cible ?
    Quel est le nombre maximum d'étapes pour l'atteindre ? Donnez un ordre d'idée. 10 ? 1000 ? Plus ?
    Est-ce qu'on est sûr avec les tables de corrélation qu'un objet ne peut jamais changer de famille par exemple de Ring vers Aad ?

    3. Simulateur de fusion

    Ce module VBA de test n'est pas à intégrer dans le classeur Fusion.xls
    On peut le tester dans un classeur vide. Il a pour but de valider le principe de fusion et voir si la première étape de recherche de la cible est bien dans la combinatoire suivante.

    Dans le VBE d'un classeur vide, insérez Module1 et copier-coller le code VBA suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    Option Explicit ' Maquette pour valider le nombre de combinaison selon le stock
    Const nbrObjMerged = 2, nbrObjMax = 10, nbrCombMax = 100000
    Public arrComb(0 To nbrCombMax) As String
    Public nbrEvolutionStock As Long, collFusion As Collection
     
    Sub Comb(Optional ByVal nbrObj As Byte = 4)
    Dim stock As String, nbrComb As Long, indComb As Long
    Dim indObj As Byte, strResult As String, nbrCombNoRepNoOrder As Long
     
        If nbrObj < 2 Or nbrObj > nbrObjMax Then Stop: Exit Sub
        nbrCombNoRepNoOrder = CombinaisonSansRepetitionSansOrdre(nbrObjMerged, nbrObj)
        ' Initialisation du stock avec les nbrObj premières lettres de l'alphabet
        For indObj = 1 To nbrObj: stock = stock + Chr(indObj + Asc("A") - 1): Next
        For indObj = 1 To nbrObj: strResult = strResult + " " + Mid(stock, indObj, 1): Next
        nbrComb = 0: arrComb(nbrComb) = Trim(strResult)
        nbrEvolutionStock = 0: Set collFusion = New Collection
        CombMulti "", stock, nbrComb
        For indComb = 0 To nbrComb
            Debug.Print indComb & ": " & arrComb(indComb)
            If indComb = nbrCombNoRepNoOrder Then Debug.Print
        Next
        Debug.Print "Nombre total de combinaisons générées : " & nbrComb
        Debug.Print "Nombre d'évolutions du stock          : " & nbrEvolutionStock
        Debug.Print "Nombre de fusions uniques             : " & collFusion.Count
        Set collFusion = Nothing
        AnalyseCombinatoire nbrObj, nbrCombNoRepNoOrder
    End Sub
     
    Sub AnalyseCombinatoire(ByVal nbrObj As Byte, ByVal nbrCombNoRepNoOrder As Long)
        Debug.Print "===================================== : Analyse combinatoire"
        Debug.Print "Nombre des combinaisons sans répétition de n éléments pris k à k"
        Debug.Print "Combinaison sans remise C(k, n): " & nbrObj & "! / (2! * (" & nbrObj & "-2))! = " & _
            nbrCombNoRepNoOrder
        Debug.Print "Combin. avec remise C(k, n+k-1): (" & nbrObj & "+2-1)! / (2! * (" & nbrObj & "-1))! = " & _
            CombinaisonSansRepetitionAvecOrdre(nbrObjMerged, nbrObj)
        Debug.Print "Arrangement A(k, n) sans rept. : " & nbrObj & "! / (" & nbrObj & "-2)! = " & _
            ArrangementSansRepetition(nbrObjMerged, nbrObj)
        Debug.Print "Arrangement A(k, n) avec rept. : " & nbrObj & "^" & nbrObjMerged & " = " & _
            ArrangementAvecRepetition(nbrObjMerged, nbrObj)
        Debug.Print "Permutations sans repetition   : " & nbrObj & "! = " & _
            PermutationSansRepetition(nbrObj)
        Debug.Print "Permutations avec repetition   : " & nbrObj & "! / " & nbrObjMerged & "! = " & _
            PermutationAvecRepetition(nbrObjMerged, nbrObj)
    End Sub
     
    ' Ajouter une combinaison unique
    Sub AddComb(ByVal strResult As String, ByRef nbrComb As Long)
    Dim indComb As Long
     
        For indComb = 0 To nbrComb
            If strResult = arrComb(indComb) Then Stop ' Verifier l'unicite
        Next
        nbrComb = nbrComb + 1
        If indComb > nbrCombMax Then Stop ' Trop de combinaisons
        arrComb(nbrComb) = strResult
    End Sub
     
    Function PermutationAvecRepetition(ByVal nbrFusion As Long, ByVal nbrObj As Long) As Long
        With Application.WorksheetFunction
            PermutationAvecRepetition = .Fact(nbrObj) / .Fact(nbrFusion)
        End With
    End Function
     
    Function PermutationSansRepetition(ByVal nbrObj As Integer) As Long
        PermutationSansRepetition = Application.WorksheetFunction.Fact(nbrObj)
    End Function
     
    Function ArrangementAvecRepetition(ByVal nbrFusion As Integer, ByVal nbrObj As Integer) As Long
        ArrangementAvecRepetition = nbrObj ^ nbrFusion
    End Function
     
    Function ArrangementSansRepetition(ByVal nbrFusion As Integer, ByVal nbrObj As Integer) As Long
        With Application.WorksheetFunction ' sans répétition sans ordre
            ArrangementSansRepetition = .Fact(nbrObj) / .Fact(nbrObj - nbrFusion)
        End With
    End Function
     
    Function CombinaisonSansRepetitionSansOrdre(ByVal nbrFusion As Integer, ByVal nbrObj As Integer) As Long
        With Application.WorksheetFunction ' sans répétition sans ordre
            CombinaisonSansRepetitionSansOrdre = .Fact(nbrObj) / _
                                   (.Fact(nbrFusion) * .Fact(nbrObj - nbrFusion))
        End With
    End Function
     
    Function CombinaisonSansRepetitionAvecOrdre(ByVal nbrFusion As Integer, ByVal nbrObj As Integer) As Long
        With Application.WorksheetFunction ' sans répétition avec ordre
            CombinaisonSansRepetitionAvecOrdre = .Fact(nbrObj + nbrFusion - 1) / _
                                   (.Fact(nbrFusion) * .Fact(nbrObj - 1))
        End With
    End Function
     
    Sub CombMulti(ByVal strPrefix As String, ByVal stock As String, ByRef nbrComb As Long)
    Dim indObj1 As Long, indObj2 As Long, indObj3 As Long, nbrObj As Long
    Dim strLeft As String, strFusion As String, strResult As String
    Dim stockReduced As String, strBefore As String
     
        nbrObj = Len(stock)
        If nbrObj >= nbrObjMerged Then
            For indObj1 = 1 To nbrObj
                strLeft = Mid(stock, indObj1, 1)
                For indObj2 = indObj1 + 1 To nbrObj
                    If indObj1 <> indObj2 Then
                        nbrEvolutionStock = nbrEvolutionStock + 1
                        strFusion = strLeft + Mid(stock, indObj2, 1)
                        On Error Resume Next
                        collFusion.Add nbrEvolutionStock, key:=strFusion
                        On Error GoTo 0
                    End If
                    strResult = strPrefix
                    For indObj3 = 1 To nbrObj
                        If indObj3 = indObj1 Then
                            If strResult <> "" Then strResult = strResult + " "
                            strResult = strResult + strFusion
                        ElseIf indObj3 <> indObj2 Then
                            If strResult <> "" Then strResult = strResult + " "
                            strResult = strResult + Mid(stock, indObj3, 1)
                        End If
                    Next
                    AddComb strResult, nbrComb
                Next
            Next
            For indObj1 = 1 To nbrObj
                strLeft = Mid(stock, indObj1, 1)
                For indObj2 = indObj1 + 1 To nbrObj
                    If indObj1 <> indObj2 Then
                        strFusion = strLeft + Mid(stock, indObj2, 1)
                    End If
                    strBefore = IIf(strPrefix = "", "", " ")
                    stockReduced = ""
                    For indObj3 = 1 To indObj1 - 1 ' Avant première fusion
                        strBefore = strBefore + Mid(stock, indObj3, 1) + " "
                    Next
                    For indObj3 = indObj1 + 1 To indObj2 - 1 ' Entre première fusion
                        stockReduced = stockReduced + Mid(stock, indObj3, 1)
                    Next
                    For indObj3 = indObj2 + 1 To nbrObj ' Après la première fusion
                        stockReduced = stockReduced + Mid(stock, indObj3, 1)
                    Next
                    CombMulti strPrefix + strBefore + strFusion, stockReduced, nbrComb
                Next
            Next
        End If
    End Sub
    Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE d'Excel, copier-coller et valider par ENTER :
    0: A B
    1: AB


    Le Stock initial comprend deux objets A et B.
    On simule la fusion de l'objet A et de l'objet B en les collant sans séparateur blanc entre eux.
    "AB" représente donc la fusion de A & B.

    0: A B C
    1: AB C
    2: AC B
    3: A BC

    Nombre total de combinaisons générées : 3
    Nombre d'évolutions du stock : 3
    Nombre de fusions uniques : 3


    0: A B C D
    1: AB C D
    2: AC B D
    3: AD B C
    4: A BC D
    5: A BD C
    6: A B CD

    7: AB CD
    8: AC BD
    9: AD BC
    Nombre total de combinaisons générées : 9
    Nombre d'évolutions du stock : 9
    Nombre de fusions uniques : 6


    Connaissez-vous la formule mathématique qui donnerait le nombre de combinaisons uniques du Stock après un premier niveau de fusion ?

    ...
    761: A B C D EF GH
    762: A B C D EG FH
    763: A B C D EH FG
    Nombre total de combinaisons générées : 763
    Nombre d'évolutions du stock : 763
    Nombre de fusions uniques :
    28
    ===================================== : Analyse combinatoire
    Nombre des combinaisons sans répétition de n éléments pris k à k
    Combinaison sans remise C(k, n): 8! / (2! * (8-2))! =
    28 ' C'est le nombre de fusions uniques.
    Combin. avec remise C(k, n+k-1): (8+2-1)! / (2! * (8-1))! = 36
    Arrangement A(k, n) sans rept. : 8! / (8-2)! = 56
    Arrangement A(k, n) avec rept. : 8^2 = 64
    Permutations sans repetition : 8! = 40320
    Permutations avec repetition : 8! / 2! = 20160


    Vérifiez que ce simulateur de fusion fait bien ce que sera la première étape de recherche de la cible avec les objets dans le Stock.

  15. #15
    Membre actif
    Homme Profil pro
    Ingénieur PI
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur PI
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Par défaut
    Pour la partie 1:
    J'avoue que la comme ça... j'ai pas comprit

    Apparemment, les
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ' Relations entre les différents éléments de la famille Amu
    Public arrAmuSuppRel(indAmuSuppFirst To indAmuSuppLast, indAmuSuppFirst To indAmuSuppLast) As Byte
    Public arrAmuSuppName(indAmuSuppFirst To indAmuSuppLast) As String
     
    Public arrAmuPrefRel(indAmuPrefFirst To indAmuPrefLast, indAmuPrefFirst To indAmuPrefLast) As Byte
    Public arrAmuPrefName(indAmuPrefFirst To indAmuPrefLast) As String
     
    Public arrAmuSuffRel(indAmuSuffFirst To indAmuSuffLast, indAmuSuffFirst To indAmuSuffLast) As Byte
    Public arrAmuSuffName(indAmuSuffFirst To indAmuSuffLast) As String
    Et suivant ne sont pas necessaire?

    Dans le doute, je vais continuer à les implémenter, quit à les supprimer plus tard !


    Pour le point2:
    Quel est le nombre maximum d'objets dans le Stock ?
    Il n'y a pas de limite fixée. Mais je pense que en fonction de la puissance du PC, il faudra se décider ou non à remplir avec tout son stock ou faire un tri à la main sans tout rentrer dans la feuille de données !
    Mais on part dans l'hypothèse que il n'y a pas de limite.

    Peut-on toujours atteindre la cible ?
    Non. La cible n'est pas forcement possible à atteindre avec les objets du stock.

    Quel est le nombre maximum d'étapes pour l'atteindre ? Donnez un ordre d'idée. 10 ? 1000 ? Plus ?
    Il n'y a pas de nombre maximum.
    Mais disons qu'au dessus de 20 cela deviendrait non-rentable. Donc on peut fixer une limite dans cet ordre de grandeur

    Est-ce qu'on est sûr avec les tables de corrélation qu'un objet ne peut jamais changer de famille par exemple de Ring vers Aad ?
    Oui. Un type d'objet ne peut pas changer de type. Un Ring restera toujours un Ring même avec 1000 fusions !


    Pour le point 3:
    Je vais tenter de comprendre et faire un feedback dans la soirée !

    Mais déjà, a voir la macro....
    IMPRESSIVE !!!!!!

    EDIT: le support Pg des Cieux me pose problème.
    J'ai complété les données CaC1H comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Const nbrMaxCaC1HSupp = 10 ' La famille CaC1HSupp a 10 supports possibles
    Public Const rowCaC1HSuppStart = rowAmuSuffStart + nbrMaxAmuSuff + nbrRowFamily ' Première rangée de la famille CaC1HSupp
    Public Const rowCaC1HSuppEnd = rowCaC1HSuppStart + nbrMaxCaC1HSupp - 1 ' Dernière rangée de la famille CaC1HSupp
    Public Const indCaC1HSuppMatraque = indPropertyFirst ' Premier élément de la famille CaC1HSupp
    Public Const indCaC1HSuppCieux = nbrMaxCaC1HSupp ' Dernier élément de la famille CaC1HSupp
    Est ce correct? Ou comment y mettre Pg des Cieux

  16. #16
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Par défaut Nbr max d'objets dans le Stock de la famille de la Cible
    ^ Oui, cela me semble correct.

    Citation Envoyé par Mangaku Voir le message
    Il n'y a pas de limite fixée. Mais je pense que en fonction de la puissance du PC, il faudra se décider ou non à remplir avec tout son stock ou faire un tri à la main sans tout rentrer dans la feuille de données !
    Mais on part dans l'hypothèse qu'il n'y a pas de limite.
    La feuille Excel a elle-même des limites en nombre de rangées ou colonnes.

    Il faut donner un ordre de grandeur car cela influencera sur la représentation interne du Stock.
    Si pour un Stock de 8 objets, la combinatoire de premier niveau se compte en centaines, il faut savoir si le Stock comprendra une dizaine, une centaine, un millier, etc. d'objets de la même famille que la cible ?

    Comme il n'y a pas de mutation d'un objet d'une famille à l'autre, c'est l'ordre de grandeur du nombre d'objets maximum dans le Stock appartenant à la famille de la cible qui importe.

    Le no limit n'existe pas en informatique. Sinon on risque d'attendre un siècle devant son PC pour avoir le message "Not enough memory".

  17. #17
    Membre actif
    Homme Profil pro
    Ingénieur PI
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur PI
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Par défaut
    Dans ces cas la, on va dire: 30 objets de la même famille maximum !

    EDIT: voici la version 6 avec toutes les données d'entrées.
    Est ce que cela est correct ?
    Fichiers attachés Fichiers attachés

  18. #18
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Par défaut
    La nouvelle présentation de la V0.6 est chouette et on apprécie tous les ajouts y compris dans les Select Case des procédures et surtout l'initialisation des objets.

    Au niveau des constantes, il ne fallait pas effacer les constantes, qui existaient déjà.

    L'optimisation proposée pour les nouveaux objets a pour but de faciliter leur ajout mais on n'a pas besoin de supprimer les constantes qui fonctionnent avec Ring et Aad.

    En lançant InitRpg() dans la fenêtre d'Exécution immédiate, j'ai l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Const indRingSuppAnneau = indRingSuppFirst ' Premier élément de la famille RingSupp
    indRingSuppFirst variable non défine. Alors qu'elle était définie en version 0.3
    J'ajouterai ce qu'il faut car il y a eu un important changement entre la 0.3 et 0.3.1 dans le message 9.

  19. #19
    Membre actif
    Homme Profil pro
    Ingénieur PI
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur PI
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Par défaut
    Comb 4

    0: A B C D
    1: AB C D
    2: AC B D
    3: AD B C
    4: A BC D
    5: A BD C
    6: A B CD

    7: AB CD
    8: AC BD
    9: AD BC
    Nombre total de combinaisons générées : 9
    Nombre d'évolutions du stock : 9
    Nombre de fusions uniques : 6
    Quand je lis cela, il me semblerait qu'effectivement, cela corresponde aux fusions à réaliser/qui doivent etre simulées.
    EDIT: je viens de me rendre compte qu'il manquait des possibilités.
    On peut logiquement faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    0: A B C D
    1: AB C D
    1': AB D C
    2: AC B D
    2': AC D B
    3: AD B C
    3': AD C B
    4: A BC D
    4': D BC A
    5: A BD C
    5' C DB A
    6: A B CD
    6': B A CD
    7: AB CD
    8: AC BD
    9: AD BC
    Pour l'exemple:
    AB C D. Le résultat ici est différent de celui que l'on obtiendrait avec AB D C
    Puisque l'ordre des fusions impact sur l'objet obtenus. Pas si on fait AB ou BA.
    Mais ABC sera différent de ACB.
    A noter que la solution 0 et 1 sont semblables au final.


    Pour les données intermédiaires, si il faut les ajouter de nouveaux, j'ai toujours les anciennes versions en stock au pire =)
    Il suffira de me dire.

    La nouvelle présentation de la V0.6 est chouette et on apprécie tous les ajouts y compris dans les Select Case des procédures et surtout l'initialisation des objets.
    Merci


    EDIT: j'ai tenté avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Const nbrObjMerged = 2, nbrObjMax = 30, nbrCombMax = 100000
    J'ai eu comme réponse:
    Erreur d'execution '6':
    Dépassement de capacité
    Donc je dois comprendre que Excel ne peut pas supporter autant de données?
    Mais, en final, si l'objet obtenu lors de l'essai n'est pas l'objet ciblé, alors il peut supprimer la solution, donc il n'y aura pas de manque de case.
    Si ?

  20. #20
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Par défaut Gestion du Stock et définition de la Cible
    C'est déjà pas mal d'avoir indiqué un n° d'erreur et sa description : "Dépassement de capacité", mais il faut être encore plus précis : n° de ligne et contexte des variables lors du bug.

    En fait il s'agissait d'un overflow lors du calcul de la factorielle pour l'analyse combinatoire.
    On a republié dans le message 14 le simulateur de combinaison de Stock avec nbrObjMax = 10 et nbrCombMax = 100000 et en passant les Integer 16-bit en Long 32-bit.

    Cette maquette n'a pas été prévue pour rechercher le max car elle teste l'unicité des combinaisons. On a augmenté la limite à 10 objets parce qu'au-delà, cela commence à être longuet. Par contre on peut très bien réserver un tableau de 100000 String.
    ____________

    La version 0.7 a été publiée dans le message 8 ci-dessus.

    1. Décrire la feuille Fusion

    En lançant InitRpg() dans la fenêtre d'Exécution immédiate, on obtient :
    L'état du stock est :
    01 Ring: Anneau, Diamant, Délit
    02 Ring: Anneau, Dur, Peau Dur
    03 Ring: Anneau, Argent, Astuce
    04 Ring: Anneau, Platine, Justesse
    05 Ring: Anneau, Distingué, Art
    06 Ring: Anneau, Argent, Sagesse
    07 Ring: Bracelet, Astral, Sagesse
    08 Ring: Bracelet, Bronze, Sagesse
    09 Ring: Bracelet, Bronze, Peau Dur
    10 Ring: Chevalière, Bronze, Génie
    11 Ring: Chevalière, Or, Sagesse

    La cible à atteindre est :
    Ring: Anneau, Titane, Jouvence


    Cependant ni le stock, ni la cible ne sont lus sur la feuille "Fusions" parce que les constantes de rangées et de colonnes n'ont pas été encore codés. Il y a vos propres commentaires en ligne 309. Il faut traduire ces commentaires en constantes VBA exactement comme ce qui a été fait avec la feuille "Données Fusion" qui est maintenant complètement décrite.

    Vers la ligne 309, on trouve le commentaire suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ' Définition du      S T O C K
    ' Les objets en stock devront être rentrés manuellement par l'utilisateur sur la feuille.
    ' Une colonne pour les supports, une pour les préfixes, une pour les suffixes
    Définir le nom et la valeur de chaque colonne et les zones de rangées en les commentant.

    2. Prise en compte des nouveaux objets

    Vérifier si les nouveaux objets ont été correctement compris par le programme.

    Dans la fenêtre d'Exécution immédiate, copier-coller et valider par ENTER :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? IdObjFromProper(indObjArmor, indArmorSuppPleineArmure, indArmorPrefMortel, indArmorSuffOrchidee)
    336595463
    Le programme attribue un n° unique à l'objet, mais ce numéro n'a aucune signification tant qu'on ne le traduit pas en chaîne de caractère avec la fonction ObjToString().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? ObjToString(336595463)
    Armor: Pleine Armure, Mortel, Orchidée

    En composant les deux fonctions en un seul appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? ObjToString(IdObjFromProper(indObjArmor, indArmorSuppPleineArmure, indArmorPrefMortel, indArmorSuffOrchidee))
    Armor: Pleine Armure, Mortel, Orchidée

    Explorer les nouveaux objets en changeant les paramètres de IdObjFromProper() d'autant plus qu'il n'y a pas les constantes de propriétés intérmédiaires mais uniquement la première et la dernière pour un type de propriété donnée.
    Afficher le résultat par ObjToString() afin de vérifier que les tables ont été correctement lues.

    Idem avec les tables de corrélation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? PrefixeToString(indObjPant, PrefixeRelation(indObjPant, indPantPrefCourt, indPantPrefMortel))
    Chamaniste

Discussions similaires

  1. Fusion automatique données access sur openoffice writer
    Par HookerSeven dans le forum Access
    Réponses: 4
    Dernier message: 16/06/2008, 17h16
  2. [VBA-E] macro avec base de données externe
    Par Djohn dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/02/2007, 14h12
  3. [iReport] Calcul de somme de variables et fusion de données
    Par RR instinct dans le forum iReport
    Réponses: 7
    Dernier message: 03/04/2006, 16h04
  4. Réponses: 4
    Dernier message: 01/03/2006, 11h21
  5. Fusion de données
    Par pc75 dans le forum ASP
    Réponses: 2
    Dernier message: 07/02/2006, 13h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo