XL 2016 Avis / Aide réécriture code

  • Initiateur de la discussion Initiateur de la discussion safranien
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

safranien

XLDnaute Occasionnel
Bonjour à tous

je vous sollicite pour avoir votre avis sur l'écriture du code du fichier en PJ. Je ne suis pas assidu en VBA et ai essayer de faire au mieux en fonction de ce que je réussissais à trouver sur le forum.

Le but du code est de trouver l'avant dernière ligne de la feuille 1 basé sur la détection de la colonne K qui contient une formule sur toute la colonne. Copier/insérer ligne copiée autant de fois que le nombre saisi dans la msgbox. Et même chose sur la feuille 2. Sachant que la feuille 2 reprend les colonnes de la feuille 1 mais disposées dans un autre ordre. Une formule me récupérant les valeurs de chaque ligne correspondant à l'en-tête de colonne. Donc je peux supprimer ou ajouter les lignes que je veux sur la feuille 1, les données de la ligne 6 de la feuille 1 se retrouveront dans la ligne 6 de la feuille 2 etc.

Le code fonctionne mais je suis preneur de vos corrections plus "pro" qui me permettront également de m'améliorer.

Merci et bonne fin de journée
 

Pièces jointes

Solution
Je pense avoir réussi à faire l'ensemble de ce que je voulais. Je partage le code et le fichier si ça peut aider qqun d'autre un jour. Code certainement imparfait à vos yeux mais je vais m'en contenter et arrêter de vous faire perdre plus votre temps.
En tout cas, merci pour votre aide et vos propositions qui m'ont bien orienté.
Bonne soirée

VB:
Sub test1()

    Application.ScreenUpdating = False
   
    Dim xCount As Integer
    Dim X1 As Integer
    Dim X2 As Integer
    Dim X3 As Integer
    Dim Derlig1&, Derlig2&, Ht%

    X1 = Sheets("Feuil1").Cells(Rows.Count, "K").End(xlUp).Row - 1
    X2 = Sheets("Feuil2").Cells(Rows.Count, "C").End(xlUp).Row - 1
    X3 = Sheets("Feuil1").Cells(Rows.Count, "G").End(xlUp).Row + 1...
Salut,

Alors là franchement 😱 😵

Vous n'utilisez pas les objets Sheets pour travailler dessus, vous avez fait des trucs complètement étranges à mes yeux...
Et seulement maintenant, vous venez demander 🤔 je ne comprends pas les gens...

Et pas envie de mettre les mains dans le cambouis 😖
Mais pas d'inquiétude, un tas de pros parcourent ce forum...
 
Salut,

Alors là franchement 😱 😵

Vous n'utilisez pas les objets Sheets pour travailler dessus, vous avez fait des trucs complètement étranges à mes yeux...
Et seulement maintenant, vous venez demander 🤔 je ne comprends pas les gens...

Et pas envie de mettre les mains dans le cambouis 😖
Mais pas d'inquiétude, un tas de pros parcourent ce forum...
Bonsoir

réponse aussi bête qu'inutile !!! Si vous ne voulez pas m'aider bah passez votre chemin. Vous ferez un geste pour la planète en évitant un message qui n'apporte rien stocké sur un serveur.

J'essaie de chercher par moi même et non pas débarquer comme beaucoup le font en exigeant de l'aide sans rien faire (voire sans dire bonjour ni prendre le temps de "bien" expliquer"et je me prends ça. Décidément, ça ne va jamais quoiqu'on fasse.

Donc ne mettez pas vos mains dans le cambouis, épargnez moi vos commentaires et leçons et épargnez vous de répondre pour faire l'intéressant et montrer à tout le monde que vous êtes super fort et moi super nul, je le sais déjà. Sinon je ne demanderais pas de l'aide.
 
Bonjour,

je vous sollicite pour avoir votre avis sur l'écriture du code du fichier en PJ.
Tu auras autant de façon de procéder que de codes qui te seront proposés... :/

Il y aura toutefois quelques points sur lesquels tout le monde sera d'accord :
- éviter les Select autant que faire se peut car ça augmente le temps d'exécution,
- le Application.ScreenUpdating = True en fin de macro est inutile car il est implicitement effectué,
- il est plus pratique d'utiliser des noms de variables qui disent ce qu'elles contiennent, voire leur format.

Perso, j'ajouterais qu'il est parfois bon d'utiliser les Tableaux Structurés (si tu ne fais pas partager ton classeur par Excel).


En ce qui concerne ta macro, je dirais :
- pourquoi copier l'avant-dernière ligne et insérer ? (j'imagine que c'est pour que les formules se recopient tout en continuant de prendre la totalité du tableau)
- pourquoi copier toute la ligne et insérer des lignes complètes ?


Avec tout ceci mis bout à bout je proposerais de remplacer
VB:
    Sheets("Feuil2").Select
    Range("C" & X2).EntireRow.Copy
    Range("C" & X2).Select
    Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(xCount, 0)).EntireRow.Insert Shift:=xlDown
par
VB:
    With Sheets("Feuil2")
        .Range("A" & X2 & ":K" & X2).Copy
        .Range("A" & X2 + 1 & ":A" & X2 + xCount).Insert Shift:=xlDown
    End With
 
Bonjour,


Tu auras autant de façon de procéder que de codes qui te seront proposés... :/

Il y aura toutefois quelques points sur lesquels tout le monde sera d'accord :
- éviter les Select autant que faire se peut car ça augmente le temps d'exécution,
- le Application.ScreenUpdating = True en fin de macro est inutile car il est implicitement effectué,
- il est plus pratique d'utiliser des noms de variables qui disent ce qu'elles contiennent, voire leur format.

Perso, j'ajouterais qu'il est parfois bon d'utiliser les Tableaux Structurés (si tu ne fais pas partager ton classeur par Excel).


En ce qui concerne ta macro, je dirais :
- pourquoi copier l'avant-dernière ligne et insérer ? (j'imagine que c'est pour que les formules se recopient tout en continuant de prendre la totalité du tableau)
- pourquoi copier toute la ligne et insérer des lignes complètes ?


Avec tout ceci mis bout à bout je proposerais de remplacer
VB:
    Sheets("Feuil2").Select
    Range("C" & X2).EntireRow.Copy
    Range("C" & X2).Select
    Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(xCount, 0)).EntireRow.Insert Shift:=xlDown
par
VB:
    With Sheets("Feuil2")
        .Range("A" & X2 & ":K" & X2).Copy
        .Range("A" & X2 + 1 & ":A" & X2 + xCount).Insert Shift:=xlDown
    End With
Bonjour

et merci beaucoup pour cette réponse qui m'aide.

Pour répondre à vos questions :
- pourquoi copier l'avant-dernière ligne et insérer ? --> car la dernière ligne a une ligne épaisse d'encadrement (la ligne du bas) et si je recopie / colle cette ligne, ça me met des lignes épaisses partout et je n'avais pas trouvé comment l'empêcher. Je suis donc parti sur l'avant dernière ligne.

- pourquoi copier toute la ligne et insérer des lignes complètes ? --> parce que mon tableau est évolutif avec des ajouts de colonnes. Le fait de copier toute la ligne me permettait de ne pas me poser de questions de savoir si tout allait bien être copié. Mais avec votre code, j'ai adapté et mis plus large que le colonne K.

Votre code semble bien fonctionner. Juste une chose qui diffère. Les lignes de mon tableau de travail ont une hauteur de 45 pixels. Avec mon "code", les lignes insérées conservaient bien cette hauteur. Avec le votre, les lignes ont une hauteur de 34 pixels. Ce n'est pas grave en soit mais s'il existe une manière simple de conserver la totalité de mise en forme de la ligne copiée, dont cette hauteur de ligne, je suis preneur.
 
Dernière édition:
- pourquoi copier l'avant-dernière ligne et insérer ? --> car la dernière ligne a une ligne épaisse d'encadrement (la ligne du bas) et si je recopie / colle cette ligne, ça me met des lignes épaisses partout et je n'avais pas trouvé comment l'empêcher. Je suis donc parti sur l'avant dernière ligne.
Si c'est seulement pour la bordure épaisse, j'imagine deux possibilités :
- ne pas mettre une bordure épaisse en bas de la dernière ligne, mais mettre la ligne épaisse en haut de l'après-dernière ligne (mais ce n'est qu'une hypothèse et il faut donc tester pour voir si ça fonctionne),
- utiliser un Tableau Structuré.
Ainsi tu devrais pouvoir insérer après la dernière ligne du tableau.


- pourquoi copier toute la ligne et insérer des lignes complètes ? --> parce que mon tableau est évolutif avec des ajouts de colonnes. Le fait de copier toute la ligne me permettait de ne pas me poser de questions de savoir si tout allait bien être copié. Mais avec votre code, j'ai adapté et mis plus large que le colonne K.
Donc je vois là aussi deux possibilités :
- remettre la copie de ligne complète car ce que j'ai proposé n'est pas bon et la copie de la ligne complète résout effectivement ce problème,
- utiliser un Tableau Structuré.
 
Si c'est seulement pour la bordure épaisse, j'imagine deux possibilités :
- ne pas mettre une bordure épaisse en bas de la dernière ligne, mais mettre la ligne épaisse en haut de l'après-dernière ligne (mais ce n'est qu'une hypothèse et il faut donc tester pour voir si ça fonctionne),
- utiliser un Tableau Structuré.
Ainsi tu devrais pouvoir insérer après la dernière ligne du tableau.



Donc je vois là aussi deux possibilités :
- remettre la copie de ligne complète car ce que j'ai proposé n'est pas bon et la copie de la ligne complète résout effectivement ce problème,
- utiliser un Tableau Structuré.
d'accord , merci. Je vais essayer de voir cette histoire de tableaux structurés. Sauf que dans ma feuille 2, j'ai plein d'autres colonnes avec des formules qui seront du coup en dehors de ce tableau. je n'utilise jamais ça, donc je ne visualise pas encore les contraintes que cela pourrait apporter de basculer sur des TS. Je ferai un essai quand j'aurai 5'.

Si néanmoins je reste sur le format actuel, une idée pour insérer la ligne copiée en conservant la même hauteur de ligne ?
 
Sauf que dans ma feuille 2, j'ai plein d'autres colonnes avec des formules qui seront du coup en dehors de ce tableau. je n'utilise jamais ça, donc je ne visualise pas encore les contraintes que cela pourrait apporter de basculer sur des TS.
Je n'ai pas vu ces colonnes.

Pourquoi ces formules seraient-elles hors du tableau ?
Sont-elles liées aux autres données de la même ligne ?
 
Bonjour à tous

@safranien

Quand je lis ceci je penses que tu t’égares .... 🙄

- pourquoi copier l'avant-dernière ligne et insérer ? --> car la dernière ligne a une ligne épaisse d'encadrement (la ligne du bas) et si je recopie / colle cette ligne, ça me met des lignes épaisses partout et je n'avais pas trouvé comment l'empêcher. Je suis donc parti sur l'avant dernière ligne.

La logique qui me semble plus simple c'est de recopier à la dernière ligne comme tout le monde fait d'habitude et de reconstruire ton quadrillage.
C'est un peu comme si tu me dis je sais pas passer la marche arrière sur ma voiture et donc je fais le tour de la ville car j'ai raté la place de parking de 10 cm.

Code pour reconstruire ton quadrillage en 3 lignes commentées

VB:
Range("A5").CurrentRegion.Borders.LineStyle = 0                                     'Supprime toutes les bordures
Range("A5").CurrentRegion.Borders.LineStyle = 1                                     'Création de toutes les bordures
Range("A5").CurrentRegion.BorderAround LineStyle:=1, Weight:=xlThick                'Création des bordures extérieures

Bien sur tu peux rajouter les lignes et colonnes que tu veux cela fonctionnera

Merci de ton retour
 
Il faudrait ajouter une ligne de code pour modifier la hauteur des lignes insérées.
oui c est ce que je me suis dis. Si tu as une idée de comment l'écrire je suis preneur. J'ai tenté qqch comme ça

VB:
    With Sheets("Valo_Elec")
        .Range("A" & X1 & ":SZ" & X1).Copy
        .Range("A" & X1 + 1 & ":A" & X1 + xCount).Insert Shift:=xlDown
        .Range("A" & X1 + 1).EntireRow.RowHeight = 33.75
    End With

mais bien évidemment, ça ne doit pas s'écrire ainsi et ça ne fonctionne pas.
 
Je n'ai pas vu ces colonnes.

Pourquoi ces formules seraient-elles hors du tableau ?
Sont-elles liées aux autres données de la même ligne ?
oui les formules sont liées aux données des mêmes lignes. Comme je disais, je ne maitrise pas ces TS, on doit pouvoir mettre des formules dedans j'imagine et elles s'étirent quand le tableau s'agrandit ? Si c'est ça, effectivement, je creuserai le sujet quand j'aurai du temps. Mais je dois, en attendant, rendre une copie avec l'existant sans tout refaire.
 
Bonjour à tous

@safranien

Quand je lis ceci je penses que tu t’égares .... 🙄



La logique qui me semble plus simple c'est de recopier à la dernière ligne comme tout le monde fait d'habitude et de reconstruire ton quadrillage.
C'est un peu comme si tu me dis je sais pas passer la marche arrière sur ma voiture et donc je fais le tour de la ville car j'ai raté la place de parking de 10 cm.

Code pour reconstruire ton quadrillage en 3 lignes commentées

VB:
Range("A5").CurrentRegion.Borders.LineStyle = 0                                     'Supprime toutes les bordures
Range("A5").CurrentRegion.Borders.LineStyle = 1                                     'Création de toutes les bordures
Range("A5").CurrentRegion.BorderAround LineStyle:=1, Weight:=xlThick                'Création des bordures extérieures

Bien sur tu peux rajouter les lignes et colonnes que tu veux cela fonctionnera

Merci de ton retour
Bonjour

merci pour la réponse. Je suis d'accord avec cela. Sauf que j'ai des impératifs de construction du tableau avec des colonnes vides pour séparer et sur ces colonnes vides, il n'y a pas de bordures. Donc je ne peux pas appliquer un code qui va mettre de la bordure sur toutes les cellules. C'est pour cela que je vais chercher l'avant dernière ligne et que j'insère.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
7
Affichages
283
Retour