Aide concernant une macro Excel

Résolu
Bonsoir,

Je suis à la recherche d'un peu d'aide concernant une macro Excel.
Je ne suis pas connaisseur, j'ai un peu fouillé sur Internet et trouvé une partie de la réponse à ma question.

J'ai un document qui sera composé de 15 colonnes et d'un nombre i de lignes.
J'aimerais automatiser le "nettoyage" de ce document qui est amené à être renouvelé régulièrement et être utilisé pour du publipostage.

Je voudrais supprimer la colonne C et les colonnes F à O.
Si ne je m'abuse, la macro pour faire ça est la suivante :

Range("F:O").Delete Shift:=xlToLeft
Columns("C:C").Delete Shift:=xlToLeft

Y a-t-il des choses à changer ou frôle-t-elle la perfection ?!

Ensuite, c'est là où je bloque. Je me retrouve avec 4 colonnes. J'aimerais ajouter une formule dans la colonne E où je divise la colonne C par la colonne D, de la ligne 2 à la ligne i.
Et y ajouter un titre "total" dans la cellule E1.

Pourriez-vous me guider svp ?!

Ce document est amener à être partagé sur le réseau local de l'entreprise.

Merci d'avance,
Nico.

8 réponses

  1. Contributeur
    Bonjour

    Cela pourrait ressembler à ça pour 100 lignes et avec le titre Total centré V et H

    Sub effacer()
    '
    ' effacer Macro
    '

    '
    Range("F:O").Delete Shift:=xlToLeft
    Columns("C:C").Delete Shift:=xlToLeft
    Range("E2").Select
    ActiveCell.FormulaR1C1 = "=IF(ISERROR(RC[-2]/RC[-1]),"""",RC[-2]/RC[-1])"
    Range("E2").Select
    Selection.AutoFill Destination:=Range("E2:E100"), Type:=xlFillDefault
    Range("E2:E100").Select
    Range("E1").Select
    ActiveCell.FormulaR1C1 = "Total"
    Range("E1").Select
    With Selection
    .HorizontalAlignment = xlGeneral
    .VerticalAlignment = xlCenter
    .WrapText = False
    .Orientation = 0
    .AddIndent = False
    .IndentLevel = 0
    .ShrinkToFit = False
    .ReadingOrder = xlContext
    .MergeCells = False
    End With
    With Selection
    .HorizontalAlignment = xlCenter
    .VerticalAlignment = xlCenter
    .WrapText = False
    .Orientation = 0
    .AddIndent = False
    .IndentLevel = 0
    .ShrinkToFit = False
    .ReadingOrder = xlContext
    .MergeCells = False
    End With
    Range("E2").Select
    End Sub
    1
    1. Bonjour

      pour supprimer les colonnes une seule ligne

      Range("C:C,F:O").Delete

      &

      Range("E1").Value = "Total"

      A+
      Maurice
      1
      1. Contributeur
        Bonjour,

        excusez l'icruste mais

        Procédure demande initiale peut -^tre sans lignes inutiles et nombre de lignes variable; pour la 2° je regarde si j'ai un peu de temps car + complexe

        Option Explicit
        Sub amenager()
        Dim derlig As Integer
        'initialisations
        Application.ScreenUpdating = False 'fige le défilement de l'écran
        Range("C:C,F:O").Delete ' détruit les colonnes C et F à O
        derlig = Columns("A").Find("*", , , , , xlPrevious).Row 'dernière ligne du tableau
        'Travail sur colonne E
        With Range("E1") 'titre "Total"centré
        .Value = "Total"
        .HorizontalAlignment = xlCenter
        End With
        With Range("E2") ' formule recopiée
        .FormulaLocal = "=si(D2>0;C2/D2;"""")"
        .AutoFill Destination:=Range("E2:E" & derlig)
        End With
        End Sub

        Michel
        1
        1. Contributeur
          Merci Michel cela va m'aider pour sélectionner des cellules sur une hauteur de champ
          0
      2. Merci Maurice et Philou pour votre aide.

        Philou, ta formule fonctionne parfaitement.
        Tu pourrais m'expliquer le pourquoi de ton deuxième With stp ?

        J'ai une autre requête que j'ai oublié de préciser dans mon message initial.
        J'aimerais dupliquer, toujours avec la même macro, mes lignes en fonction de la valeur de la colonne D.

        Par exemple, j'ai la valeur 4 en D2, la valeur 2 en D3 et la valeur 6 en D4, j'aimerais dupliquer ma ligne 2 trois fois (pour avoir un total de 4 lignes identiques), ma ligne 3 une fois (pour avoir un total de 2 lignes), ma ligne 4 cinq fois (pour avoir un total de 6 lignes). L'idéal en insérant les lignes copiées juste en-dessous la ligne concernée.
        0
        1. Contributeur
          Bonjour Nico et Maurice

          La première macro modifié avec les infos de Maurice et la correction sur le centrage de Total

          Sub effacer()
          '
          ' effacer Macro
          '

          '
          Range("C:C,F:O").Delete
          Range("E1").Value = "Total"
          Range("E2").Select
          ActiveCell.FormulaR1C1 = "=IF(ISERROR(RC[-2]/RC[-1]),"""",RC[-2]/RC[-1])"
          Range("E2").Select
          Selection.AutoFill Destination:=Range("E2:E100"), Type:=xlFillDefault
          Range("E2:E100").Select
          Range("E1").Select
          With Selection
          .HorizontalAlignment = xlCenter
          .VerticalAlignment = xlCenter
          .WrapText = False
          .Orientation = 0
          .AddIndent = False
          .IndentLevel = 0
          .ShrinkToFit = False
          .ReadingOrder = xlContext
          .MergeCells = False
          End With
          Range("E2").Select
          End Sub

          Pour la nouvelle question. Je ne sais pas faire
          0
          1. Contributeur
            Nico,

            Pour te proposer une solution efficace (espèrons le) pour ta 2° demande

            On travaille sur 5 colonnes (A à E) ?

            Combien de lignes environ ?

            Suis absent cet aprèm: je regarderai certainement demain

            Michel
            0
            1. Merci Michel.
              Au maximum, 25 lignes et oui, je travaille bien avec 5 colonnes après la suppression.
              Pour faciliter la chose, peut-être pourrait-on dupliquer ces lignes dans une deuxième feuille au lieu de les insérer les unes après les autres.
              0
              1. Et du coup, si la solution dont je viens de parler est plus facile, j'ai fait ça :

                Range("F1").Value = "1"

                With Range("F2")
                .FormulaLocal = "=F1+D2"
                .AutoFill Destination:=Range("F2:F" & derlig)
                End With

                With Range("G2")
                .FormulaLocal = "=F1+1"
                .AutoFill Destination:=Range("G2:G" & derlig)
                End With

                Ça me rajoute deux colonnes F et G qui représentent une ligne de début et une ligne de fin.

                Par exemple :
                A2=10 donc F2=2 et G2=11
                => (il faut dupliquer la ligne 2 de la feuille 1, de la ligne 2 à la ligne 11 de la feuille 2)
                A3=15 donc F3=12 et G3=26
                => (il faut dupliquer la ligne 3 de la feuille 1, de la ligne 12 à la ligne 26 de la feuille 2)

                On aurait une logique comme ça :

                X=2
                De X à derlig
                Copier ligne(X)
                Coller de feuille2.ligne(FX) à feuille2.ligne(GX)
                X+1
                0
                1. Contributeur
                  Bonjour,
                  Tu écris:
                  j'aimerais dupliquer, toujours avec la même macro, mes lignes en fonction de la valeur de la colonne D.
                  puis
                  Par exemple :
                  A2=10 donc F2=2 et G2=11


                  Qu'est ce que je fais : D ou A ?

                  Mais on a pas besoin d'ajouter 2 colonnes :o)

                  j'attends ta réponse
                  0
                2. Contributeur
                  Proposition (honnête)


                  Option explicit
                  '-------------------------------
                  Sub amenager()
                  Dim Derlig As Integer, Copies(), Lig As Byte, Nbre As Byte
                  Dim Ligvide As Integer

                  'initialisations
                  Application.ScreenUpdating = False 'fige le défilement de l'écran
                  Sheets(2).Range("A1:E1000").Clear 'nettoie l'ancien tableau aménagé
                  '----
                  With Sheets(1)
                  . Range("C:C,F:O").Delete ' détruit les colonnes C et F à O
                  '----
                  Copies = .Range("A1:D1").Value 'mémorisation des titres de champ en feuille 1
                  With Sheets(2)
                  .Range("A1:D1") = Copies
                  With .Range("E1") ' inscription du champ "total "centré
                  .Value = "Total"
                  .HorizontalAlignment = xlCenter
                  End With
                  End With
                  '-----
                  Derlig = .Columns("A").Find("*", , , , , xlPrevious).Row 'dernière ligne du tableau
                  For Lig = 2 To Derlig
                  Copies = .Range(.Cells(Lig, "A"), .Cells(Lig, "D")).Value ''mémorisation des valeurs de champ en feuille 1
                  Nbre = .Cells(Lig, "A") 'nombre de lignes à recopier
                  If Nbre > 0 Then
                  With Sheets(2) 'inscription des données n fois suivant nombre(nbre) indiqué colonne A feuille1
                  Ligvide = .Columns("A").Find("", .Range("A1")).Row '' prem. ligne vide
                  .Cells(Ligvide, "A").Resize(Nbre, 4) = Copies
                  End With
                  End If
                  Next
                  End With
                  '----
                  'inscription et recopie de la formule colonne E
                  With Sheets(2)
                  Derlig = .Columns("A").Find("*", , , , , xlPrevious).Row
                  With .Range("E2") ' formule recopiée
                  .FormulaLocal = "=si(D2>0;C2/D2;"""")"
                  .AutoFill Destination:=Sheets(2).Range("E2:E" & Derlig)
                  End With
                  'encadrement du tableau
                  .Range("A1:E" & Derlig).Borders.Weight = xlThin
                  .Select
                  End With
                  End Sub

                  Maquette avec macro "try" pour essais après un 1° essai: réinsère colonne C et donne des nombres aléatoires entre 1 et 9 colonne A
                  https://www.cjoint.com/?3KbmbU5HLYH
                  0
                3. Contributeur
                  Coucou! le weekend fut bon ?
                  0
                4. Excellent, je t'ai envoyé un message privé.
                  0