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 :

Boucle en vba Excel [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut Boucle en vba Excel
    Bonjour,
    Avant tout, je vous souhaite a toutes et tous une excellente année 2016.

    Je viens vers vous pour un coup de main sur l'élaboration d'une petit programme en vba Excel.
    Afin d être plus explicite, je vais procéder par étape..

    J'ai un fichier Excel que je nomerais "Depot" avec plusieurs onglets (dans cette 1ere étape, j'ai reduit le fichier à deux onglets):
    - un onglet intitulé "DONNEE"
    - un onglet intitulé "Lundi_Transit"

    L'onglet DONNEE comporte 4 colonnes A, B, C , D avec comme en tête respectives
    "Provenance" "Conteneurisation" "Transporteurs" "Heure Arrivée lundi"

    L'onglet "Lundi_Transit" comportera plusieurs choses. Mais, dans un 1er temps, je vais m'arrêter au strict minimum..
    Dans la colonne A de cet onglet , j'ai inséré les intitulés
    en A1 rovenance
    en A2 : transporteur
    en A3 : heure théorique

    Je souhaiterais créer une boucle qui se résumerait ainsi :
    Dans l'onglet "DONNEE", si la cellule D2 est vide alors rien et si la cellule D2 est non vide alors:
    copier la cellule A2 de l'onglet DONNEE dans la cellule B1 de l'onglet "Lundi_Transit
    copier la cellule C2 de l'onglet DONNEE dans la cellule B2 de l'onglet "Lundi_Transit
    copier la cellule D2 de l'onglet DONNEE dans la cellule B3 de l'onglet "Lundi_Transit

    cette boucle se fonctionne jusqu'àla dernière ligne non vide de la colonne D de l'onglet "DONNEE"

    je vous aie joins le fichier Excel pour avoir une visions global de ma demande..

    Merci pour votre aide
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 344
    Par défaut
    Bonjour,


    Avant de faire quoique ce soit, tu as essayé d'écrire quelquechose au préalable ?
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    bonjour illight
    Oui j'avais comm"ncé par exrire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ligdebut = Range("D2")
    ligfin = Range("D2").End(xlDown).Row
     
    For Each cell In Range("D" & ligdebut & "D:" & ligfin)
    If Range("D2").Value <> "" Then

  4. #4
    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 !

    Déjà, une boucle est inutile ! Et même un code car il suffit de peu de manipulations :


    Et si vraiment un code est nécessaire, il suffit d'activer l'Enregistreur de macros avant les manipulations :
    une base de code est livrée sur un plateau ‼

    ______________________________________________________________________________________________________
    Je suis Paris, Charlie, …

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Bonjour Marc,
    Merci pour cette démonstation mais j'insite pour le code vba
    pour plusieurs raisons :

    1) les données de l'onglet DONNEE doivent être affichées sur 6 onglet nommés
    Lundi_transit; Mardi_Transit; Mercredi_Transit; jeudi_Transit; Vendredi_Transit; Samedi_Transit

    2) les données de l'onglet DONNEE peuvent changer d'une journée à l'autre ou d'une semaine à l'autre

    3) Sur les 6 onglets, je ne voudrais que les données dont il y a une heure d'arrivée dans l'onglet DONNEE

    je ne sais pas si je suis claire..


    Si on se concentre uniquement sur l'onglet "Lundi_Transit"...

    Je souhaiterais que si ,dans l'onglet "DONNEE", la cellule D2 est <> 0 alors dans l'onglet "Lundi_Transit":
    en B1, je vois afficher Paris (cellule A2 de l'onglet DONNEE)
    en B2, je vois afficher Pierre (cellule C2 de l'onglet DONNEE)
    en B3, je vois afficher 17:30 ( cellule D2 de l'onglet DONNEE)

    Ensuite, je passerais sur la cellule D3 de l'onglet DONNEE et si D3 est <>0 alors
    en C1, je vois afficher Lyon (cellule A3 de l'onglet DONNEE)
    en C2, je vois afficher Paul (cellule C3 de l'onglet DONNEE)
    en C3, je vois afficher 22:30 (cellule D3 de l'onglet DONNEE)

    Arrivée à la cellule D7 de l'onglet DONNEE, aucun enregistrement car la cellule est vide

    Et ceci jusqu à la dernière cellule non vide de la colonne D en partant du bas

    Pour que tu es une vision plus globale de l'excercice je te joins le fichier Excel au complet
    Fichiers attachés Fichiers attachés

  6. #6
    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




    Si tu veux absolument boucler, rien ne t'en empêche …

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    marc, pourrais tu m'aider...

  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




    C'est déjà fait avec l'animation précédente : cela donne quoi avec l'Enregistreur de macros, qu'as-tu entrepris ?!




    ______________________________________________________________________________________________________
    L'effort fait les forts …

  9. #9
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    cela donne pas grand chose marc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Range("A1:D34").Select
        Selection.Copy
        Sheets("Lundi_Transit ").Select
        Range("A1").Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=True
    Voici mon début de code vba mais cela ne fonctionne pas

    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
    Dim ligdebut, ligfin As String
    Dim cell As Range
    Dim casefin As Range
    Dim sh As Worksheet
     
    Set casefin = Worksheets("Lundi_Transit").Range("B1") '.End(xlDown)
    Set sh = Sheets("DONNEE")
     
    ligdebut = Range("D2").End(xlUp).Row
    ligfin = Range("D2").End(xlDown).Row
     
     
    For Each cell In sh.Range("D" & ligdebut & ":D" & ligfin)
    If Range("D2").Value <> "" Then
     
    casefin.Offset(0, -1).Value = sh.Range("A2").Value
     
     
    End If
    Next
     
     ActiveWorkbook.Save

  10. #10
    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

    « cela ne donne pas grand chose » n'éclaire pas vraiment quant à la difficulté rencontrée !

    Revoir la démonstration - pourtant visuelle - en affichant l'image en grand au besoin
    car ton code commence par la fin, mais où est donc passé tout ce qui précède ?!
    Ce n'est vraiment pas compliqué de reproduire ces pauvres manipulations …

    Sinon dans la voie compliquée du deuxième code, à quoi sert la variable cell de la ligne n°13
    si ce n'est pour l'utiliser en ligne suivante ?

    ______________________________________________________________________________________________________
    Copier / Coller n'est pas programmer !

  11. #11
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    je vais t'écouter marc .
    je vais refaire ta manip avec l'enregistreur de macro et puis je vais améliorer le code.
    je reviendrais vers toi si je rencontre une difficulté..

  12. #12
    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
    J'ai fait une mise à jour de la démonstration visuelle du post #4 …
    Quand on est pas doué en VBA, mieux vaut se poser la question : qu'est-ce qui peut être réalisé via Excel ?
    Et avec l'Enregistreur de macros, cela permet de débroussailler le terrain ! Le principe est clair …

    Comme je pense ne pas être bien disponible demain, en dehors du tutoriel sur la gestion des boucles dans Excel
    - vu le deuxième code la ligne n°14 sans lien avec la ligne précédente, cela sent le Copier / Coller
    sans brûler une paire de neurones ! T'en es à plus de 800 posts sur ce forum … - le tutoriel sur
    l'utilisation de variables tableau en VBA Excel est aussi recommandé
    afin d'arriver à ce genre de code de niveau intermédiaire devant répondre au besoin du classeur joint dans le post #5 :

    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 Demo()
            VA = Feuil1.Cells(1).CurrentRegion.Value
        For C% = 4 To 9
                ReDim TR(1 To 3, 1 To UBound(VA))
                      N& = 0
            For R& = 2 To UBound(VA)
                If VA(R, C) > "" Then
                      N = N + 1
                    TR(1, N) = VA(R, 1)
                    TR(2, N) = VA(R, 3)
                    TR(3, N) = VA(R, C)
                End If
            Next
            With Worksheets(C - 2).Cells(2).Resize(3, N)
                .Rows(3).NumberFormat = "_W h:mm _W"
                               .Value = TR
            End With
        Next
    End Sub
    ______________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

    ______________________________________________________________________________________________________
    Lire, c'est s'investir …

  13. #13
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Bonjour Marc,
    merci pour ce code mais j'ai commencé a créer un code à partir de l'enregistrement de macro.
    je me heurte à une écriture d'une variable qui permet de sélectionner une plage de cellule à partir de la cellule situé en dessous de l'entête de la colonne D ( l'entête se trouve en D1) et jusqu'à la derniere cellule non vide de la colonne B

    voici la variable que je n'arrive pas à créer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim sh As Worksheet
    Dim b As String
    Dim MaPlage As Range
    
    Set sh = Sheets("DONNEE")
    
    b = Range("d" & Range("a65536").End(xlUp).Row).Row ' derniere ligne non vide de la colonne B
    
    Set MaPlage = Set MaPlage = sh.Range(Range("D1"), Range("D1").Offset(1, 0) & b)
    je voulais ensuite mettre cette variable dans le bout de code suivant

    'trier par heure d'arrivée croissant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    With ActiveWorkbook.Worksheets("DONNEE").Sort
        .SortFields.Clear
        .SortFields.Add Range("D1") _
            , xlSortOnValues, xlAscending
            .SetRange = MaPlage
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlSortColumns
            .Apply
        End With

  14. #14
    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.

    Ligne n°9, pourquoi deux fois Set MaPlage = ? Quand une ligne est rouge, revoir la logique, la syntaxe …

    Et il manque la feuille de calculs devant les Range ‼
    Et après l'Offset mélange d'un torchon et d'une serviette ! (objet vs numéro de colonne …)
    Transformer un Range en numéro de colonne pour retransformer ce numéro en Range est quelque peu superflu …
    Depuis la version 2007, Excel n'est plus limité à 65 536 lignes, donc à ne pas coder en dur dans le code !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            Dim MaPlage As Range
        With ActiveWorkbook.Worksheets("DONNEE")
            Set MaPlage = .Range("D2", .Cells(.Rows.Count, 2).End(xlUp).Offset(, 2))
         MsgBox MaPlage.Address
            With .Sort
    '           suite du code
            End With
            Set MaPlage = Nothing
        End With
    Là j'ai sélectionné de D2 jusqu'en bas de la colonne D par rapport à la dernière saisie de la colonne B.
    S'il faut englober les colonnes B & C, il suffit juste de retirer l'Offset

    ______________________________________________________________________________________________________
    Je suis Charlie, …

  15. #15
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    merci pour l'aide marc mais le code bug lorsqu'il arrive à la ligne 10

    J'ai un message d'erreur qui apparait:

    erreur d'éxécution 438
    propriété ou méthode non gerée par cet objet
    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
    Dim MaPlage As Range
        With ActiveWorkbook.Worksheets("DONNEE")
            Set MaPlage = .Range("D2", .Cells(.Rows.Count, 2).End(xlUp).Offset(, 2))
         MsgBox MaPlage.Address
            With .Sort
    '           suite du code pour trier par heure d'arrivée croissant
    .SortFields.Clear
        .SortFields.Add Range("D1") _
            , xlSortOnValues, xlAscending
            .SetRange = MaPlage
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlSortColumns
            .Apply
            End With
            Set MaPlage = Nothing
        End With
    j'ai un message d'erreur qui apparait

  16. #16
    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



    Si l'adresse de MaPlage est correcte, alors il y a une incohérence avec ce que tu tentes d'effectuer
    comme par exemple D1 de la ligne n°8 en dehors de l'adresse (indiqué dans l'aide VBA) …

    Inclure la cellule D1 alors dans MaPlage, je l'ai exclue vu les explications

    Sinon poster un code généré par l'Enregistreur et expliquer clairement & exhaustivement le but visé.

  17. #17
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    marc je suis un peu perdu..

    Dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With ActiveWorkbook.Worksheets("DONNEE")
            Set MaPlage = .Range("D2", .Cells(.Rows.Count, 2).End(xlUp).Offset(, 2))
         MsgBox MaPlage.Address
    J'ai remplacé D2 par B2 ce qui donne
    .....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With ActiveWorkbook.Worksheets("DONNEE")
            Set MaPlage = .Range("B2", .Cells(.Rows.Count, 2).End(xlUp).Offset(, 2)) 'selection de la cellule B2
                                                                                    'à la derniere cellule non vide
                                                                                    'de la colonne D (offset(,2)
    ....
    car je souhaitais la plage allant de B2 à la dernière cellule de la colonne D

    pour ce qui est de l'adresse de Maplage je n'aie que ceci qui s'affiche $D$2:$D$33

    Le but du code ci dessous est, dans l'onglet "DONNEE", trier la plage B2 à la dernière cellule non vide de la colonne D en fonction d'un tri croissant de la colonne D
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    'code pour trier par heure d'arrivée croissant
            With .Sort '=With ActiveWorkbook.Worksheets("DONNEE").Sort
                .SortFields.Clear
                .SortFields.Add Range("D1"), xlSortOnValues, xlAscending
                .SetRange = MaPlage
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlSortColumns
                .Apply
            End With
            Set MaPlage = Nothing
        End With

  18. #18
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    marc, j'ai trouvé le probléme. C'est une erreur de frappe dans la ligne
    il n ' a pas de "="

  19. #19
    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
    Citation Envoyé par facteur Voir le message
    J'ai remplacé D2 par B2
    Ben non comme pourtant expliqué :

    • c'était D1 à la place de D2 ‼

    • Retirer l'Offset s'il est nécessaire d'inclure les colonnes B & C.


    Je suis Off jusqu'en début de soirée …

  20. #20
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Ok marc
    Merci encore*et bonne fin de journée

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. [XL-2010] Difficulté avec une boucle en VBA-Excel!
    Par lsebe2 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/11/2015, 01h13
  2. BOUCLE SQL + VBA Excel
    Par ducbrudebut dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 11/11/2013, 18h58
  3. Probleme de boucle dans VBA Excel
    Par Patrick717 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 27/02/2012, 18h24
  4. Boucles en VBA Excel
    Par JPR1347 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/08/2008, 22h15
  5. Traiter 100 fichiers avec une boucle sous VBA excel
    Par sebastien06 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/04/2008, 10h39

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