Améliorer et simplifier macro de mise en forme

Bonjour cher forum,

J'aimerais poursuivre mon projet annoncé ici https://forum.excel-pratique.com/viewtopic.php?p=726383#p726383.

Maintenant que j'ai obtenu le résultat souhaité avec l'aide Theze, j'aimerais améliorer et simplifier le code des macro.

Je souhaiterais intégrer la macro Attribution à la macro Étape2_MF. J'aimerais aussi que la macro s'applique à la feuille active et non à une feuille spécifique, et qu'elle touche uniquement la sélection des données copier, car le nombre de lignes n'est jamais pareil d'une fois à l'autre. Parfois, je peux avoir 30 lignes comme je peux en avoir 300.

Merci et bonne fin de semaine.

17mj-import.zip (49.19 Ko)

Bonjour,

Pour augmenter l'intérêt des gens à t'aider, il faudrait commencer par nettoyer le code en supprimant, tant que c'est possible ... les Select.

Exemple :

    Range("C1").Select
    ActiveCell.FormulaR1C1 = "Gr."

pour devenir ...

    Range("C1").FormulaR1C1 = "Gr."

Pour vérifier que tout va bien, tu exécutes le code en mode pas-à-pas (touche F8) dans VBE.

Il y a aussi les ActiveWindow.SmallScroll Down:=-27 qui peuvent être supprimés. Ils résulte du déplacement dans la feuille lors de l'enregistrement automatique d'une macro.

Bien évidemment, tu travailles sur une copie.

ric

Bonjour ric,

Merci pour les indications. C'est déjà un pas de plus.

Voilà, j'ai donné un petit coup de balai, mais je suis à la limite de mes connaissances pour aller plus loin.

Merci

A+

Bonjour,

Je n'ai pas trouvé ce que tu cherches à faire avec la macro Attribution ...

Ceci tourne et ne fait rien.

    For Each Cel In PlgGrade
        Set Trouve = PlgCorres.Find(Cel.Value, , xlValues, xlWhole)
        If Not Trouve Is Nothing Then
            Cel.Offset(, -1).Value = PlgCorres(1, Trouve.Column - PlgCorres(1, 1).Column + 1).Value
        End If
    Next Cel

Ensuite, tu ajoutes des colonnes, leur mets des formats, puis les supprimes.

Au final, la colonne A, D, E, F et G n'ont pas de changements.

Il n'y a que la colonne B et C qui ont changé de titre et où tu y écris "Caserne Caserne" et Groupe Groupe de la ligne 2 à 272.

Désolé, mais je ne comprends rien à cette macro.

ric

Bonjour ric,

    For Each Cel In PlgGrade
        Set Trouve = PlgCorres.Find(Cel.Value, , xlValues, xlWhole)
        If Not Trouve Is Nothing Then
            Cel.Offset(, -1).Value = PlgCorres(1, Trouve.Column - PlgCorres(1, 1).Column + 1).Value
        End If
    Next Cel

Ce code me vient de Theze! Si vous allez dans le topic initial viewtopic.php?p=726383#p726383, beaucoup d'éléments sont là.

Je reprends de zéro. Je tente de formater dans un fichier Excel des données extraites d'un mail, et pour lesquelles je dois modifier des formats et ajouter des informations pour respecter un template précis en vu d'un importation dans un logiciel. Pour ça, j'ai essayé de créer une macro (en mode création) pour arriver au template souhaité avec l'aide de Theze.

Oui, dans le code il y a des colonnes qui s'ajoutent et se suppriment, et c'est le fruit du mode en création lorsque j'ai essayé de reproduire le template. Pour ma part, je ne sais pas comment ajuster le code pour éviter (supprimer) les étapes inutiles du code.

L'onglet Extraction_brute illustre les données si je faisais un bête copier-coller dans Excel, et l'onglet Résultat-atteint est le résultat souhaité.

Or, je sais que le code n'est pas conforme, c'est pourquoi je fais appel au forum pour le corriger, et intégrer la macro Attribution à la macro Étape2_MF. La macro Attribution sert à ajouter la division (colonne A) pour chaque caserne, et ajouter le mot caserne (colonne B) et le mot groupe (colonne C) à chaque numéro.

J'aimerais aussi que la macro s'applique à la feuille active et non à une feuille spécifique (ici Résultat-atteint), et qu'elle fonctionne seulement sur la sélection des données que j'aurai copier dans une feuille vierge, car le nombre de lignes n'est jamais pareil d'une fois à l'autre. Parfois, je peux avoir une trentaine de lignes comme je peux en avoir plus de 300.

Oubliez le "Caserne Caserne" et "Groupe Groupe", c'est mon erreur! Le nom ne doit pas se répéter deux fois.

Désolé pour l’ambiguïté. J'espère avoir apporter un peu d'éclaircissement.

Je vous remercie pour votre aide.

A+

10mj-import.zip (49.20 Ko)

Bonjour,

Où prend-on l'information pour déterminer pour une personne :

  • sa division
  • sa caserne
  • son groupe > on j'ai trouvé celui-ci.

ric

Bonjour ric,

On retrouve les divisions dans l'onglet Master. Malheureusement, lorsque je récupère les données, cette information est manquante.

Les casernes et groupes sont tirés du copier-coller qui arrivent sous la forme date si je ne mets pas la feuille en format texte avant le copier-coller, d'où la macro Étape1_MF. Et par la suite, pas le choix de convertir les données, car ils arrivent sous la forme 45-1, 23-2, etc. Le premier chiffre étant la caserne, le second le groupe.

Si vous regardez l'onglet Extraction_brute les colonnes F et H ne me sont pas utiles, c'est pourquoi la macro Étape2_MF les supprime, et convertit la colonne G en deux colonne, l'une pour caserne, l'autre pour groupe. Ensuite, la formule fait le travail pour ajouter le mot caserne à chaque no de caserne, idem pour les groupes.

Je sais que c'est «stwisted», mais c'est la seule alternative que j'ai trouvé pour parvenir au template.

Merci encore pour votre intérêt.

A+

Bonjour,

Sur la feuille "Extraction_brute", clique sur le bouton "Lancer le Traitement".

  • La macro s'exécute sur la feuille active.
  • Il reste de l'amélioration, mais avant d'aller plus loin, je veux savoir si c'est bien le résultat attendu!
  • En colonne A, il y a des cellules vides, c'est que le numéro de la colonne B n'est pas dans la plage bleue de la feuille Master. (11, 12, 24 ... ST et An proviennent ST-0 et Annulé dans la colonne G des données brutes)
  • Les macros s'adaptent au nombre de lignes.

Je reste à l'écoute.

ric

Bonjour ric,

Malheureusement, impossible d'exécuter le bouton « Lancer le traitement »! Erreur 57121 sur cette ligne

    Set PlgGrade = .Range(.Cells(2, 2), .Cells(.Rows.Count, 2).End(xlUp))

Si vous parlez de la colonne A et B de l'onglet Extraction_brute, c'est normal que les données et les colonnes ne soient pas représentatif du template recherché. C'est la macro Étape1_MF qui convertit et déplace les données! À quelques nuances près, l'onglet Résultat-atteint est assez représentatif de ce que je souhaite obtenir comme résultat.

Merci pour votre aide.

Bonjour,

Je n'ai malheureusement pas Excel 2003 pour tester. Mais, essai ainsi en enlevant le . de range.

Set PlgGrade = Range(.Cells(2, 2), .Cells(.Rows.Count, 2).End(xlUp))

ric

Bonjour ric,

Malheureusement, niet. Aucune différence.

A+

Bonjour,

J'ai sorti un vieux coucou de la remise, il y a Office 2003.

La personne qui me l'a donné fume ... je ne te dis pas l'odeur qui s'en dégage ... la tête me tourne et mes yeux pleurent.

Je dois lui faire prendre un bain.

Je te reviens bientôt.

ric

Bonjour,

Après un nettoyage et l'avoir placé voisin de l'évacuateur d'air de la cuisinière tournant à pleine puissance, j'ai testé le fichier sous Excel 2003.

Malheureusement, ici, il fonctionne très bien avec la copie que je t'ai fait parvenir.

Je ne sais pas quoi dire.

ric

Bonjour ric,

C'est plutôt heureux qu'il fonctionne pour toi...

Le bouton dans la page est totalement « frozen » ; clic, souris de droite, etc., rien! Comprends pas. Bref, je vais essayé de voir pourquoi!

Merci

A+

Rebonjour,

Essai cette version ...

Sous Excel 2003, j'ai repris ton fichier et remplacé les macros.

Puis, j'ai ajouté un bouton de formulaire pour lancer la macros sur la feuille "Extraction Brute".

Y a-t-il un différence ??

ric

Bonjour ric,

merci pour l'amélioration de la macro, c'est super.

Il reste un petit souci avec la conversion des noms en une seule colonne. Pour une raison que j'ignore, la conversion met des virgules jusqu'à la ligne 304 (colonne E), alors qu'il y a des noms jusqu'à la colonne 272!!!

 'Convertir données et supprimer colonne inutile
      .Range("E2:E" & Dlig).TextToColumns Destination:=.Range("E2"), DataType:=xlFixedWidth, _
                                  FieldInfo:=Array(Array(0, 1), Array(2, 1), Array(3, 1)), TrailingMinusNumbers:=True

      .Columns("F:F").Delete Shift:=xlToLeft

   'Insérer colonne, convertir format et chaîne de caratères
      .Columns("E:F").Insert Shift:=xlToRight

      .Columns("C:F").NumberFormat = "General"
      .Range("E2").FormulaR1C1 = "=PROPER(CONCATENATE(RC[-2],"", "",RC[-1]))"
      .Range("E2").AutoFill Destination:=.Range("E2:E" & Dlig), Type:=xlFillDefault

      .Range("E2:E" & Dlig).Copy
      .Range("F2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

      Application.CutCopyMode = False

      Columns("C:E").Delete Shift:=xlToLeft

Merci pour ton aide.

Bien cordialement,

Bonjour,

Avant le traitement, il y a un certain nombre de lignes placées dans la variable Dlig.

Durant la première partie du traitement > avant Call Module2.Attribution, plusieurs lignes vides ou inutiles sont supprimées. Le traitement de concaténation se poursuit sur le nombre de lignes qu'il y avait au départ. D'où la différence.

Il ne resterait qu'à détecter de nouveau la dernière ligne + 1 en colonne B.

Puis, faire effacer le reste de la colonne E.

Est-ce que tu sauras te débrouiller avec cela ?

ric

Bonjour ric,

Effectivement, merci pour ton analyse.

Par contre, je ne saurais me débrouiller seul.

Merci encore.

A+

Bonjour,

C'est bon, je regarde cela.

ric

Bonjour,

Voici ... est-ce que ça convient ?

Deux lignes ajoutées avant Call Module2.Attribution

ric

Rechercher des sujets similaires à "ameliorer simplifier macro mise forme"