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. 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
  2. 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. 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. 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. 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. 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. Bonjour

            pour supprimer les colonnes une seule ligne

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

            &

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

            A+
            Maurice
            1
            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