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 :

Transformer tableau + dupliquer les lignes en fonction des dates


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur de Données
    Inscrit en
    Janvier 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de Données
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2015
    Messages : 79
    Points : 20
    Points
    20
    Par défaut Transformer tableau + dupliquer les lignes en fonction des dates
    Bonjour,

    j'ai un tableau à produire avec des colonnes spécifique (sera ensuite importé dans SphinxiQ) à parti d'un autre tableau

    le fichier à produire doit juste respecter ces colonnes :

    • Code
    • Relation
    • Circulation
    • PourTrainNo
    • Société
    • Conducteur
    • Date
    • MiseEnPlaceVehicule
    • gare1
    • gare2
    • gare3
    • gare4
    • gare5
    • gare6
    • gare7
    • gare8
    • gare9
    • gare10
    • gare11
    • gare12
    • gare13
    • gare14
    • gare15
    • gare16
    • gare17
    • gare18
    • gare19
    • gare20
    • gare21
    • gare22
    • gare23
    • gare24
    • gare25
    • HT1
    • HT2
    • HT3
    • HT4
    • HT5
    • HT6
    • HT7
    • HT8
    • HT9
    • HT10
    • HT11
    • HT12
    • HT13
    • HT14
    • HT15
    • HT16
    • HT17
    • HT18
    • HT19
    • HT20
    • HT21
    • HT22
    • HT23
    • HT24
    • HT25
    • HR1
    • HR2
    • HR3
    • HR4
    • HR5
    • HR6
    • HR7
    • HR8
    • HR9
    • HR10
    • HR11
    • HR12
    • HR13
    • HR14
    • HR15
    • HR16
    • HR17
    • HR18
    • HR19
    • HR20
    • HR21
    • HR22
    • HR23
    • HR24
    • HR25
    • Montée1
    • Montée2
    • Montée3
    • Montée4
    • Montée5
    • Montée6
    • Montée7
    • Montée8
    • Montée9
    • Montée10
    • Montée11
    • Montée12
    • Montée13
    • Montée14
    • Montée15
    • Montée16
    • Montée17
    • Montée18
    • Montée19
    • Montée20
    • Montée21
    • Montée22
    • Montée23
    • Montée24
    • Montée25
    • Descente1
    • Descente2
    • Descente3
    • Descente4
    • Descente5
    • Descente6
    • Descente7
    • Descente8
    • Descente9
    • Descente10
    • Descente11
    • Descente12
    • Descente13
    • Descente14
    • Descente15
    • Descente16
    • Descente17
    • Descente18
    • Descente19
    • Descente20
    • Descente21
    • Descente22
    • Descente23
    • Descente24
    • Descente25
    • NbSI1
    • NbSI2
    • NbSI3
    • NbSI4
    • NbSI5
    • NbSI6
    • NbSI7
    • NbSI8
    • NbSI9
    • NbSI10
    • NbSI11
    • NbSI12
    • NbSI13
    • NbSI14
    • NbSI15
    • NbSI16
    • NbSI17
    • NbSI18
    • NbSI19
    • NbSI20
    • NbSI21
    • NbSI22
    • NbSI23
    • NbSI24
    • NbSI25
    • EmargementSNCFGareDépart
    • EmargementSNCFGareArrivée
    • Observations
    • MotifNonRespectheureDépart
    • SaisieTerminée
    • ScanSaisie


    voici le tableau en entrée de test : ENTREE.xls

    ENTREE.xlsx

    et le fichier de sortie correspondant (fait manuellement) : SORTIE.XLS (peut être un second onglet du fichier ENTREE aussi)

    SORTIE.xlsx

    Il faut donc faire des transformation dans le fichier, et surtout recopier autant de fois les lignes que nécessaire au niveau des dates.

    la 1ère ligne du fichier SORTIE explique rapidement les règles de chaque colonne.

    Dans le fichier ENTREE d'exemple il y a 6 arrêts mais il peut y en avoir jusqu'à 25.

    Il y a donc plusieurs choses à faire et je sèche un peu :
    - 1 : gérer correctement les colonnes gare1 à gare 25 et HT1 à HT25 du fichier de sortie, en fonction des élements renseigné dans le fichier ENTREE.
    - 2 : dupliquer les lignes en fonction des dates de circulation.

    pour le point 2, je pense qu'il faut faire une boucle entre date début et date fin, et tester à chaque fois si le jour de la semaine est à 1 dans la colonne correspondante du fichier ENTREE, il faut que je réfléchisse à cela. (Il sera peut être nécessaire d'avoir un autre onglet "férié" qui liste les jours fériés)

    pour le point 1, je ne vois pas trop comment faire à part parcourir la ligne et vérifier si la celulle P2 est renseigné, puis P3....

    Bref, si vous avez des idées sur comment faire cela, je suis prenneur.

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Points : 14 363
    Points
    14 363
    Par défaut
    Bonjour,

    Tu as bien commencé un début de macro ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Administrateur de Données
    Inscrit en
    Janvier 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de Données
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2015
    Messages : 79
    Points : 20
    Points
    20
    Par défaut
    Non, je n'ai pas commencé à coder pour le moment.

    Je réfléchi déjà la procédure, pour ensuite m'occuper du code.

    Est ce qu'il est préférable de mettre les valeurs des gares dans des variables pour les appeler ensuite, ou bien garder les "coordonnées" des cellules pour obtenir le contenu par la suite.

    Bref, je suis un peu perdu.

    j'ai déjà fait du VBA pour ACCESS (les données sont dans des tables, avec quelques variables, et des requêtes pour obtenir ce que je veux) mais jamais pour Excel.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Points : 14 363
    Points
    14 363
    Par défaut
    Est-ce que tu peux essayer d'expliquer comment tu reportes les données de la première ligne du classeur ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur de Données
    Inscrit en
    Janvier 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de Données
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2015
    Messages : 79
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    désolé, j'étais en déplacement.

    Les données de quel classeur ? ENTREE ?

    je ne sais pas trop en fait.

    Je sais juste que mon fichier en entrée ressemble au fichier ENTREE, et qu'au final, je veux avoir un autre onglet avec les données du fichier SORTIE.

    Comment faire entre, c'est justement ce que je ne sais pas comment faire pour le moment.

    le contenu de la ligne 1 de SORTIE ne change jamais.
    l'ordre des colonnes de change jamais non plus.

    Je voyais une moulinette du genre :

    Je récupère dans des variables les gares de la ligne 1 de ENTREE

    Je récupère dans des variables le contenu des cellules de la ligne 2 de ENTREE
    Je les "analyse" pour copier les données dans les bonnes colonnes de SORTIE, de la ligne 2 à la ligne n (en fonction de la période, des jours de circulation et du nombre de cars, le nombre de lignes varie de 1 à n)

    Je récupère dans des variables le contenu des cellules de la ligne 3 de ENTREE
    Je les "analyse" pour copier les données dans les bonnes colonnes de SORTIE, de la ligne n+1 à la ligne m

    et ainsi de suite tant que la ligne de ENTREE n'est pas vide.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Points : 14 363
    Points
    14 363
    Par défaut
    Bonjour,

    Il manque au moins une table des jours fériés :

    Nom : Capture.JPG
Affichages : 202
Taille : 22,1 Ko

  7. #7
    Membre à l'essai
    Homme Profil pro
    Administrateur de Données
    Inscrit en
    Janvier 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de Données
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2015
    Messages : 79
    Points : 20
    Points
    20
    Par défaut
    Exact, j'avais oublié l'onglet des jours fériés.

    j'ai tout remis dans un seul fichier Excel : TRAITEMENT_ALIMENTATION_SPHINX

    TRAITEMENT_ALIMENTATION_SPHINX.xlsx

  8. #8
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Points : 14 363
    Points
    14 363
    Par défaut
    Bonjour,

    Voici le code :

    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
    Sub test()
    Dim C As Range, Dat As Date, Plage As Range, Ligne As Long, Col As Integer, DerCol As Integer
    Dim Sh As Worksheet, I As Long, J As Long, Ctr1 As Integer, Ctr2 As Integer, Txt As String
    Dim Txt1 As String
    Ligne = 2
    With Sheets("ENTREE")
        Set Plage = .[A2].Resize(Application.CountA(.[A:A]) - 1)
    End With
    Set Sh = Sheets("ENTREE")
    With Sheets("SORTIE")
        For Each C In Plage
            For I = C.Offset(, 2) To C.Offset(, 3)
                Ctr1 = 8
                Ctr2 = 33
                Txt = ""
                If (C.Offset(, 11) = 1 And IsNumeric(Application.Match(I * 1, [JOURSFERIES!A:A], 0))) Or _
                    (Not IsNumeric(Application.Match(I * 1, [JOURSFERIES!A:A], 0)) And _
                    C.Offset(, Application.Weekday(I, 2) + 3) = 1) Then
    '            If Not IsNumeric(Application.Match(I * 1, [JOURSFERIES!A:A], 0)) Then
                    DerCol = C.EntireRow.Find("*", , , , xlByColumns, xlPrevious).Column
                    Ligne = Ligne + 1
                    .Cells(Ligne, 1) = C.Value & "-" & C.Offset(, 13).Value & "-" & _
                        Format(I, "yyyymmdd") & "-" & C.Offset(, 12)
                    For J = 16 To DerCol
                        If Sh.Cells(C.Row, J) <> "" Then
                            If Txt = "" Then
                                Txt = Sh.Cells(1, J)
                                .Cells(Ligne, 8) = Sh.Cells(C.Row, J)
                            End If
                            Ctr1 = Ctr1 + 1
                            Ctr2 = Ctr2 + 1
                            .Cells(Ligne, Ctr1) = Sh.Cells(1, J)
                            If Sh.Cells(1, J) <> "" Then Txt1 = Sh.Cells(1, J)
                            .Cells(Ligne, Ctr2) = Sh.Cells(C.Row, J)
                        End If
                    Next J
                    Txt = Txt & " - " & Txt1
                    .Cells(Ligne, 2) = Txt
                    .Cells(Ligne, 3) = C.Offset(, 13)
                    .Cells(Ligne, 4) = C.Offset(, 14)
                    .Cells(Ligne, 5) = C.Value
                    .Cells(Ligne, 7) = I
                End If
            Next I
        Next C
    End With
    End Sub
    Pour exécuter la macro, appuie sur le bouton "Traitement" situé en A1 de la feuille "ENTREE".

    https://we.tl/Te0EY9O3Xo
    Fichiers attachés Fichiers attachés

  9. #9
    Membre à l'essai
    Homme Profil pro
    Administrateur de Données
    Inscrit en
    Janvier 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de Données
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2015
    Messages : 79
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    Merci beaucoup !!!

    il y a juste un petit oubli sur la colonne H de SORTIE, ou il faut enlever 10 min à l'horaire du 1er arrêt.

    c'est bien celle ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Cells(Ligne, 8) = Sh.Cells(C.Row, J)
    j'ai essayé naïvement de rajouter un - "00:10" mais ça ne fonctionne pas.

    Comment faire pour simplement enlever 10 min ?

    En dehors de cela, j'ai testé plusieurs cas et ça marche super bien.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Points : 14 363
    Points
    14 363
    Par défaut
    1 = 1 jour
    10 mn =1/144

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Cells(Ligne, 8) = Sh.Cells(C.Row, J) - (1 / 144)

  11. #11
    Membre à l'essai
    Homme Profil pro
    Administrateur de Données
    Inscrit en
    Janvier 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de Données
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2015
    Messages : 79
    Points : 20
    Points
    20
    Par défaut
    Super !

    Je n'avais pas pensé à ça pour gérer les minutes.

    Merci beaucoup !!!

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

Discussions similaires

  1. [9.3] Dupliquer les lignes d'une table en fonction d'une valeur d'un champ
    Par rhinolophus dans le forum Contribuez
    Réponses: 2
    Dernier message: 03/04/2015, 12h44
  2. Réponses: 6
    Dernier message: 23/07/2014, 11h12
  3. Réponses: 4
    Dernier message: 14/02/2012, 17h18
  4. Réponses: 4
    Dernier message: 04/08/2009, 13h12
  5. StringGrid ajout de ligne en fonction des données
    Par thierrybatlle dans le forum Delphi
    Réponses: 3
    Dernier message: 26/05/2006, 14h58

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