Cela n'aura pas été trop long, j'espère !
On est donc parti de ton fichier initial, qui comporte actuellement 12 emplacements photos, groupés par rangs de 2, et que tu pourras prolonger en respectant la même structure. Les rangs sont numérotés de 1 à 6, il faudra poursuivre la numérotation (en colonne F) en prolongeant...
Tu verras un nom dans le gestionnaire de noms, défini par la formule suivante :
=MAX(Feuil1!$F:$F)
qui permettra à tout moment de connaître le nombre max de la colonne F et donc le nombre d'emplacements.
Deux boutons figurent sur la droite (pour qu'on visualise qu'ils ne sont pas liés à un emplacement déterminé) : Inser et Sup. La même macro est affectée à ces deux boutons : InserSup
.
La macro fait elle-même le tri de savoir qui l'a appelée (les 2 boutons ayant pour nom Bouton 1 et Bouton 2, elle récupère le dernier caractère (converti en nombre) dans une variable, ce qui lui permet de savoir si on lui demande d'insérer ou de supprimer.
La proc. fera appel à un Userform pour faire choisir l'emplacement, après avoir modifié les mentions qui indiqueront s'il s'agit d'une insertion ou d'une suppression, et avoir alimenté une ComboBox avec une liste des emplacements disponibles (pour une insertion) ou utilisés (pour une suppression).
Pour disposer de la liste, elle va faire appel à une fonction : ListEmplac
, sans argument ou False pour une insertion, avec argument True pour une suppression. La fonction va selon le cas, parcourir les photos existantes, tirer l'emplacement du nom, et retrier les emplacements ainsi extraits, ceci en cas de suppression, ou bien parcourir tous les emplacements possibles, tester si une photo existe, et conserver l'emplacement dans le cas contraire, ce pour une insertion. S'il apparaît que tous les emplacements sont vides (suppression demandée) ou tous sont pleins (insertion demandée), elle renvoie 0 et l'utilisateur sera avisé que sa demande ne peut aboutir...
L'utilisateur est donc appelé à choisir son emplacement dans une boîte de dialogue, il choisit donc dans la liste, et clique sur OK (s'il clique sur Annuler, cela annulera l'opération). S'il clique sur OK sans avoir choisi, la boîte reste affichée en attendant qu'il fasse son choix ou clique sur Annuler. Le choix fait, la boîte est masquée et la main revient à la procédure qui récupère le choix et décharge le Userform.
S'il s'agit d'une suppression, elle reconstitue le nom de la photo et appelle une procédure : SupprimPhoto
en lui passant le nom en argument. Procédure qui supprime la photo...
S'il s'agit d'une insertion, elle fait appel à une fonction : PositPhoto
en lui passant le numéro de l'emplacement et qui va lui renvoyer la plage correspondant à cet emplacement (objet Range). Elle passe alors cette plage, ainsi que le numéro d'emplacement, à une procédure qu'elle appelle : InserPhoto
.
Cette procédure va faire choisir l'image par l'utilisateur, finaliser l'opération d'insertion, et nommer la photo insérée. Elle ajuste l'affichage de façon que l'utilisateur puisse voir la photo qui vient d'être insérée.
L'ensemble fait donc 5 procédures (dont 2 Function) que tu trouveras dans Module1. Le code du Userform ne comporte que 3 petites procédures (dans le Module ad-hoc) : 2 attachées aux boutons OK et Annuler, et une interceptant la fermeture (dans le cas où l'utilisateur cliquerait sur la croix de fermeture) pour la finaliser en annulation.
J'en profite encore pour noter que tu avais fait un effort certain sur le code pris intrinsèquement, mais que ton projet péchait sur la façon de structurer l'application pour parvenir au résultat avec une économie de moyens...
Je te laisse étudier ce modèle, et si tu butes sur tel ou tel aspect, n'hésite pas à demander des explications.
Cordialement.