OVH Cloud OVH Cloud

Insertion de colonnes par rapport à une cellule

20 réponses
Avatar
géjoun
Bonjour,

J'ai essayé de me créer une petite macro avec l'enregistreur pour insérer
des colonnes ou je le souhaite, mais ça ne fonctionne pas comme je voudrais.

De A1 à A160, j'ai une colonne 'type' qui est masquée dans ma feuille, et je
veux la copier, pour aller l'insérer ou je veux dans mon tableau; et qu'elle
s'insère à droite de la colonne dans laquelle se trouve la cellule active,
sans tenir compte de la position de la cellule active dans cette colonne.

Par exemple, avant de lancer la macro associée à un bouton, je me positionne
dans une des cellules de la colonne par rapport à laquelle je souhaite
insérer ma nouvelle colonne, puis je lance la macro :

1 - Elle copie la colonne type de A1 à A160
2 - Elle la colle en l'insérant à droite de la cellule active, sans tenir
compte du positionnement de la cellule active (que je me positionne en P1 ou
en P46, la colonne copiée sera toujours insérée à droite, mais comme si je
cliquais sur l'en-tête de la colonne pour insérer).

J'espère que j'ai été assez clair...

Merci!

--
géjoun
dam-mail2006@ifrance.com
/Enlever l''année pour m''écrire.../

10 réponses

1 2
Avatar
JpPradier
De quel chiffre tu parles ?
Ce que je veux dire, c'est que la fusion de cellule ne s'appliquera pas à la colonne
insérée après la colonne D. Il faudra éventuellement rajouter un bout de code.

j-p
Avatar
géjoun
Dans le 2ème exemple que j'ai mis en ligne, en cellule D3 de la feuille 1, il
y a le chiffre 2, et je voulais savoir si par une deuxième macro, il y aurait
quand même la possibilité en se positionnant dans une des cellules de la
colonne D d'insérer une nouvelle colonne (copier de la colonne A) entre D et
E (aprés E), de façon à ce que la nouvelle colonne apparaisse aprés le
chiffre 2, et que la nouvelle cellule E2 soit quand même fusionnée avec
celles déja fusionnée (C et D).

Parce que j'arrive pas à voir la démarche qu'il faudrait que je fasse avec
l'enregistreur de macro pour arriver à ça.

Est-ce plus clair? :-?

--
géjoun

/Enlever l''année pour m''écrire.../





De quel chiffre tu parles ?
Ce que je veux dire, c'est que la fusion de cellule ne s'appliquera pas à la colonne
insérée après la colonne D. Il faudra éventuellement rajouter un bout de code.

j-p




Avatar
géjoun
Bonjour,

Ca y est, je pense avoir trouvé une méthode pour arriver à insérer une
colonne sur la droite tel que je le souhaite. Voici ce que me donne la macro
avec l'enregistreur de macro :

Sub Insertion()
Columns("N:N").Select
Selection.Insert Shift:=xlToRight
Range("O3:O44").Select
Selection.Cut
Range("N3").Select
ActiveSheet.Paste
Columns("A:A").Select
Selection.Copy
Columns("O:O").Select
ActiveSheet.Paste
End Sub

Sauf que bien entendu, avec l'enregistreur, je me retrouve avec une macro
qui est faite pour un cas bien précis, et moi, je voudrais l'adapter pour que
ça fonctionne avec toutes les colonnes.
Donc en fait, voici ce que je voudrais :

Sub Insertion()
Columns("N:N").Select ' Là, je sélectionne la colonne aprés laquelle je
souhaite en insérer une nouvelle
Selection.Insert Shift:=xlToRight ' J'iinsère une nouvelle colonne ce
qui me décale celle dans laquelle j'étais sur la droite
Range("O3:O44").Select ' Je sélectionne la plage de la colonne décalée
sur la droite, et qui va de la ligne 3 à la ligne 44
Selection.Cut ' Je coupe cette sélection
Range("N3").Select ' Je me repositionne dans la colonne vierge qui vient
d'être insérée (et qui ne possède pas de formules)
ActiveSheet.Paste ' Je colle ma sélection de façon à ramener les données
à la suite des autres
Columns("A:A").Select ' Je sélectionne la colonne A qui contient toutes
les formules
Selection.Copy ' Je la copie
Columns("O:O").Select 'Je me positonne sur la colonne où j'ai coupé les
données tout à l'heure et qui ne contient plus de formule
ActiveSheet.Paste ' J'y recolle les formules
End Sub

Je ne sais pas si ça aide à comprendre ce que je veux faire; mais je cherche
à adapter cette macro de façon à pourvoir obtenir ces différentes opérations
pour n'importe quelle colonne dans laquelle je l'exécuterai, et non pas
seulement pour la colonnne N et O.

Quelqu'un peut-il m'aider?

Merci!

--
géjoun

/Enlever l''année pour m''écrire.../





Dans le 2ème exemple que j'ai mis en ligne, en cellule D3 de la feuille 1, il
y a le chiffre 2, et je voulais savoir si par une deuxième macro, il y aurait
quand même la possibilité en se positionnant dans une des cellules de la
colonne D d'insérer une nouvelle colonne (copier de la colonne A) entre D et
E (aprés E), de façon à ce que la nouvelle colonne apparaisse aprés le
chiffre 2, et que la nouvelle cellule E2 soit quand même fusionnée avec
celles déja fusionnée (C et D).

Parce que j'arrive pas à voir la démarche qu'il faudrait que je fasse avec
l'enregistreur de macro pour arriver à ça.

Est-ce plus clair? :-?

--
géjoun

/Enlever l''année pour m''écrire.../





De quel chiffre tu parles ?
Ce que je veux dire, c'est que la fusion de cellule ne s'appliquera pas à la colonne
insérée après la colonne D. Il faudra éventuellement rajouter un bout de code.

j-p






Avatar
JpPradier
Bonjour géjoun

Je m'aperçois que je t'ai répondu en bal perso. C'est une erreur de bouton, désolé.
Ci-dessous la copie de mon message :

---------------
Bonsoir géjoun

Si ta plage fusionnée commence toujours en C2, alors tu peux rajouter ceci
en fin de macro :

Range("C2").Resize(1,x-1).Merge

j-p

--------------

j-p
Avatar
géjoun
Bonjour,

Le code que tu me proposes ne va pas pour mon tableau, car le départ des
cellules fusionnées change suivant le nombre de colonnes que comporte mon
tableau (il y a plusieurs cellules fusionnées sur la même ligne, et chaque
cellules fusionnées ne comporte pas forcément le même nombre de cellules.

Donc, à force de bidouiller, je suis arrivé à adapter le 1er code que tu
m'as donné pour faire ce que je souhaite, mais est-ce que tu pourrais quand
même regarder si il n'est pas possible de simplifier?

Voici le code original que tu m'as fourni pour insérer une colonne à droite
de l'actuelle, mais au départ du tableau :

Sub Gauche()
x = ActiveCell.Column
Columns("A:A").Copy
Cells(1, x + 1).Insert Shift:=xlToRight
Application.CutCopyMode = False
Columns(x + 1).ColumnWidth = 10
End Sub

Et voici le code que j'ai bricolé pour insérer une colonne toujours à droite
de l'actuelle, mais en fin de tableau :

Sub Droite()
x = ActiveCell.Column
Columns("A:A").Copy
Cells(1, x).Insert Shift:=xlToLeft
Range(Cells(3, x + 1), Cells(44, x + 1)).Cut
Cells(3, x).Select
ActiveSheet.Paste
Columns("A:A").Copy
Cells(1, x + 1).Select
ActiveSheet.Paste
Columns(x).ColumnWidth = 10
Columns(x + 1).ColumnWidth = 10
Application.CutCopyMode = False
End Sub

Je t'envoie sur ta BAL un exemple du fichier dans lequel j'ai inséré le code
pour mieux comprendre la finalité du bouzin, si t'as 3 sec pour y jeter un
oeil...

Et une dernière question, j'ai eu beau faire des essais pour voir la
différence entre les 2, je ne vois pas ce que ça change à "Insert
Shift:=xlToLeft" de mettre "Left" ou "Right" à la fin (c'est pourtant bien ça
qui définit de quel côté insérer la nouvelle colonne non?).

Merci!

--
géjoun

/Enlever l''année pour m''écrire.../





Bonjour géjoun

Je m'aperçois que je t'ai répondu en bal perso. C'est une erreur de bouton, désolé.
Ci-dessous la copie de mon message :

---------------
Bonsoir géjoun

Si ta plage fusionnée commence toujours en C2, alors tu peux rajouter ceci
en fin de macro :

Range("C2").Resize(1,x-1).Merge

j-p

--------------

j-p




Avatar
JpPradier
Bonsoir géjoun

Je suis arrivé à faire quelque chose qui a l'air de rouler, mais c'est un peu usine à gaz.

j-p


Sub GaucheDroite()

x = ActiveCell.Column
Columns("A:A").Copy
Cells(1, x + 1).Insert Shift:=xlToRight
Application.CutCopyMode = False
Columns(x + 1).ColumnWidth = 12.57
If Cells(2, x + 1).MergeCells Then
para = 0
Else
para = 1
End If
debu = Cells(2, x).MergeArea.Address
fin = Cells(2, x + para).Address
With Range(debu, fin)
.Merge
.Borders(xlEdgeLeft).LineStyle = xlContinuous
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeRight).LineStyle = xlContinuous
End With

End Sub
Avatar
géjoun
Bonjour,

Je viens de regarder ta macro, et bien entendu... ça me va à moitié... :-(
(je suis un peu chiant...)

Effectivement, elle fonctionne bien pour insérer des colonnes au début et en
fin du tableau, sauf qu'en fin de tableau, elle m'insère des cellules non
fusionnées (à partir de la ligne 46, et toutes celles qui sont en dessous).

Mais bon, comme tu dis, je saisis pas encore toutes les subtilités de ton
code, mais si je comprends à peu près le principe, c'est vrai que ça tourne à
l'usine à gaz.

Et en plus de ce problème de cellules fusionnées, il y a un autre truc
auquel j'avais pas fait attention, et qui merdoie, c'est qu'à la ligne 42,
pour chaque groupe de colonnes, j'ai (normalement) une plage nommée (par
exemple de E42 à H42; puis de J42 à H 42, puis M42 à N42...etc...); et ces
plages me servent ensuite à la ligne 46 pour la somme des cellules qui les
composent; et j'ai remarqué que lorsque j'insère une colonne en début de
tableau, ça ne pose pas de soucis, la plage s'adapte automatiquement au
nouveau nombre de cellules, mais lorsque j'insère en fin de tableau, la, la
plage reste figée et ignore la nouvelle cellule insérée; donc ça aussi ça me
convient pas :-( .

Je repars dans mes essais pour voir si j'arrive à quelque chose.

Merci quand même!
--
géjoun

/Enlever l''année pour m''écrire.../



Bonsoir géjoun

Je suis arrivé à faire quelque chose qui a l'air de rouler, mais c'est un peu usine à gaz.

j-p


Sub GaucheDroite()

x = ActiveCell.Column
Columns("A:A").Copy
Cells(1, x + 1).Insert Shift:=xlToRight
Application.CutCopyMode = False
Columns(x + 1).ColumnWidth = 12.57
If Cells(2, x + 1).MergeCells Then
para = 0
Else
para = 1
End If
debu = Cells(2, x).MergeArea.Address
fin = Cells(2, x + para).Address
With Range(debu, fin)
.Merge
.Borders(xlEdgeLeft).LineStyle = xlContinuous
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeRight).LineStyle = xlContinuous
End With

End Sub




Avatar
géjoun
Re,

Aprés avoir usé encore et encore l'enregistreur de macros, et des recherches
dans les archives du forum, je suis arrivé à pondre un truc qui fonctionne
pas trop mal, mais par contre, je vais avoir une macro pour l'insertion des
colonnes au début, et une pour la fin du tableau.
Voici la chose :

Sub COLONNE2FIN()
x = ActiveCell.Column
Columns(x).Insert Shift:=xlToRight
Range(Cells(3, x + 1), Cells(44, x + 1)).AutoFill
Destination:=Range(Cells(3, x), Cells(44, x + 1)), Type:=xlFillCopy
Union(Range(Cells(3, x + 1), Cells(34, x + 1)), Cells(40, x +
1)).ClearContents
End Sub

Qu'en penses-tu?
On peut encore la simplifier?

--
géjoun

/Enlever l''année pour m''écrire.../



Bonjour,

Je viens de regarder ta macro, et bien entendu... ça me va à moitié... :-(
(je suis un peu chiant...)

Effectivement, elle fonctionne bien pour insérer des colonnes au début et en
fin du tableau, sauf qu'en fin de tableau, elle m'insère des cellules non
fusionnées (à partir de la ligne 46, et toutes celles qui sont en dessous).

Mais bon, comme tu dis, je saisis pas encore toutes les subtilités de ton
code, mais si je comprends à peu près le principe, c'est vrai que ça tourne à
l'usine à gaz.

Et en plus de ce problème de cellules fusionnées, il y a un autre truc
auquel j'avais pas fait attention, et qui merdoie, c'est qu'à la ligne 42,
pour chaque groupe de colonnes, j'ai (normalement) une plage nommée (par
exemple de E42 à H42; puis de J42 à H 42, puis M42 à N42...etc...); et ces
plages me servent ensuite à la ligne 46 pour la somme des cellules qui les
composent; et j'ai remarqué que lorsque j'insère une colonne en début de
tableau, ça ne pose pas de soucis, la plage s'adapte automatiquement au
nouveau nombre de cellules, mais lorsque j'insère en fin de tableau, la, la
plage reste figée et ignore la nouvelle cellule insérée; donc ça aussi ça me
convient pas :-( .

Je repars dans mes essais pour voir si j'arrive à quelque chose.

Merci quand même!
--
géjoun

/Enlever l''année pour m''écrire.../



Bonsoir géjoun

Je suis arrivé à faire quelque chose qui a l'air de rouler, mais c'est un peu usine à gaz.

j-p


Sub GaucheDroite()

x = ActiveCell.Column
Columns("A:A").Copy
Cells(1, x + 1).Insert Shift:=xlToRight
Application.CutCopyMode = False
Columns(x + 1).ColumnWidth = 12.57
If Cells(2, x + 1).MergeCells Then
para = 0
Else
para = 1
End If
debu = Cells(2, x).MergeArea.Address
fin = Cells(2, x + para).Address
With Range(debu, fin)
.Merge
.Borders(xlEdgeLeft).LineStyle = xlContinuous
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeRight).LineStyle = xlContinuous
End With

End Sub






Avatar
JpPradier
Re

Je crois que tu n'auras pas beaucoup mieux.

j-p
Avatar
géjoun
JpPradier nous expliquait:

Re

Je crois que tu n'auras pas beaucoup mieux.

j-p


Je vais m'en contenter alors! :-)

Merci!
--
géjoun

/Enlever l'année pour répondre.../

1 2