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 :

Executer la macro pour les lignes selectionnees


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Décembre 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Décembre 2013
    Messages : 51
    Par défaut Executer la macro pour les lignes selectionnees
    Bonjour a tous,

    Je souhaiterais avoir lq macro suivante qui fonctionne pour les lignes que je selectionne. C est un copie colle de certaines cellule de la ligne en question.
    La macro suivante fonctionne seulement lorsque je precise le numero de la ligne.

    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
    Sub Copypaste() 
        For x = 1 To 10000 
     
            If x = ThisWorkbook.Worksheets("sheet1").Cells(2, 11) Then 
                ThisWorkbook.Worksheets("sheet1").Cells(13, 1) = Workbooks("List Of materials").Worksheets("Sheet1").Cells(x, 1) 
                ThisWorkbook.Worksheets("sheet1").Cells(13, 5) = Workbooks("List Of materials").Worksheets("Sheet1").Cells(x, 2) 
                ThisWorkbook.Worksheets("sheet1").Cells(13, 2) = Workbooks("List Of materials").Worksheets("Sheet1").Cells(x, 6) 
                ThisWorkbook.Worksheets("sheet1").Cells(13, 3) = Workbooks("List Of materials").Worksheets("Sheet1").Cells(x, 7) 
                ThisWorkbook.Worksheets("sheet1").Cells(13, 4) = Workbooks("List Of materials").Worksheets("Sheet1").Cells(x, 5) 
                ThisWorkbook.Worksheets("sheet1").Cells(13, 7) = Workbooks("List Of materials").Worksheets("Sheet1").Cells(x, 9) 
                Range("A2:D2").Select 
                ActiveCell.FormulaR1C1 = "NAME OF PERSON REQUESTING WRITE OFF:  "Ced" 
     
                ThisWorkbook.Worksheets("sheet1").Cells(4, 1) = "DATE : " & "" & Date 
     
            End If 
        Next x 
    End Sub
    Merci a vous par avance,

  2. #2
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut Sur 1 seule ligne...
    Salut Ced,

    Des petits conseils :
    • Pour alléger la lecture de ton code, n'hésite pas à nommer tes objets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set Final = ThisWorkbook.Worksheets("Feuil1")
    Set Init = Workbooks("List Of materials").Worksheets("Sheet1")
    Comme ça tu utilise leurs noms. Surtout dans des codes avec de la répétition comme ici

    • La plus part du temps (ils y a des exceptions) il n'est pas nécessaire de sélectionner (une cellule, une plage...) pour y appliquer une action.

    Du coup,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      Range("A2:D2").Select 
                ActiveCell.FormulaR1C1 = "NAME OF PERSON REQUESTING WRITE OFF:  Pat DOYLE"
    Devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A2:D2").FormulaR1C1 = "NAME OF PERSON REQUESTING WRITE OFF:  Pat DOYLE"
    • Et maintenant pour répondre à ta question, il suffit de choisir la ligne de cellule active, de lui donner un petit nom (ici "LigneAvecUnPetitNom") pour plus de lisibilité et le tour est joué.


    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
    Sub Copypaste()
     
    Set Final = ThisWorkbook.Worksheets("Feuil1")
    Set Init = Workbooks("List Of materials").Worksheets("Sheet1")
     
    LigneAvecUnPetitNom = ActiveCell.Row
     
        For x = 1 To 10000
     
            If x = Final.Cells(2, 11) Then
                Final.Cells(LigneAvecUnPetitNom, 1) = Init.Cells(x, 1)
                Final.Cells(LigneAvecUnPetitNom, 2) = Init.Cells(x, 6)
                Final.Cells(LigneAvecUnPetitNom, 3) = Init.Cells(x, 7)
                Final.Cells(LigneAvecUnPetitNom, 4) = Init.Cells(x, 5)            
                Final.Cells(LigneAvecUnPetitNom, 5) = Init.Cells(x, 2)            
                Final.Cells(LigneAvecUnPetitNom, 7) = Init.Cells(x, 9)
     
                Range("A2:D2").FormulaR1C1 = "NAME OF PERSON REQUESTING WRITE OFF:  Pat DOYLE"
     
                Final.Cells(4, 1) = "DATE : " & "" & Date
            End If
     
        Next x
     
    End Sub

  3. #3
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut ... Et sur une plage de cellule
    Edit : Sur une plage, ça se complique un poil car il faut passer les lignes en revue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim LigneAvecUnPetitNom as range
    For Each LigneAvecUnPetitNom In Selection.Rows
    ...
    Soit:
    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
    Sub Copypaste()
    Dim LigneAvecUnPetitNom as range
     
    Set Final = ThisWorkbook.Worksheets("Feuil1")
    Set Init = Workbooks("List Of materials").Worksheets("Sheet1")
     
     
    For Each LigneAvecUnPetitNom In Selection.Rows
     
        For x = 1 To 10000
     
            If x = Final.Cells(2, 11) Then
                Final.Cells(LigneAvecUnPetitNom, 1) = Init.Cells(x, 1)
                Final.Cells(LigneAvecUnPetitNom, 2) = Init.Cells(x, 6)
                Final.Cells(LigneAvecUnPetitNom, 3) = Init.Cells(x, 7)
                Final.Cells(LigneAvecUnPetitNom, 4) = Init.Cells(x, 5)            
                Final.Cells(LigneAvecUnPetitNom, 5) = Init.Cells(x, 2)            
                Final.Cells(LigneAvecUnPetitNom, 7) = Init.Cells(x, 9)
     
                Range("A2:D2").FormulaR1C1 = "NAME OF PERSON REQUESTING WRITE OFF:  Pat DOYLE"
     
                Final.Cells(4, 1) = "DATE : " & "" & Date
            End If
     
        Next
     
    Next
     
    End Sub

  4. #4
    Membre confirmé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Décembre 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Décembre 2013
    Messages : 51
    Par défaut
    Merci beaucoup pour ton aide.
    Cependant je souhaite que lorsque je selectionne ma ligne dans fichier "liste of Material", les cellules correspondantes a ma macro se copient collent dans le 2eme fichier "Wite off etc..." (ligne apres ligne si plusieurs selectionnees)
    Il se peut que j'ai a selectionner plusieurs lignes egalement.

    Ce que j ai pour l instant :

    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
    Sub Copypaste()
     
    For x = 1 To 10000
     
    Set Final = ThisWorkbook.Worksheets("Sheet1")
    Set Init = Workbooks("List Of materials").Worksheets("Sheet1")
     
    ligneactive = Init.ActiveCell.EntireRow
     
    If x = ligneactive Then
    Final.Cells(13, 1) = Init.Cells(x, 1)
    Final.Cells(13, 5) = Init.Cells(x, 2)
    Final.Cells(13, 2) = Init.Cells(x, 6)
    Final.Cells(13, 3) = Init.Cells(x, 7)
    Final.Cells(13, 4) = Init.Cells(x, 5)
    Final.Cells(13, 7) = Init.Cells(x, 9)
     
    Range("A2:D2").FormulaR1C1 = "NAME OF PERSON REQUESTING WRITE OFF:  Ced"
     
     
    ThisWorkbook.Worksheets("sheet1").Cells(4, 1) = "DATE : " & "" & Date
     
     
     
     
     
    End If
     
    Next x
     
    End Sub
    Merci encore

  5. #5
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut
    Citation Envoyé par ced0802 Voir le message
    Merci beaucoup pour ton aide.
    Cependant je souhaite que lorsque je selectionne ma ligne dans fichier "liste of Material", les cellules correspondantes a ma macro se copient collent dans le 2eme fichier "Wite off etc..." (ligne apres ligne si plusieurs selectionnees)
    Il se peut que j'ai a selectionner plusieurs lignes egalement.
    Bon on va reprendre du début parce que là y a un gros décalage entre ta première demande, ton code et ta deuxième demande.

    t'as une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For x = 1 To 10000
    ...
    Next
    qui incrémente une variable x qui recherche le numéro de la bonne ligne dans ton tableau "liste of Material" (au passage liste en anglais c'est list)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     If x = Cells(2, 11) Then
                Cells(LigneAvecUnPetitNom, 1) = Init.Cells(x, 1)
                Cells(LigneAvecUnPetitNom, 2) = Init.Cells(x, 6)
                Cells(LigneAvecUnPetitNom, 3) = Init.Cells(x, 7)
                Cells(LigneAvecUnPetitNom, 4) = Init.Cells(x, 5)            
                Cells(LigneAvecUnPetitNom, 5) = Init.Cells(x, 2)            
                Cells(LigneAvecUnPetitNom, 7) = Init.Cells(x, 9)
     
                Range("A2:D2").FormulaR1C1 = "NAME OF PERSON REQUESTING WRITE OFF:  Pat DOYLE"
     
                Cells(4, 1) = "DATE : " & "" & Date
    End If
    Donc tu ne peux pas demander à ta macro de copier les cellules qui se trouve à la fois sur la ligne "x" et sur la ligne sélectionnée (vu qu'une cellule ne se trouve que sur une seule ligne.

    Avec les indications que je t'ai donné précédemment tu devrais pouvoir faire ce que tu veux, mais avant tout pose clairement ce que tu as tête et tu verras que la construction viendra beaucoup plus facilement.

  6. #6
    Membre confirmé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Décembre 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Décembre 2013
    Messages : 51
    Par défaut
    Voila ou j'en suis :

    Ma macro fonctionne lorsque je selectionne une ligne dans le fichier "List of Materials". C'est à dire que ça me copie bien les cellules souhaitées (qui font partie de la ligne selectionnée) oour être collées dans mon fichier base "Thisworkbook" (dans ma ligne 13).
    Ce que je souhaiterais, et que je n'arrive pas à faire fonctionner, est de selectionner plusieurs lignes (par exemple 5 ou 6 lignes) et que ça me les copie de la même façon dans "ThisWorkbook" les une à la suite des autres (ligne 13 , puis 14 etc..)

    Voici le code dans fichier "List of Materials" dans la partie thisworkbook :

    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
     
    Private mSelectedSheet As String
    Private mSelectedRow As Long
     
    Private Sub Workbook_SheetSelectionChange(ByVal Sht As Object, ByVal Target As Range)
        mSelectedSheet = Sht.Name
        mSelectedRow = Target.Row
    End Sub
     
    Public Property Get SelectedSheet() As String
        SelectedSheet = mSelectedSheet
    End Property
     
    Public Property Get SelectedRow() As Long
    SelectedRow = mSelectedRow
    End Property

    Voici le code dans mon fichier de base :

    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
    Sub Copypaste()
     
        Set Final = ThisWorkbook.Worksheets("Sheet1")
        Set Lom = Workbooks("List Of materials")
     
     
        x = Lom.SelectedRow
        Y = Final.Cells(Rows.Count, 1).End(xlUp).Row + 1
        If Y < 13 Then Y = 13
        If Y > 27 Then
            MsgBox "this Request for Writeoff is full, Please save and use a new one"
            Exit Sub
        End If
     
        Final.Cells(Y, 1) = Lom.Worksheets("sheet1").Cells(x, 1)
        Final.Cells(Y, 2) = Lom.Worksheets("sheet1").Cells(x, 6)
        Final.Cells(Y, 3) = Lom.Worksheets("sheet1").Cells(x, 7)
        Final.Cells(Y, 4) = Lom.Worksheets("sheet1").Cells(x, 5)
        Final.Cells(Y, 5) = Lom.Worksheets("sheet1").Cells(x, 2)
        Final.Cells(Y, 7) = Lom.Worksheets("sheet1").Cells(x, 9)
     
        Final.Range("A2") = "NAME OF PERSON REQUESTING WRITE OFF:  Ced"
     
        Final.Cells(4, 1) = "DATE : " & Date
     
     
    End Sub

    En vous remerciant pour votre aide précieuse.

  7. #7
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut
    En faite tu oublies d'incrémenter tes lignes autant sur ton tableau de départ que sur ton tableau d'arrivé

    Citation Envoyé par Neutthsch Voir le message
    pose clairement ce que tu as tête et tu verras que la construction viendra beaucoup plus facilement.
    On veut naviguer entre plusieurs lignes du tableau "List of Materials" donc il faut qu'on identifie les lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim VarLigne as range
    For Each VarLigne In Selection.Rows
    Sur les lignes en question tu veux récupérer des informations dans cellules qui ne se suivent pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Set Lom = Workbooks("List Of materials").Worksheets("sheet1")
    ...=Lom.Cells(VarLigne,1)
    ...=Lom.Cells(VarLigne,6)
    Et les coller dans des cellules qui ne se suivent pas d'un autre tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set Final = ThisWorkbook.Worksheets("Sheet1")
    Final.Cells(DestinationLigne, 1)=...
    Bon j'imagine que si on a X lignes sélectionnées dans "List Of materials" on colle sur X DestinationLigne donc il faut aussi les incrémenter. l'idée s'est de travailler dans la boucle for que l'on vient de créer en demandant à notre valeur d'augmenter de +1 à chaque passage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DestinationLigne=DestinationLigne+1
    On monte tout ça ensemble et là dessus on va pouvoir gérer les conditions :
    Ici j'ai créé une variable supplémentaire DestinationDeDepart qui enregistre le numéro de la première ligne écrite du tableau d'arrivé pour ne pas dépasser DestinationDeDepart+27
    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
    Sub test()
    Dim VarLigne As Range
    Dim DestinationLigne As Integer
     
    Set Lom = Workbooks("List Of materials").Worksheets("sheet1")
    Set Final = ThisWorkbook.Worksheets("Sheet1")
     
    DestinationLigne = Final.Cells(Rows.Count, 1).End(xlUp).Row
    DestinationDeDepart = DestinationLigne
    If DestinationLigne < 13 Then DestinationLigne = 13
     
    For Each VarLigne In Selection.Rows
        DestinationLigne = DestinationLigne + 1
     
        If DestinationLigne > DestinationDeDepart + 27 Then
            MsgBox "this Request for Writeoff is full, Please save and use a new one"
            Exit Sub
        End If
     
        Final.Cells(DestinationLigne, 1) = Lom.Cells(VarLigne, 1)
        Final.Cells(DestinationLigne, 2) = Lom.Cells(VarLigne, 6)
        Final.Cells(DestinationLigne, 3) = Lom.Cells(VarLigne, 7)
        Final.Cells(DestinationLigne, 4) = Lom.Cells(VarLigne, 5)
        Final.Cells(DestinationLigne, 5) = Lom.Cells(VarLigne, 2)
        Final.Cells(DestinationLigne, 7) = Lom.Cells(VarLigne, 9)
     
    Next
        Final.Cells(2, 1) = "NAME OF PERSON REQUESTING WRITE OFF:  Ced"
     
        Final.Cells(4, 1) = "DATE : " & Date
     
    End Sub
    J'ai pas exécuter, donc c'est possible que des erreurs se soient glissées

  8. #8
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour, bonjour !

    Citation Envoyé par Neutthsch Voir le message
    Pour alléger la lecture de ton code, n'hésite pas à nommer tes objets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Final = ThisWorkbook.Worksheets("Feuil1")
    Inutile pour les feuilles de calculs du classeur contenant le code, leurs CodeNames étant déjà définis ‼
    Par défaut le CodeName de la feuille "Feuil1" est Feuil1 à utiliser directement à la place de Final

    Complément d'information ici

    ______________________________________________________________________________________________________
    Je suis Charlie, …

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

Discussions similaires

  1. [XL-2007] executer une operation sur les lignes selectionnees
    Par AurelieB dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/12/2013, 11h05
  2. Des en-tête pour les lignes
    Par Foxynet777 dans le forum SWT/JFace
    Réponses: 10
    Dernier message: 29/09/2006, 10h34
  3. Réponses: 3
    Dernier message: 19/07/2006, 10h53
  4. tableau qui a deux couleur pour les lignes <td>
    Par abdess6600 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 23/05/2006, 16h50
  5. Réponses: 2
    Dernier message: 17/05/2006, 13h02

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