Aide concernant une macro Excel

Résolu
Nico -  
NicoKaraR Messages postés 20 Statut Membre -
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. PHILOU10120 Messages postés 6463 Date d'inscription   Statut Contributeur Dernière intervention   835
     
    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
  2. foo
     
    Bonjour

    pour supprimer les colonnes une seule ligne

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

    &

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

    A+
    Maurice
    1
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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. PHILOU10120 Messages postés 6463 Date d'inscription   Statut Contributeur Dernière intervention   835
       
      Merci Michel cela va m'aider pour sélectionner des cellules sur une hauteur de champ
      0
  4. Nico
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. PHILOU10120 Messages postés 6463 Date d'inscription   Statut Contributeur Dernière intervention   835
     
    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
  7. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  8. Nico
     
    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
  9. NicoKaraR Messages postés 20 Statut Membre
     
    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. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Coucou! le weekend fut bon ?
      0
    4. NicoKaraR Messages postés 20 Statut Membre
       
      Excellent, je t'ai envoyé un message privé.
      0