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 :

Répétition d'une macro sur plusieurs lignes


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 32
    Par défaut Répétition d'une macro sur plusieurs lignes
    Bonjour,

    Je suis débutante en VBA et je cherche a répéter une macro que j'ai faite avec l'enregistreur de macro. Sur mon fichier excel j'ai des donnée dan plusieurs cellules toutes sur la meme ligne( de A1 à AY1), je veux couper à partir de la colonne H toute les cellules vers la droite, puis les coller sur la ligne A2, Ensuite répéter l'opération c'est a dire couper les cellules de H2 à La macro est la suivante :

    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
    Sub macro1()
    '
    ' macro1 Macro
    '
        Range("H1").Select
        Range(Selection, Selection.End(xlToRight)).Select
        Application.CutCopyMode = False
        Selection.Cut
        Range("A2").Select
        Selection.Insert Shift:=xlDown
     
            Range("H2").Select
        Range(Selection, Selection.End(xlToRight)).Select
        Application.CutCopyMode = False
        Selection.Cut
        Range("A3").Select
        Selection.Insert Shift:=xlDown
     
    End Sub

  2. #2
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Je pense que ceci fera ton bonheur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Macro2()
     
    For i = 8 To 51
    y = Sheets(1).Range(Cells(1, i), Cells(Columns(i).End(xlDown).Row, i)).Count
        For x = 2 To y
        Sheets(1).Cells(x, 1).Value = Sheets(1).Cells(x - 1, i).Value
        Sheets(1).Cells(x - 1, i).Value = ""
        Next
    Next
     
    End Sub

  3. #3
    Membre expérimenté
    Homme Profil pro
    développeur
    Inscrit en
    Février 2013
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : développeur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 123
    Par défaut
    Bonjour,

    Déjà on va tenter de calculer le nombre de fois où l'on va exécuter l'action
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dim nbr_col as integer
    dim nbr_boucle as integer
    nbr_col = Cells(1,Cells.Columns.Count).End(xltoLeft).Column
    nbr_boucle = Application.WorksheetFunction.RoundUp(nbr_col / 8)
    Ensuite on s'occupe de la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    dim compteur as integer
    for compteur = 1 to nbr_boucle + 1
         Range("H" & compteur).Select
         Range(Selection, Selection.End(xlToRight)).Select
         Application.CutCopyMode = False
         Selection.Cut
         Range("A" & compteur + 1).Select
         Selection.Insert Shift:=xlDown
    next

  4. #4
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Trop long à mon goût mais ça devrait marcher

    Edit : j'ai trouvé une erreur dans mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Macro2()
    a = 1
    Z = Sheets(2).Range(Cells(1, 1), Sheets(2).Range("A1").End(xlToRight)).Columns.Count
    For i = 8 To Z
    y = Sheets(2).Range(Cells(1, i), Cells(Columns(i).End(xlDown).Row, i)).Count + 1
        For x = 2 To y
        Sheets(2).Cells(x, a).Value = Sheets(2).Cells(x - 1, i).Value
        Sheets(2).Cells(x - 1, i).Value = ""
        Next
    a = a + 1
    Next
     
    End Sub

  5. #5
    Membre expérimenté
    Homme Profil pro
    développeur
    Inscrit en
    Février 2013
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : développeur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 123
    Par défaut
    double boucle contre simple boucle avec plus d'opérations
    Sachant que si un jour les données dépassent AY1, va falloir réadapter ton code

  6. #6
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Non non c'est corrigé
    Et puis je suis pas fan des couper/coller ou copier/coller

  7. #7
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 32
    Par défaut message d'erreur
    Citation Envoyé par MacKay77 Voir le message
    double boucle contre simple boucle avec plus d'opérations
    Sachant que si un jour les données dépassent AY1, va falloir réadapter ton code
    Merci beaucoup pour ta reponse,

    Cependant j'ai un message d'erreur qui s'affiche et qui m'empeche d'executer la macro: erreur de compilation, argument non facultatif ( désignant la fonction roundup). Si je veux aller plus loin que AY mais jusqu'au bout de la ligne, comment dois-je modifier le code?

    Merci beaucoup

  8. #8
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 32
    Par défaut
    Citation Envoyé par Al__22 Voir le message
    Trop long à mon goût mais ça devrait marcher

    Edit : j'ai trouvé une erreur dans mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Macro2()
    a = 1
    Z = Sheets(2).Range(Cells(1, 1), Sheets(2).Range("A1").End(xlToRight)).Columns.Count
    For i = 8 To Z
    y = Sheets(2).Range(Cells(1, i), Cells(Columns(i).End(xlDown).Row, i)).Count + 1
        For x = 2 To y
        Sheets(2).Cells(x, a).Value = Sheets(2).Cells(x - 1, i).Value
        Sheets(2).Cells(x - 1, i).Value = ""
        Next
    a = a + 1
    Next
     
    End Sub


    Merci beaucoup,

    Mais quand j'execute la macro un message d'erreur s'affiche : erreur de compilation, argument non facultatif, ce message d'erreur désigne la fonction round up

  9. #9
    Membre expérimenté
    Homme Profil pro
    développeur
    Inscrit en
    Février 2013
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : développeur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 123
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dim nbr_col as integer
    dim nbr_boucle as integer
    nbr_col = Cells(1,Cells.Columns.Count).End(xltoLeft).Column
    nbr_boucle = Application.WorksheetFunction.RoundUp(nbr_col / 8, 0)
    Voilà ça devrait être bon

  10. #10
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Citation Envoyé par cecile1234 Voir le message
    Merci beaucoup,

    Mais quand j'execute la macro un message d'erreur s'affiche : erreur de compilation, argument non facultatif, ce message d'erreur désigne la fonction round up
    De quoi
    Moi j'ai aucune erreur nul part, et surtout il y a pas de fonction round up...

    C'est sur quelle ligne que tu as cette erreur ?

  11. #11
    Membre expérimenté
    Homme Profil pro
    développeur
    Inscrit en
    Février 2013
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : développeur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 123
    Par défaut
    Citation Envoyé par cecile1234 Voir le message
    Bonjour,

    je cherche a répéter une macro que j'ai faite avec l'enregistreur de macro.
    Je ne fait que répondre à la demande

  12. #12
    Membre éprouvé
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Août 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 162
    Par défaut
    Bonjour,

    Il faut utiliser les ".Offset(1, 1)"
    Je te laisse lire cette FAQ : http://vb.developpez.com/faqvba/?page=3.4.2


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Traitement1()
     
    Application.CutCopyMode = False
    Range(Range("H1"), Range("H1").End(xlToRight)).Cut
    Range("A2").Insert Shift:=xlDown
     
    Application.CutCopyMode = False
    Range(Range("H2"), Range("H2").End(xlToRight)).Cut
    Range("A3").Insert Shift:=xlDown
     
    End Sub

  13. #13
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Il va falloir que tu donnes plus de précisions car ce que tu veux faire n'a pas de sens. Si tu coupes les valeurs de H1 à AY1 et que tu les colles en dessous à partir de A2, sitôt que tu passe à la ligne 2 en coupant de H2 à AY2, tu vas récupérer une partie des valeurs issues de la ligne 1 !

  14. #14
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Avec ce code, les valeurs sont inscrites en feuille "Feuil2" et les valeurs source sont en feuille "Feuil1", à adapter :
    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
     
    Sub Test()
     
        Dim Fe1 As Worksheet
        Dim Fe2 As Worksheet
        Dim Plage As Range
        Dim Plage2 As Range
        Dim Plage3 As Range
        Dim I As Long
        Dim J As Long
     
        'défini les deux feuilles de travail, Fe1 est la feuille source
        'et Fe2 est la feuille cible (celle recevant les valeurs)
        Set Fe1 = Worksheets("Feuil1")
        Set Fe2 = Worksheets("Feuil2")
     
        With Fe1
     
            'défini la plage sur la feuille source sur la colonne A seulement mais on s'en fout, c'est pour avoir le nombre de lignes
            Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
            'initialise J car pas de ligne numéro 0
            J = 1
     
            'boucle sur les lignes de la plage source
            For I = 1 To Plage.Rows.Count
     
                'partage la ligne en cours en deux plages (A à G et H à AY)
                Set Plage2 = .Range(.Cells(I, 1), .Cells(I, 7))
                Set Plage3 = .Range(.Cells(I, 8), .Cells(I, 51))
     
                'inscrit les valeurs dans la feuille cible
                Fe2.Range(Fe2.Cells(J, 1), Fe2.Cells(J, 7)).Value = Plage2.Value
                Fe2.Range(Fe2.Cells(J + 1, 1), Fe2.Cells(J + 1, 44)).Value = Plage3.Value
     
                'saute la ligne qui vient de recevoir les valeurs du Range Plage3
                J = J + 2
     
            Next I
     
        End With
     
    End Sub

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

Discussions similaires

  1. [XL-2007] Création macro pour répéter une formule sur plusieurs lignes
    Par maxpj dans le forum Excel
    Réponses: 1
    Dernier message: 11/12/2015, 19h45
  2. [XL-2010] Création macro pour répéter une formule sur plusieurs lignes
    Par JoOz-ZeP43 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/10/2014, 18h06
  3. Répéter une macro sur plusieurs lignes
    Par sympas dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 21/02/2011, 20h03
  4. [TStringGrid] Une cellule sur plusieurs lignes.
    Par Caine dans le forum Delphi
    Réponses: 15
    Dernier message: 28/03/2007, 12h53
  5. Réponses: 2
    Dernier message: 18/11/2005, 21h40

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