IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Recopier un nombre variable de lignes et en gardant la mise en forme


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2015
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 211
    Par défaut Recopier un nombre variable de lignes et en gardant la mise en forme
    Bonjour,

    J'ai vraiment du mal à trouver le petit bout de programme qui me manque.

    Voilà, je veux copier les lignes 22 à 28 d'un feuille sur une autre ou bien les lignes 22 à 29 toujours d'une feuille sur une autre jusqu'à lignes 22 à 41.

    Voilà le morceau de programme ci-dessous qui fonctionne uniquement pour les lignes 22 à 38 ( ce programme garde la mise en forme = hauteur des lignes )


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub Macro1()
        Rows("22:38").Select
        Range("AB22").Activate
        Selection.Copy
        Sheets("Compétences").Select
        Range("A2").Select
        ActiveSheet.Paste
        Range("A2:A3").Select
    End Sub
    Le souci est que je veux remplacer 38 par une variable " i " que j'aurai défini avant.
    j'ai tout essayé ( à mon niveau ). J'ai même utilisé la fonction cells car en fait si je copie non pas les lignes mais les colonnes ( de A à W ) ça me suffit. Autrement dit je commence de A22 et termine à W28 ou W29 ( jusqu'à W41 ).

    Le souci est de garder la mise en forme.

    Merci d'avance.


    Novice72

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Si le but est de conserver les hauteurs des lignes et les largeurs des colonnes, le code ci-dessous est possible (il y a sans doute plus simple).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
     
    Sub LancerCopierAvecFormatsLignesColonnes()
     
    Dim DerniereLigne As Variant
     
        With Sheets("Base") ' A adapter à votre cas
     
              DerniereLigne = InputBox("Dernière ligne : ", "Saisissez la dernière ligne du tableau")
              If IsNumeric(DerniereLigne) Then
                 If DerniereLigne >= 22 Then CopierAvecFormatLignesColonnes .Range(.Cells(22, 1), .Cells(DerniereLigne, 23))
              End If
     
        End With
     
    End Sub
     
    Sub CopierAvecFormatLignesColonnes(ByVal AireSource As Range)
     
    Dim CelluleCible As Range
     
    Dim DerniereLigneCible As Long
    Dim LigneEnCours As Long
    Dim ColonneEnCours As Long
     
     
        With Sheets("Compétences")
             Set CelluleCible = .Range("A2")
             DerniereLigneCible = .Cells(.Rows.Count, 1).End(xlUp).Row
             If DerniereLigneCible >= CelluleCible.Row Then .Range(CelluleCible, .Cells(DerniereLigneCible, 23)).Clear
        End With
     
        AireSource.Copy Destination:=CelluleCible
     
        For LigneEnCours = 1 To AireSource.Rows.Count
            CelluleCible.Offset(LigneEnCours - 1, 0).RowHeight = AireSource.Rows(LigneEnCours).RowHeight
        Next LigneEnCours
     
        For ColonneEnCours = 1 To AireSource.Columns.Count
            CelluleCible.Offset(0, ColonneEnCours - 1).ColumnWidth = AireSource.Columns(ColonneEnCours).ColumnWidth
        Next ColonneEnCours
     
        Set CelluleCible = Nothing
     
    End Sub
    Si la dernière ligne à copier correspond à la dernière ligne de l'onglet, il n'est pas utile de saisir la ligne dans un InputBox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub LancerCopierAvecFormatsLignesColonnes()
     
    Dim DerniereLigne As Long
     
        With Sheets("Base") ' A adapter à votre cas
     
               DerniereLigne = .Cells(.Rows.Count, 1).End(xlUp).Row  
               If DerniereLigne >= 22 Then CopierAvecFormatLignesColonnes .Range(.Cells(22, 1), .Cells(DerniereLigne, 23))
     
        End With
     
    End Sub
    Cordialement.

  3. #3
    Membre Expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 475
    Par défaut
    Bonjour,

    Tiens donc le retour sous une autre forme : http://www.developpez.net/forums/d15...s/#post8710032

  4. #4
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2015
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 211
    Par défaut
    Merci,

    C'est bon apparemment. ( le code copié m'intéresse. Il ne me reste plus qu'à l'adapter )

    Finalement, il y a quelque chose que je ne vois pas. En effet, lorsque j'adapte ma macro, et que je la lance, elle s'arrête et m'écrit

    "Sub ou function non definie".

    Cordialement

    Novice72

  5. #5
    Membre Expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 475
    Par défaut
    Re-,

    Tu pourrais mettre ton code complet. C'est plus facile.


    Un Sub ou un Function doit être défini afin d'être appelé. Cette erreur peut avoir plusieurs causes :
    • Faute d'orthographe dans le nom de la procédure.
    • Tentative d'appeler une procédure à partir d'un autre projet sans ajouter explicitement de référence à ce projet dans la boîte de dialogue Références.
    • Spécification d'une procédure qui n'est pas visible pour la procédure appelante.
    • Déclaration d'une routine de bibliothèque de liens dynamiques (DLL, Dynamic-Link Library) Windows ou d'une routine de ressource de code Macintosh qui ne se trouve pas dans la bibliothèque spécifiée ou dans la ressource de code.


    Pour corriger cette erreur
    1. Assurez-vous que le nom de la procédure est correctement orthographié.
    2. Recherchez le nom du projet contenant la procédure que vous voulez appeler dans la boîte de dialogue Références. Si celui-ci n'apparaît pas, cliquez sur le bouton Parcourir pour le rechercher. Activez la case à cocher située à gauche du nom de projet, puis cliquez sur OK.
    3. Vérifiez le nom de la routine.

  6. #6
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2015
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 211
    Par défaut
    (re)bonjour,
    Comme tu me l'as demandé, je t'envoie le code que j'ai adapté ( nom de la feuille et <42 ).
    Comme je comprends à peu près le reste ( comme le 23 qui correspond à la colonne W ), je n'ai rien touché.
    Par contre, il est vrai que je me demande comment ce petit bout de programme sait qu'il faut copier sur la feuille compétences ( sheets("compétences") ).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    Sub LancerCopierAvecFormatsLignesColonnes()
     
    Dim DerniereLigne As Long
     
        With Sheets("Grille chronologique")
     
               DerniereLigne = .Cells(.Rows.Count, 1).End(xlUp).Row
               If DerniereLigne < 42 Then CopierAvecFormatLignesColonnes .Range(.Cells(22, 1), .Cells(DerniereLigne, 23))
     
        End With
        End Function

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/08/2016, 08h56
  2. Ajout de ligne gardant la mise en forme
    Par Betty.jbt dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/08/2015, 17h07
  3. Trouver la dernière ligne avec nombre positif
    Par andrea0 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/02/2011, 20h32
  4. Ajout de ligne en gardant la mise en forme
    Par Steph_pas_douée dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/01/2010, 21h19
  5. Réponses: 2
    Dernier message: 31/08/2006, 09h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo