Aide concernant une macro Excel
Résolu
Nico
-
NicoKaraR Messages postés 17 Date d'inscription Statut Membre Dernière intervention -
NicoKaraR Messages postés 17 Date d'inscription Statut Membre Dernière intervention -
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.
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.
A voir également:
- Aide concernant une macro Excel
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Liste déroulante excel - Guide
- Déplacer une colonne excel - Guide
- Word et excel gratuit - Guide
- Si ou excel - Guide
8 réponses
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
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
Bonjour
pour supprimer les colonnes une seule ligne
Range("C:C,F:O").Delete
&
Range("E1").Value = "Total"
A+
Maurice
pour supprimer les colonnes une seule ligne
Range("C:C,F:O").Delete
&
Range("E1").Value = "Total"
A+
Maurice
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
Michel
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
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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
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
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
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.
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.
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
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
Proposition (honnête)
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
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