VBA Formatage plages successives identiques selon paramètre

Oyez, oyez !

Introduction

Débutant en VBA, je me suis nouvellement inscrit sur ce forum car même si j'ai pour habitude de trouver les solutions à mes problèmes de programmation grâce à notre ami commun à tous (Google ), pour le coup je sèche totalement, simplement car je ne sais pas mettre les mots-clés sur ma recherche (cela se voit d'ailleurs peut-être dans le titre de mon sujet, je vous vois déjà venir: "Mais qu'est-ce qu'il veut dire?!"). Alors par avance, je tiens à m'excuser si un sujet similaire a déjà été traité, je n'ai pas su le trouver.

Contexte

Je travaille pour une société (je n'en ferai pas la publicité et je passerai brièvement sur les détails) et je manage un procédé particulier pour un client particulier sur un type de produits particuliers (vous l'aurez compris, c'est vraiment très particulier ).

Dans ce contexte, nous fabriquons des produits à partir de X (variable) composants identiques classés selon les exigences de notre client. J'en ai fini avec la programmation de l'extraction et du tri des données des composants et je suis maintenant confronté à un problème.

Problème

Petite illustration avant de commencer le baratin.

vba fo10

Un fichier correspond aux données d'un lot, qui ira dans un seul produit.

Ce fichier, peu importe le lot, comporte 4 colonnes de données, et n (variable) lignes, chaque ligne correspond aux données d'un même composant.

Je souhaite que lorsque l'opérateur entre le nombre de composants (X) à monter dans le produit (à partir d'une UserForm) une mise en forme automatique se fasse, consistant en des bordures, commençant à la ligne 2 du fichier et réitérées toutes les X lignes, afin de séparer les composants des différents produits (photo ci-dessus).

Par ailleurs, je souhaite que dans la colonne E, les cellules adjacentes aux composants d'un même produit se fusionnent, poursuivent les bordures, et indiquent le numéro de produit, comme sur la photo (pour simplifier le code, on pourra éventuellement se passer de la bordure verticale entre les colonnes E et F, les séparations horizontales des colonnes A à E suffisent.

Pour terminer, je souhaite évidemment que mes produits s'arrêtent quand il n'y a plus assez de composants. Autrement dit, dans l'exemple de la photo, avec 5 composants par produits, si après ma répartition par produit, il me reste 1 à 4 composants, je ne veux pas que les cellules se fusionnent et indiquent un numéro de produit.

Conclusion

Alors voilà un peu mon cahier des charges, je ne sais pas mais j'espère que ceci est réalisable (je ne vois pas pourquoi ce ne serait pas possible). J'ai des petites idées de comment faire comprendre ça à Excel, j'imagine qu'il va falloir utiliser des boucles et des compteurs mais comme je le disais en introduction, étant débutant, ceci est bien trop complexe pour moi mais je serai ravi d'apprendre à le faire alors j'espère que la communauté Excel-pratique pourra m'aider

Par avance merci, et à très bientôt dans le fil de ce sujet.

Bien cordialement.

Dreckskit.

Bonjour

Un essai à vérifier

Bonjour Banzai !

C'est PARFAIT !

Je suis rassuré de voir que mes explications étaient claires, ton travail correspond EXACTEMENT à ce que je voulais.

J'ai jeté un œil à ton code et je l'ai compris dans les grandes lignes même si je n'aurais franchement pas su rédiger ces équations...

Cependant, en cette matinée, je viens de me rendre compte d'un oubli de ma part dans le cahier des charges (pourtant d'habitude, c'est au matin que je fais des gaffes ).

Compléments

Voici les règles supplémentaires que j'avais omis de préciser. Allons un peu plus dans le détail:

cond210

Les colonnes A et B sont des colonnes de référence des composants. Elles ne jouent qu'un rôle de repère.

La colonne C correspond au 1er critère de rejet des composants avec une limite max et une limite min.

Ma macro actuelle (dont je pourrai d'ailleurs offrir la version finale à la communauté en remerciement) s'occupe déjà du tri par ordre décroissant des composants par rapport à ce critère (notre client veut que les composants d'un produit aient des propriétés très proches en fonction de ce critère, d'où ce tri) ainsi que de la mise en forme conditionnelle telle que représentée sur l'image ci-dessus :

Une police rouge (le rouge basique valable pour toutes les versions d'Excel).

Une couleur de cellule rouge pâle (qui peut varier légèrement selon les versions si je ne me trompe pas).

Pour la programmation, on utiliserait donc plutôt la détection de la couleur de police rouge.

Enfin, la colonne D correspond au 2ème critère de rejet des composants. Aucun tri n'est fait sur ce critère, c'est à dire qu'un composant défectueux selon ce critère peut apparaître n'importe où dans la colonne (Contrairement à la colonne C où les composants défectueux sont soit en haut [extrêmement rare mais c'est déjà arrivé], soit en bas du tableau [il y en a toujours quelques-uns]).

Un composant peut évidemment être rejeté selon les 2 critères en même temps.

Ce que je souhaite, c'est donc qu'AVANT de procéder à la mise en place des bordures par produit, la macro me place les composants rejetés (selon l'un ou l'autre des critères) en dernière position dans le tableau (peu importe l'ordre dans lequel ils sont placés puisqu'ils iront à la benne).

La dernière ligne à considérer pour faire le contour des composants par produit ne serait alors plus la dernière ligne du tableau mais la dernière ligne sans police rouge, comme l'illustre l'image ci-dessous :

cond2110

Et là encore malheureusement, je suis largué, aussi bien pour le déplacement des lignes comportant au moins une cellule dont la police de texte est rouge en fin de tableau, que pour modifier tes équations permettant de définir la dernière ligne à prendre en compte pour les bordures.

Je suis désolé, je ne voulais pas en demander de trop, je sais bien que ce forum n'est pas un forum pour les assistés du VBA, mais d'un autre côté, en tant que débutant, je me dis qu'en essayant de comprendre dès le début des macros aussi "complexes" (tout est relatif entre un expert et un débutant ), je pourrai rapidement monter en compétences dans ce langage.

Alors encore une fois, un grand merci par avance !

Bien cordialement.

Dreckskit.

P.S. : Je suis également ouvert aux suggestions pour la modification du titre de mon sujet, afin de faciliter la recherche d'autre membres de la communauté qui auraient un besoin similaire au mien.

Bonjour

Dreckskit a écrit :

Ma macro actuelle (dont je pourrai d'ailleurs offrir la version finale à la communauté en remerciement) s'occupe déjà du tri par ordre décroissant des composants par rapport à ce critère (notre client veut que les composants d'un produit aient des propriétés très proches en fonction de ce critère, d'où ce tri) ainsi que de la mise en forme conditionnelle

Cela serait très bien de la fournir dans un fichier afin de la tester, comme cela je pourrais savoir les critères de la MEFC

Re-Bonjour !

Très bien, voici joint le fichier en question alors. J'en ai rapidement modifié l'aspect graphique (retrait logo, titres, photos...) pour la confidentialité.

Pour comprendre un peu les chemins d'accès etc., voici un aperçu de l'architecture réseau de l'outil pour ceux qui voudraient comprendre un peu la macro:

arch r10

On peut placer ces dossiers/fichiers ensemble n'importe où, cela fonctionnera.

Pour les critères de la MEFC, tu pourras les trouver en pré-rempli dans l'USF "Critères" (ils n'apparaissent pas dans le Module1, à part sous forme de noms de cellules puisque c'est l'USF qui définit ces critères au cas où les exigences du client changent à l'avenir).

Bien cordialement.

Dreckskit.

P.S. : Désolé pour l'absence de déclarations, je suis un gros flemmard pour ça quand je fais des macros

Cela viendra peut-être avec le temps et surtout l'expérience.

12extraction-tri.xlsm (90.90 Ko)

Bonjour

J'ai peut-être mal vu mais je n'ai aucune données

Est-ce normal ?

Moi je ne sais pas faire dans ces conditions

Re-Bonjour,

Oui en effet, c'est normal. Hum, comment expliquer clairement...

Comme tu as dû le voir dans mon précédent message, il y a des dossiers qui vont avec la macro.

L'un de ces dossiers s'appelle "donnees_a_traiter". Dans ce dernier, l'opérateur va placer l'ensemble des fichiers à traiter (un fichier correspond à un composant, les fichiers sont exportés directement par la machine quand le composant est contrôlé).

La macro va alors chercher et ouvrir un à un l'ensemble de ces fichiers afin de regrouper les données nécessaires au traitement.

Elle stocke et traite (tri, MEFC...) ces données temporairement en arrière-plan (du fichier avec macro) avant de les exporter (copier-coller) dans un nouveau fichier .xlsx qui sera sauvegardé dans le dossier "donnees_traitees".

Une fois ce copier-coller dans un nouveau fichier réalisé, le fichier avec macro efface les cellules de sa feuille où étaient stockées temporairement les données et se ferme sans enregistrement (le fichier avec macro est juste un outil, ce n'est pas dans ce classeur que les données traitées restent).

Au final c'est le fichier d'exportation en .xlsx qui a la mise en forme que j'ai illustrée dans les précédents messages (4 colonnes, etc.).

Alors je pense en réalité (mais tu ne pouvais effectivement pas le savoir) que tu veux le fichier final exporté, qui correspond à un copier-coller des cellules du fichier comportant la macro lorsque cette dernière est terminée.

En fait, l'aide que je demande dans ce sujet me permettra ensuite d'intégrer les codes dans le module de ma macro actuelle avant la partie de code qui exporte les cellules du fichier de macro dans l'autre fichier .xlsx.

(J'ai l'étrange sensation que ce que je dis n'est pas clair... ).

En bref, je joins ici un fichier .xlsx avec des données triées et MEFC qui correspond à un fichier post-traitement de ma macro actuelle, en espérant que c'est ce qui répond à ta demande. J'ai volontairement modifié quelques valeurs pour faire face aux différents cas de rejet des composants.

Bien cordialement.

Dreckskit.

Bonjour

A tester

Bonsoir Banzai !

En cette heure tardive, j'ai pu tester ta nouvelle version du fichier et encore une fois c'est un succès !

Franchement bravo, je n'aurais jamais pensé à l'insertion de la colonne à attributs 0 ou 1, c'est vraiment très futé.

Alors maintenant j'ai groupé tout ça dans mon fichier de macro (en effet, je pars sur un fichier unique, toute la programmation se fait dans un seul module), ce n'est peut-être pas judicieux, mais par rapport à l'utilisation que j'imagine de cet outil, cela me parait mieux : Un seul bouton permet l'accès et l'ouverture de tout le reste.

J'ai supprimé quelques lignes de ton code de ce fait, notamment les messages d'erreur (je pars du principe que nous fabriquons un modèle de produit à 95% au niveau de cette machine, et les valeurs pré-remplies correspondent à ce modèle donc dans 95% des cas, l'opérateur aura juste à valider les UserForm -> risque d'entrer une valeur non numérique extrêmement faible alors je néglige.

Et là... On y est vraiment presque ! Les composants rejetés vont bien se placer en fin de tableau mais ce qui ne fonctionne plus, ce sont les bordures. J'ai fait un essai de la macro pas à pas avec les 7 fichiers que je vais joindre dans ce message (et le suivant à cause de la limitation à 5 PJ) dans lesquels j'ai modifié les valeurs pour m'assurer du bon fonctionnement du déplacement des composants rejetés. Pour l'essai bordures, j'ai bien sûr bien fait attention à ne pas laisser "15" en nombre de composants par produit (puisqu'il n'y a que 7 fichiers), j'ai fait un essai avec "2", et je vois que la macro n'entre pas dans la boucle pour les bordures.

C'est le dernier point bloquant ! Pourrais-tu s'il te plait m'aiguiller ? Un grand merci d'avance encore !

Bien cordialement.

Dreckskit.


Et voici la suite (j'en ai rajouté 2 de plus finalement, soient 9 au total).

Pour rappel, l'architecture réseau pour faire fonctionner la macro est la suivante :

arch r10

Les 9 fichiers sont à placer dans le dossier donnees_a_traiter, et la macro ici appelée outil.xlsm se place à l'extérieur.

Voilà voilà !

Cordiale nuit !

Dreckskit.

13outil.xlsm (113.31 Ko)

Bonjour

Quand tu as beaucoup de fichiers à transmettre places les dans une archive, gain de temps pour celui qui les récupère

Ensuite pour le problème, en recopiant les macros tu as oublié la déclaration de la variable (indispensable) NbLg en public

Dans un module, place cette déclaration en haut du module avant la 1ère macro

Exemple

Public NbLg As Long

Sub Extraction()
'
'Message barre statut

Les bordures se placeront aux bons endroits

Bonjour !

Désolé pour la réponse tardive, j'ai été très occupé ces derniers jours.

Un dernier merci à toi Banzai, tout fonctionne exactement comme je le voulais maintenant donc c'est parfait.

Je marque le topic comme résolu et du coup, pas besoin de fournir la version finale de la macro puisqu'il s'agit de la version jointe dans mon dernier message avec la ligne de code ajoutée par Banzai dans son dernier message.

J'espère que ce fichier pourra être utile à d'autres !

Bien cordialement.

Dreckskit.

Rechercher des sujets similaires à "vba formatage plages successives identiques parametre"