Modification Macro

Bonjour à tous et merci par avance de vos lumières,

J'ai un classeur excel, en feuille 8 j'ai une base de données qui débute à la ligne 11 (1 à 10 étant des lignes de titres figées)

dans la zone des lignes de 11 à x..... (au fur et à mesure des entrées des données les lignes s'allongent)

Je suis amené, de temps en temps, à devoir insérer entre toutes ces lignes, un format de lignes spécifiques que j'ai formalisées sur une autre feuille (feuille 2-1).

Pour faciliter le travail et éviter la répétitivité des actions J'ai enregistré la macro suivante :

Sub Copie_Famille()

'

' Copie_Famille Macro

'

'

Rows("15:15").Select

Sheets("2-1 Textes").Select

Rows("13:16").Select

Selection.Copy

Sheets("8_Liste Alpha").Select

ActiveSheet.Paste

End Sub

Dans le cadre de cette macro, l'insertion de la copie de mon format de lignes se fera toujours à la ligne 15 (Rows("15:15")

Or mes copies ultérieures se feront à n'importe quelle ligne de la base de données que je sélectionnerai en temps voulu.

Comment modifier la formule (formule aléatoire ?) en conséquence pour remplacer "15:15" par la sélection de la ligne que je ferai : exemple la ligne "2252:2252" ou "352:352" ec.

Par avance merci et cordialement à vous

Bonjour,

Conseils :

1) Utilise la balise Code pour mettre du code dans un post.

2) Indente ton code, il sera au moins lisible !

3) Ecris du code en VBA plutôt qu'en "enregistreur" (c'est plus efficace ! )

4) Utilise des variables....

5) Je ne vois pas bien la nécessité de copier-coller un format, il y a d'autres façons de faire...

6) La différenciation de formats par lignes dans une base de données me paraît une hérésie... mais bon !

Merci de la réponse, mais :

1 - Je suis ignare en matière de VBA donc tous les conseils sont pour moi de l'hébreu, balise ? Indenter le code ? écrire en enregistreur ?

je ne vois pas à quoi cela fait référence

Je pensais, certainement à tord force est de le constater, qu'en recopiant "in extinso" ma "petite" macro cela serait compréhensible pour des personnes maîtrisant le langage Visual Basic, et donc de ce fait beaucoup plus explicite. Pourtant il me semble avoir vu dans maintes demandes que beaucoup copiaient, comme je l'ai fait leur macro en demandant comment la modifier, ou même d'autres fois que les solutions étaient données de même pour être tout simplement recopiées dans l'éditeur.

Je le répète je suis totalement débute, dans les balbutiements...

2- Désolé, je me suis mal exprimé en parlant de format : par là j'ai voulu tout simplement décrire que je copiais un ensemble de 4 lignes qui sont pour moi formatées, donc constantes dans leur structure avec des "mentions fixes" dans certaines cellules (la ligne Rows("13:16").Select, décrit l'action menée) , pensant faire simple je vois que j'ai fait compliqué mille excuses.

Cordialement

Les façons de procéder sont diverses...

Mais il convient de ne pas perdre de vue que le forum est un lieu d'entraide et d'échanges, ce n'est pas un lieu de prestations de services...

Les intervenants sont certes souvent amenés à fournir des procédures complètes et fonctionnelles sur les problèmes posés, voire même des pans de programme plus large, l'objectif n'en reste pas moins didactique, soit sur le plan de la construction du code ou de son articulation, soit sur le développement d'un projet en tant que tel...

Alors pour commencer, la fenêtre de rédaction des réponses est surmontée d'une ligne de boutons verts qui ne sont pas là seulement pour faire joli . Il y en a un sur lequel est inscrit Code : lorsque tu colles un fragment de code ou une procédure complète dans ta réponse, tu la sélectionnes, tu cliques sur le bouton et ta sélection s'encadrera de balises :

Ensuite, en joignant un fichier qui illustre ton problème et le résultat que tu veux obtenir, cela permet d'une part de bien comprendre ce qu'il en est, et d'autre part de rechercher les réponses les mieux adaptées...

Et on pourra t'aider à écrire ton code autrement qu'avec des Select à presque toutes les lignes !

Cordialement.

Bonjour,

Loin de moi l'intention de prendre le Forum pour un service "Clef en Main", même débutant je sais ce qu'entraide veut dire et en conséquence le respect de ceux qui viennent en aide.

Donc voilà le "code" de ma macro, (je saurai donc maintenant ce qui doit être fait dans ce cas ; désolé lors de ma première demande, je ne connaissais pas la procédure.)

Sub Copie_Famille_Essai()
'
' Copie_Famille_Essai Macro
'

'
    Rows("16:16").Select
    Sheets("2-1Texte").Select
    Rows("14:17").Select
    Selection.Copy
    Sheets("8-ListeAlpha").Select
    Selection.Insert Shift:=xlDown
End Sub

J'ai d'autre part fait un petit fichier de "démonstration" le fichier initial étant trop lourd à envoyer, mais c'est exactement les mêmes opérations à réaliser et la même configuration particulièrement les différents noms des feuilles (quand aux numéros de ligne il suffit des les adapter ou de les nommer à la base).

Dans la feuille du tableau j'ai essayé de donner le maximum de renseignement sur la finalité de ce que je souhaite obtenir : Modification de la ligne "Rows("16:16)"

Merci pour tout par avance

Bonjour,

Après examen de ton modèle, je te suggère 2 aménagements :

1) Nommer la plage à copier et coller par insertion dans ta feuille de travail. (Je l'ai nommée Famille, mais tu peux évidemment mettre le nom qui te convient...)

2) L'insertion se fait en fonction de la sélection sur une ligne, mais la ligne sélectionnée doit correspondre à une ligne d'en-tête de famille (ou en cas d'insertion en fin, laisser une ligne intermédiaire...)

Il me paraît donc utile de tester que la position est correcte avant de donner cours à l'insertion. Compte-tenu de ta mise en forme le critère de vérification qui m'a paru le plus adapté est ta couleur de fond : si la cellule en colonne A de la ligne qui précède la ligne sélectionnée pour l'insertion est colorée selon la couleur de fond, on peut insérer (cela fonctionne pour toute insertion, sauf pour une insertion en-tête de liste, à moins de colorer la cellule A10 de la couleur du fond).

D'où ma 2e suggestion de colorer cette cellule A10.

On a ainsi un test à même d'éviter des erreur d'inattention lors d'une insertion (cela n'empêche pas de sauter éventuellement plusieurs lignes en fin de liste, mais l'erreur dans ce cas ne couperait pas une famille et serait rapidement rectifiable...)

La macro deviendrait donc :

Sub Copie_Famille_Essai()
    Dim n%, clfd&
    n = Selection.Row
    clfd = RGB(231, 230, 230)
    With ActiveSheet
        If .Cells(n - 1, 1).Interior.Color = clfd Then
            [Famille].Copy
            .Range("A" & n).Resize(, 12).Insert xlShiftDown
        Else
            MsgBox "Emplacement non autorisé pour une insertion." & Chr(10) & "Vérifier.", vbInformation, _
             "Erreur d'insertion"
        End If
    End With
End Sub

L'utilisateur se positionne sur une ligne (la colonne importe peu) avant de lancer la macro (bouton).

La macro identifie la ligne (affectée à une variable de type Integer). Elle initialise également une variable de type Long (les couleurs sont des données de type Long) à la couleur du fond.

Elle teste si la cellule de la ligne n-1 en A est de cette couleur.

Si c'est le cas, elle copie et insère (dimensionnement de la ligne d'insertion à partir de la cellule en A sur 12 colonnes).

Sinon, elle invite l'utilisateur à vérifier sa ligne d'insertion...

Cordialement.

Bonjour,

Merci pour toutes ces explications détaillées, mais cela ne fonctionne pas tout à fait je m'explique :

J'ai reproduit le code dans ma feuille en adaptant par rapport aux nombre de colonnes vu que mon tableau va jusqu'à la lettre U donc j'ai modifié 12 en 21.

Lorsque je me positionne sur une ligne (bien sur au dessus de la ligne de référence) cela affiche "Emplacement non autorisé pour une insertion/Véririez".

Donc le code fonctionne bien (vu que le message d'erreur s'affiche) mais je pense qu'il doit y avoir une erreur de ma part quelque part dans la retranscription.

J'ai essayé de "traduire" le code, pour voir ce qu'il n'allait pas ai-je bien interprété ? :

1- Dim n% c'est le référencement de la ligne

2- clfd = RGB(231, 230, 230) c'est le référencement de la couleur par rapport au tableau des couleurs.

3- If .Cells(n - 1, 1).Interior.Color = clfd Then [\\Lignes_Famille_Type].Copy

Si la cellule n-1 de la colonne 1 dont l'intérieur est la couleur référencé on copie la plage nommée \\Lignes_Famille_Type.

4- .Range("A" & n).Resize(, 21) là je bute sur l'interprétation

5- .Insert xlShiftDown c'est le code d'insertion de la copie effectuée.

En relisant vos commentaire je me suis aperçu que ma cellule "A" n'était pas colorée

Pour un essai j'ai donc colorié la cellule de la colonne A en bleu (identique par un copier-coller) dans la partie à copier et sur une des lignes déjà insérée dans mon tableau, mais j'ai toujours le même message d'erreur !!!

Dans mon tableau la ligne "ou est inscrit le nom de la famille" se présente de la manière suivante :

Colonne A cellule coloriée en Bleu pour la référence d'autorisation à insérer la copie.

Colonne B Cellule coloriée en Rose et il y a une fonction d'addition

Colonne C à U les cellules sont en Rose et fusionnées

Ces différences par rapport à l'exemple premier jouent-elles ?

Cordialement à vous

Bonjour,

Dim n%, clfd& est une déclaration de variables : n de type Integer (% équivaut à As Integer, c'est ce qu'on nomme un caractère de déclaration de type, il n'en existe que pour quelques types, dont & pour As Long ou $ pour As String)

On affecte à cette variable le numéro de ligne sur laquelle est positionnée le curseur par : n = Selection.Row

On affecte à la variable clfd le code de la couleur de fond au moyen de la fonction RGB.

Il convient de vérifier que la couleur est bien la même, sinon cela ne peut fonctionner : tu te positionnes sur une cellule de cette couleur et tu vas vérifier si les paramètres RGB sont bien identiques.

Tu fais commencer un nom par \\ ?

.Range("A" & n).Resize(, 21) c'est plage (cellule) A de la ligne n redimensionnée sur 21 colonnes.

Le test couleur s'opérant sur la colonne A, ligne n-1, si tu as le message, c'est que la couleur de cette cellule ne correspond pas !

Cordialement.

Bonsoir,

Depuis ce matin (enfin presque), je suis sur ces "satanées couleurs" et je bute toujours.

Comme conseillé j'ai regardé pour le code couleur afin qu'ils soient identiques.

Ce que je n'arrive pas comprendre dans le code VBA pour les références couleurs il est marqué RGB (clfd = RGB(255, 0, 255) et quand je vais dans la "palette-autres couleurs-personnalisées" : il est marqué code RVB et non RGB ? Il y a en outre deux références proposées RVB et TSL ?

Par exemple j'ai essayé en coloriant la cellule A (de la ligne dans le tableau et l'identique sur la partie à copier) de la même couleur que celle qui est en cellule B avec le code trouvé est 255,0,255, cela ne fonctionne toujours pas (même message ?

Pour nommer mes champs, oui, j'ai trouvé cette "astuce", pour certains de commencer par soit \ soit \\ suivi de A, B, C..., afin de les classer dans un ordre alphabétique et les mettre en premier, pour mieux les retrouver (en premier sur la liste) ensuite lorsque je les affecte, ou que je vais dans le Gestionnaire de noms . Sinon ils se mélangent avec tous les autres qui classés normalement alphabétiquement. Cela a-t'il une importance d'éventuel conflit dans des codes VBA ?

Cordialement

Bonjour.

RVB => Rouge, vert, bleu

RGB => Red, green, blue

Le code de MFerrand ne regarde pas 255,0,255, il regarde le genre de gris que tu as (tableau très kitch d'ailleurs, ça fait mal aux yeux !), il faut te positionner sur les cases roses.

Bonne journée.

Si un nom est accepté par le gestionnaire, VBA n'y verra pas d'inconvénient... Je notais simplement une utilisation inhabituelle de caractères utilisés dans les adresses réseau...

Pour les couleurs, on utilise un code RGB (ou RVB comme te l'a expliqué Elhevan) ou chaque composante rouge, verte ou bleu d'une couleur est définie par une valeur variant de 0 à 255, ce qui identifie : 256^3 = 16 777 216 couleurs...

C'est toi qui a coloré ton modèle et qui a affublé un certain nombre de cellules d'une couleur dont les 3 composantes ont respectivement pour valeur : 231, 230, 230, soit un gris (légèrement faussé par sa composante rouge non rigoureusement égale aux 2 autres).

Si la macro ne trouve pas cette couleur très précisément en colonne A dans la ligne qui précède ta sélection, elle refusera d'insérer !

Tu peux évidemment modifier cette couleur, et tu modifies également le code RGB recherché par la macro.

Et tu veilles à ce que pour toute ligne qui précède une ligne d'en-tête de famille, cette couleur soit en colonne A, et uniquement sur cette ligne et pas sur les autres (et également la ligne qui suit la dernière famille, pour pouvoir insérer à la fin).

Ce n'est pas très compliqué mais c'est une garantie pour n'insérer qu'entre deux famille (ou avant la première ou après la dernière) sans couper une famille en deux !

Cordialement.

Bonsoir, Elhevan, MFerrand

OK pour RGB et RVB ,

J'avoue que j'aurai du faire le rapprochement...

Pour les références couleurs je me suis trompé dans mon post en recopiant ce n'est pas les références initiales, j'ai donc tout mélangé et je commence à comprendre.

Même avec les références initiales à savoir RGB (231, 230, 230), en positionnant la couleur correspondante à cette référence en colonne A cela ne fonctionne pas sur mon tableau. Je vais tout reprendre à Zéro

Quand au "Kitch" ce n'est qu'un tableau composé en 5 minutes pour l'exemple donc je ne me suis penché pas sur le côté esthétique de la chose....

Cordialement à vous

Bonjour, et désolé du retard à revenir ici pour vous tenir informés de mes avancées (obligations familiales..)

En définitif, je ne suis pas arrivé à mettre en route cette VBA telle que conçue initialement.

Du fait qu'il n'y a que moi qui utilise cette base de données, et même si au demeurant j'ai trouvé l'idée très judicieuse de soumettre la copie à la comparaison de couleur (personne n'est à l'abri d'un moment d'étourderie), j'ai donc recomposé le code VBA, sans cette option.

J'avoue très humblement y être allé un peu au pif, mais cela fonctionne parfaitement.

Je vous la communique peut-être n'est ce pas tout à fait dans le "purisme" d'une conception cohérente :

Sub Copie_Famille_Essai()
    Dim n%
    n = Selection.Row

    With ActiveSheet

    [\\Famille_à_copier].Copy
    .Range("A" & n).Resize(, 22).Insert xlShiftDown

    End With
End Sub

Merci pour tout et surtout pour votre patiente très cordialement à vous

Pour visualisation :

Le même code, correctement indenté :

Sub Copie_Famille_Essai()
    Dim n%
    n = Selection.Row
    With ActiveSheet 
        [\\Famille_à_copier].Copy
        .Range("A" & n).Resize(, 22).Insert xlShiftDown
    End With
End Sub

Bien évidemment il fonctionne, mais sans condition l'insertion se fera n'importe où au lieu de t'éviter des erreurs (d'inattention ou autre).

Cordialement.

Merci infiniment, je le peaufine en conséquence

Rechercher des sujets similaires à "modification macro"