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 :

creation d'une boucle


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 creation d'une boucle
    Bonjour tout le monde

    J'ai cree un fichier "liaison" a l'aide d'une macro intitule "transport" .
    Lorsque le travail de ce fichier est termine ,il est transfere, a l'aide d'un userform, sur un autre fichier intitule "echange 2009".

    Pour info,
    Lorsque le fichier "liaison" est transfere sur le fichier "echange 2009",
    la colonne date du fichier "liaison" se retrouve dans la colonne C du nouveau fichier "echange 2009".

    Sur ce fichier "echange 2009", j'ai cree deux nouvelles colonne A et B intitulees , respectivement, "quai" et "mois".
    Dans la colonne "quai" se trouve le mot "ARRIVEE " ou "DEPART".
    Ces 2 mots proviennent de la cellule B1 du fichier "liaisons".

    A l'aide de la boucle "For To Next", le mot "ARRIVEE" ou "DEPART" vient s'inserer automatiquement dans la premiere cellule vide de la colonne A du fichier "echanges 2009"et ce jusqu'a la derniere cellule de cette meme colonne A.

    J'aimerais faire la meme chose avec les cellules de la colonne B "mois" du fichier "echanges 2009" (sous le format "mmmm-aaaa") qui reprendrait les valeurs de la colonne C "date" du fichier "liaison".
    Mais dans ma macro "transport", toutes les cellules de la colonne B ("mois"), du fichier "echanges 2009", reprennent uniquement la valeur qui se trouve dans la cellule "Cells(6, 1)" du fichier "liaison" c'est a dire dans la cellule "A6". Alors que j'aimerais que lorsque dans le fichier "echange 2009":
    si C3=01/01/09 alors en B3=janvier
    si C4=01/02/09 alors B4= fevrier
    etc jusqu'a C14=01/12.09 alors B14=decembre


    Vous trouverez ci dessous, la macro "transport" avec en rouge la variable "date en cours " qui me pose probleme et qui correspond a la valeur qui doit etre insere dans les cellules de la colonne B ("mois") du fichier "echanges 2009".

    PS : en piece joint , je vous envoie le fichier "liaison" et le fichier "echanges 2009"

    Merci de votre aide

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    Sub transport()
    
    
    Dim c As Integer
    Dim DateEnCours As Date
    Dim Quai As String
    Application.ScreenUpdating = False 'la mise à jour de l'écran est désactivée
    
    Cells.Select
    On Error Resume Next 'gestion des erreurs qui permet de continuer le programme
    'meme s'il y a une erreur : dans ce ca precis les les filtres peuvent etre tous affiches
    ActiveSheet.ShowAllData ' afficher tous les filtres
    On Error GoTo 0 ' interruption de la gestion des erreurs
    
    DateEnCours = Cells(6, 1).Value ' cellule de la sixieme ligne, premiere colonne soit A6 Quai = Cells(1, 2).Value ' cellule de la premiere ligne, seconde colonne soit B1
    
    
    c = Range("c" & Range("c65353").End(xlUp).Row).Row ' formule pour recuperer le N° de la dernière ligne de la colonne C
    Range("A6:V" & c - 1).Select ' selection du tableau allant de la cellule B3 a la derniere cellule de la colonne V
    Selection.Copy
    
    'sélectionner / ouvrir le fichier "echanges 2008"
    On Error GoTo GestionErreurFichier
    Workbooks("echanges 2009.xls").Worksheets("donnees hermes").Activate
    On Error GoTo 0
    
    Cells.Select
    On Error Resume Next 'gestion des erreurs qui permet de continuer le programme
    'meme s'il y a une erreur : dans ce ca precis les les filtres peuvent etre tous affiches
    ActiveSheet.ShowAllData ' afficher tous les filtres
    On Error GoTo 0 ' interruption de la gestion des erreurs
    
    Range("C2").Select
    If Range("C3").Value <> "" Then Range("C2").End(xlDown).Select 'Si la cellule C3 n'est pas vide,
    'on selectionne la derniere cellule non vide de la colonne D. Si C3 est libre, la derniere cellule non vide est C2.
    ActiveCell.Offset(1, 0).Select 'On selectionne la cellule situee une ligne en dessous de la cellule active.
    
    LigDeb = ActiveCell.Row 'ligne active
    
    On Error Resume Next 'gestion des erreurs qui permet de continuer le programme
    'meme s'il y a une erreur : dans ce ca precis les les filtres peuvent etre tous affiches
    
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False ' on copie le tableau
    'selectionner a partir de la premiere ligne vide de la feuille "echange 2008
    Application.CutCopyMode = False 'instrcution qui permet d'effacer la marque de selection autor de la plage copiee
    
    On Error GoTo 0 ' interruption de la gestion des erreurs
    
    Creation d'une boucle For to next
    LigFin = Range("C2").End(xlDown).Row 'derniere ligne non vide de la colonne C
    
    For Lig = LigDeb To LigFin ' derniere ligne non vide de la colonne C
    
    Cells(Lig, 2).Value = DateEnCours 
    Cells(Lig, 1).Value = Quai
    
    Next Lig
    
    
    
    Application.ScreenUpdating = True 'la mise à jour de l'écran est activée
    
    Columns("B:B").Select
    Selection.NumberFormat = "mmmm-yyyy"
    
    Columns("X:X").Select
    Selection.NumberFormat = "#,##0"
    
    
    ' CE QUI SUIT N'A PAS D"IMPACT SUR MON ANOMALIE
    ' creation d'une boucle do..loop ; celle -ci commence a partir de la cellule x (ligne 3 colonne 2) et s'arrete a la premiere cellule vide rencontree dans la colonne 2
    Lig = 3
    Do
    x = Cells(Lig, 2).Value
    If x = "" Then Exit Do ' si la cellule est vide alors je quitte la boucle
    Lig = Lig + 1 ' si la cellule est NON vide alors on aditionne a la ligne 3 la ligne de dessous
    Loop
    LigFin = Lig - 1 ' sortie de la boucle . Lig -2 =Numero de la derniere ligne non vide
    LigDeb = 2
    Cells(1, 1).Select
    
    Range("K1").Select
    ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[" & LigDeb & "]C:R[" & LigFin - 1 & "]C)"
    Range("K1").Select
    Selection.Copy
    Range("K1:V1,X1").Select
    Range("K1:V1, X1").Select
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    
    Application.CutCopyMode = False 'instrcution qui permet d'effacer la marque de selection autor de la plage copiee
    
    Exit Sub
    
    
    GestionErreurFichier:
    Workbooks.Open Filename:="C:\Documents and Settings\GHEMMAZI Hayette\Desktop\echanges 2009.xls" 
    Resume
    
    ActiveWorkbook.Save
    
    End Sub

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Déjà, corrige cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c = Range("C65536").End(xlUp).Row
    Ensuite, la formule pour sélectionner toute la plage de données peut être simplifiée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim Plage as range
    Set Plage = Worksheets("NomDeLaFeuille").Usedrange
    Plage.copy
    Ensuite ça devient plus compliqué pour moi. Dans ces trois lignes, tu parles de C2 de C3 et de colonne D (???)
    Tu aurais intérêt à utiliser toujours la même formule pour avoir le N° de la première ligne vide de ta colonne ou de ta feuille. Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Col = "C"
    DerLig = Range(Col & 65536).End(xlUp).Row
    PremLigVide = DerLig + 1
    'ou
    PremLigVide = Range(Col & 65536).End(xlUp).Row + 1
    Selon ce que j'ai compris...

    Tu peux ensuite simplifier ton code de copie
    'à partir de là
    Cells(1, 1).Select
    'Jusque là
    Application.CutCopyMode = False
    Code qui, sans sélection, "pourrait" se limiter à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Range("K1").FormulaR1C1 = "=SUBTOTAL(9,R[" & LigDeb & "]C:R[" & LigFin - 1 & "]C)"
    Range("K1").Copy
    Range("K1:V1, X1").PasteSpecial Paste:=xlPasteFormulas
    'Application.CutCopyMode = False 'a supprimer aussi puisque tu n'as pas de sélection
    La sélection alourdit la procédure, le code, et ralentit l'exécution. A une ou deux exceptions près, la sélection n'est jamais nécessaire.

    Bon ! Repartons du début.
    Que veux-tu dans ton fichier "echange 2009"
    Reprendre chaque date de la colonne C (de quel fichier ? Quelle feuille ? )et coller le mois en toute lettre dans la colonne B (de quel fichier ? Quelle feuille ?)
    Même ligne, même feuille ?

    Pour obtenir le mois d'après une date, utilise la fonction Format
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(3, 2) = Format(CDate(Cells(3, 3)), "mmmm")
    Si ta colonne C est formatée, Cdate n'est pas indispensable.
    Pourquoi utiliser Cdate ? Parce que je crois avoir compris que tu ne collais que des valeurs, sans format, et si tu as un N° de série, non une date formatée, VBA peut ne pas identifier une date.
    Bref, tu testes

  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 boucle
    Salut ouskel'n'or

    Merci pour ces renseignements...
    Concernant mon probleme, pour resumer je souhaiterais que lorsque je lance ma macro "transport";
    Dans le fichier " echanges 2009" les dates qui se trouvent dans la colonne C se copient automatiquement dans la colonne A en format mois uniquement.
    Il faut savoir que la macro transport puisent les valeurs dans le fichier "liaison".

    Merci

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Pour travailler sur deux fichiers simultanément, et donc deux feuilles, le mieux est d'instancier les feuilles (et/ou les classeurs, mais pas indispensable ici)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim FL1 as Worksheet
    Dim FL2 as Worksheet
         Set FL1 = Workbooks("liaison").Worksheets("LeNomDeLaFeuille")
         Set FL2 = Workbooks("echanges 2009").Worksheets("LeNomDeLaFeuilleAussi")
    Ensuite on peut travailler sur FL1 ou FL2. Ex (hors contexte mais seulement pour te faire comprendre) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FL2.Cells(3,1) = Format(cdate(FL1.Cells(3,3)),"mmmm")
    Ça simplifie l'écriture et donc la relecture.
    Ceci dit, tu as toutes les infos pour faire ce que tu veux dans ma réponse précédente.
    Le seul point qui achoppe est que dans ton premier message tu dis
    si C3=01/01/09 alors en B3=janvier
    si C4=01/02/09 alors B4= fevrier
    etc jusqu'a C14=01/12.09 alors B14=decembre
    et dans le dernier
    Dans le fichier "echanges 2009" les dates qui se trouvent dans la colonne C se copient automatiquement dans la colonne A en format mois uniquement.
    Et là, c'est à toi de voir.
    Par contre tu as le code qu'il te suffit d'adapter à la bonne colonne.
    Bon courage

  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 boucle
    Lorsque dans le premier message j'ai ecris :
    si C3=01/01/09 alors en B3=janvier
    si C4=01/02/09 alors B4= fevrier
    etc jusqu'a C14=01/12.09 alors B14=decembre

    et dans le dernier message, j'ai ecris :
    'Dans le fichier "echanges 2009" les dates qui se trouvent dans la colonne C se copient automatiquement dans la colonne B format mois uniquement (j'ai par erreur ecris colonne A alors que c'etais bien la colonne B du fichier "echange 2009")'.

    Il faut savoir que la macro "transport" recupere les dates dans la colonne A du fichier "liaison" et les transferent dans la colonne C du fichier "echange 2009" en format jj/mm/aa.
    Je voulais ensuite , toujours dans le fichier "echange 2009",que cette macro" transport", puisse copier les dates de la colonne C vers la colonne B.

    C'est pourquoi que j'ai eccris :
    si C3=01/01/09 alors en B3=janvier
    si C4=01/02/09 alors B4= fevrier
    etc jusqu'a C14=01/12.09 alors B14=decembre

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tu as déjà tous les renseignements utiles dans mes réponses précédentes mais bon...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Cell as range
    For each Cell in Range("C3:C" & Range("C3").End(xldown).row)
         Cell.Offset(0,-1) = Format(cdate(Cell),"mmmm")
    Next

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

Discussions similaires

  1. [Débutant] Creation de dossiers dont le nom s'incremente dans une boucle
    Par Lorddolf dans le forum MATLAB
    Réponses: 7
    Dernier message: 09/07/2010, 18h53
  2. boucle dans la creation d'une table
    Par PUARAI dans le forum MySQL
    Réponses: 4
    Dernier message: 10/02/2010, 23h44
  3. creation de N arraylist dans une boucle for
    Par tortuegenie dans le forum ASP.NET
    Réponses: 4
    Dernier message: 29/08/2008, 10h53
  4. Creation d'une boucle
    Par julie20 dans le forum SQL
    Réponses: 5
    Dernier message: 08/08/2007, 01h19
  5. Création de listener différent dans une boucle.
    Par Djobird dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 09/06/2006, 19h46

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