Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/08/2011, 20h02   #1
Nouveau Membre du Club
 
Homme Grégory
Ingénieur PI
Inscription : août 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Grégory
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 : 16
Points : 37
Points : 37
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

Citation:
(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 =)
Mangaku est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/08/2011, 21h47   #2
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
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 :
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.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/08/2011, 21h58   #3
Nouveau Membre du Club
 
Homme Grégory
Ingénieur PI
Inscription : août 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Grégory
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 : 16
Points : 37
Points : 37
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
Mangaku est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/08/2011, 23h10   #4
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
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 :
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.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/08/2011, 23h27   #5
Nouveau Membre du Club
 
Homme Grégory
Ingénieur PI
Inscription : août 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Grégory
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 : 16
Points : 37
Points : 37
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:
Citation:
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:
Citation:
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
Mangaku est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/08/2011, 17h34   #6
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/08/2011, 13h59   #7
Nouveau Membre du Club
 
Homme Grégory
Ingénieur PI
Inscription : août 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Grégory
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 : 16
Points : 37
Points : 37
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 :
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
Mangaku est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/08/2011, 23h54   #8
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
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 :
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 :
? 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 :
? 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 :
? PrefixeToString(indObjRing, indRingPrefAstucieux)
Astucieux
Voici un préfixe de l'objet Ring.

Code :
? 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 :
? SuffixeToString(indObjRing, SuffixeRelation(indObjRing, indRingSuffBeaute, indRingSuffConcentration))
Justesse

Code :
? 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 :
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 :
' 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 :
(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 :
' 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.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/08/2011, 12h03   #9
Nouveau Membre du Club
 
Homme Grégory
Ingénieur PI
Inscription : août 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Grégory
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 : 16
Points : 37
Points : 37
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 :
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 :
? 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
-___-'
Mangaku est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/08/2011, 14h47   #10
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
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 :
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 :
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 :
? 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 :
? 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 :
? 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 :
? 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 :
' 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 :
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 :
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.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/08/2011, 16h07   #11
Nouveau Membre du Club
 
Homme Grégory
Ingénieur PI
Inscription : août 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Grégory
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 : 16
Points : 37
Points : 37
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 :
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 :
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:
Citation:
Erreur de compilation:
nom ambigu détecté: nbrMaxAadSupp
Apparemment cela ne semble pas déranger. Je laisse comme ça?
Mangaku est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/08/2011, 23h59   #12
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
Par défaut Fusion multiple ou unique ?

Code :
nom ambigu détecté: nbrMaxAadSupp
parce qu'il est défini deux fois : oubli de le renommer dans Amu.

Code :
1
2
' Données Amulettes (Amu) Support
Public Const nbrMaxAadSupp = 5 ' La famille AmuSupp a 5 supports possibles
Code :
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 ?
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/08/2011, 00h12   #13
Nouveau Membre du Club
 
Homme Grégory
Ingénieur PI
Inscription : août 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Grégory
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 : 16
Points : 37
Points : 37
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 :
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 !
Mangaku est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/08/2011, 17h35   #14
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
Par défaut Combinatoire dans le Stock

1. Impacts de l'absence des constantes intermédiaires

Code :
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 :
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 :
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 :
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.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/08/2011, 17h48   #15
Nouveau Membre du Club
 
Homme Grégory
Ingénieur PI
Inscription : août 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Grégory
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 : 16
Points : 37
Points : 37
Pour la partie 1:
J'avoue que la comme ça... j'ai pas comprit

Apparemment, les
Code :
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:
Citation:
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.

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

Citation:
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

Citation:
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 :
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
Mangaku est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/08/2011, 18h08   #16
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
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".
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/08/2011, 18h15   #17
Nouveau Membre du Club
 
Homme Grégory
Ingénieur PI
Inscription : août 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Grégory
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 : 16
Points : 37
Points : 37
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
Type de fichier : zip Fusion_CV6.zip (87,7 Ko, 9 affichages)
Mangaku est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/08/2011, 19h41   #18
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
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 :
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.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/08/2011, 20h58   #19
Nouveau Membre du Club
 
Homme Grégory
Ingénieur PI
Inscription : août 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Grégory
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 : 16
Points : 37
Points : 37
Citation:
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 :
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.

Citation:
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 :
Const nbrObjMerged = 2, nbrObjMax = 30, nbrCombMax = 100000
J'ai eu comme réponse:
Citation:
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 ?
Mangaku est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/08/2011, 14h04   #20
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
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 :
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 :
? 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 :
? ObjToString(336595463)
Armor: Pleine Armure, Mortel, Orchidée

En composant les deux fonctions en un seul appel :
Code :
? 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 :
? PrefixeToString(indObjPant, PrefixeRelation(indObjPant, indPantPrefCourt, indPantPrefMortel))
Chamaniste
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h57.


 
 
 
 
Partenaires

Hébergement Web