Rechercher : dans
Par :

[Excel] Archivage d'une ligne de données.

Dernière réponse le 29 fév 2008 à 08:47:56 Alain3, le 22 oct 2006 à 14:02:37 
 Signaler ce message aux modérateurs

Bonjour,

J'aimerai pouvoir archiver des lignes de données reprenant des dates et des heures entre les colonnes "J" et "V" de mon tableau de la feuille "A" (Composé des colonnes de "A" à "AH").
La condition de déclenchement de l'archivage est que une heure soit inscrite dans la colone "U".
L'archivage doit s'effectuer sur la feuille "B", chaque ligne archivée doit s'inscrire l'une en dessous de l'autre à partir de la donnée "A5".
Je connais assez bien excel mais malheureusement pas son système de programmation! Pourriez-vous m'aider svp.

Merci,

Alain

Meilleures réponses pour « [Excel] Archivage d'une ligne de données. » dans :
[Excel] Trier sur les lignes (horizontalement), non les colonnes VoirMicrosoft Excel est configuré par défaut pour réaliser un tri sur les colonnes (Données / Trier). Pour trier les données horizontalement, il suffit de sélectionner les données à trier, puis de cliquer sur le bouton Options et, dans le panneau...
Figer une ligne dans un tableau Excel VoirPour figer la ligne 1 (par exemple) dans une feuille excel : Sélectionnez la ligne 2, Puis allez dans le menu "Fenêtres" et option "Figer les volets".
Transformer des colonnes en lignes dans un fichier VoirDifférents outils de Linux sont très doués pour travailler avec des lignes, mais pas avec des colonnes (c'est leur rôle) Sed, Awk, Grep, etc. Cependant, il peut arriver pour X raisons que vous ayez un fichier où les données sont à lire en...

1

JvDo, le 22 oct 2006 à 17:55:00
  • +1

Bonjour,

ça doit être très clair pour toi mais je ne sais pas en te lisant si tu veux récupérer des lignes ou des cellules (entre J et V) et peut-être uniquement celles qui sont des dates ou des heures.

Quant à ta colonne U qui est celle qui identifie les zones à archiver, quelle est l'heure critère?

Dernier point, une zone archivée peut-elle être archivable à nouveau?
Si non, comment les différencies-tu?

le plus simple pour tout le monde c'est que tu montes un exemple de tes données sur le site Cjoint.

Cordialement

Répondre à JvDo

2

Lupin.A, le 22 oct 2006 à 21:38:52

Bonjour,

Effectivement, il manque beaucoup d'information !

En supposant :

que le nom de la feuille A est [ FeuilleA ]
que le nom de la feuille B est [ FeuilleB ]
qu'un enregistrement est constitué des colonnes A à AH
que les données de l'enregistrement sont situés entre J et V
que la cellule de départ pour l'archivage est A5
que la colonne [ J ] n'est jamais vide
que la colonne [ U ] possède un format heure standard [ hh:mm:ss ]

que une fois les données archivés, la lgne complete de la feuille A sera détruite

un exemple de code à placer derrière la feuule A :

Option Explicit
'
Const FeuilleTrav = "FeuilleA"
Const FeuilleArch = "FeuilleB"
'

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim Region As Range, Plage As String, Position As Long, Temps As Date
    
    ' N'affiche pas le traitement
    Application.ScreenUpdating = False
    ' Trouve dernière ligne
    Position = Range("J2:J65535").End(xlDown).Row
    ' Recherche intersection valide
    Set Region = Application.Intersect(Range("U1:U" & Position), Target)
    
    If Region Is Nothing Then
        'MsgBox "La cible n'est pas dans la plage visé."
    Else
'        MsgBox "La cible est dans la plage visé."
        ' Si temps plus grand que 8 heures
        Temps = Target.Value
        If (Temps > "08:00:00") Then
            ' Désactive évènement
            Application.EnableEvents = False
            ' Défini plage à copier
            Plage = "J" & Target.Row & ":V" & Target.Row
            ' Sélectionne la plage à copier
            Range(Plage).Select
            ' Avec la sélection
            With Selection
                ' Place dans presse-papier
                .Copy
                ' Appel de fonction
                CopieVersArchive
            End With
            ' Désactive le copier/coller
            Application.CutCopyMode = False
            ' Sélectionne la cellule visé
            Target.Select
            ' Détruit la ligne qui a été archivé
            Target.EntireRow.Delete
            ' Réactive les évènement
            Application.EnableEvents = True
        End If
    End If
    ' Mise à jour de l'affichage activé
    Application.ScreenUpdating = True
    
End Sub
'

Function CopieVersArchive()

' Plage [ J , V ] dans plage [ A , AH ]
' Déclenchement sur condition heure, colonne [ U ]
' Case de départ de stockage Feuille B [ A5 ]

    Dim Plage As String, Position As Long
    
    ' Défini la pemière ligne libre
    Position = Sheets(FeuilleArch).Range("A5:A65535").End(xlDown).Row + 1
    Plage = "A" & Position
    ' Copie les données sur la ligne
    Sheets(FeuilleArch).Range(Plage).PasteSpecial
    Plage = "A" & (Position + 1)
    ' Sélectionne la case suivante
    Sheets(FeuilleArch).Select
    ActiveSheet.Range(Plage).Select
    ' Retourne à la FeuilleA
    Sheets(FeuilleTrav).Select

End Function
'


Ce code fonctionne sous mon environnement, soyez-prudent !

Lupin

Répondre à Lupin.A

3

Alain3, le 23 oct 2006 à 12:27:30

Bonjour,
Ne voyant pas comment vous envoyer une copie du programme, je vais donc essayer de vous éclairer quand à mes intentions.

Le vrai nom de la feuille"A" est "HKM GMN"
Le vrai nom de la feuille "B" est Archivage"
Les lignes du tableau dans leurs entieretés s"étendent bien entre "A" et "AH".
Les données à archiver sont bien comprises entre "J et V".
La cellule de départ de la feuille "Archivage" est bien "A5".
La colonne "J" n'est jamais vide.
La colonne "U" déclenchant l'archivage est bien une heure
" hh:mm".
Une fois l'archivage effectué, les données de la feuille "HKM GMN" ne doivent pas être supprimée mais bien seulement copiées.

Voici un petit exemple de données entre colonnes "J et V":

44536 10-10 23:52 10-10 23:45 9 8 -00:07 11-10 00:11 11-10 01:39 + 00:28.

Explications:

44536 = n° de train.
10-10 = date théorique d'arrivée
23:52 = heure théorique d'arrivée.
10-10 = date réelle d'arrivée.
23:45 = heure réelle d'arrivée.
9 = code de retard.
8 = idem.
-00:07 = différence entre arrivée théorique et arrivée réelle, une formule occupe cette donnée et doit être copiée également.
11-10 = date théorique de départ.
00:11 = heure théorique de départ.
11-10 = date réelle de départ.
01:39 = heure réelle de départ.
+ 00:28 = différence entre départ théorique et départ réel, une formule occupe cette donnée et doit être copiée également.

Dans l'espoir d'avoir comblé vos incertitudes, je reste à votre disposition pour de plus amples renseignements.

Cordialement,

Alain.

Répondre à Alain3

4

Lupin.A, le 23 oct 2006 à 13:25:37

Bonjour,

Il manque une information :

comme JvDo a mentionné :

... , une zone archivée peut-elle être archivable à nouveau?
Si non, comment les différencies-tu?

je cite :

... Une fois l'archivage effectué, les données de la feuille "HKM GMN" ne doivent pas être supprimée mais bien seulement copiées.

Existe-t-il une collonne qui permette de savoir s'il y a eu archivage ?

Lupin

Répondre à Lupin.A

5

Alain3, le 24 oct 2006 à 11:07:40

Bonjour,

Et merci pour votre patience!

Il serait bien en effet de pouvoir ré-archiver des zones de données afin de corriger certaines erreurs possibles.
Il n'existe pas de colonne prévue afin de marquer l'archivage mais je peux facilement en intercaler une entre les colonnes "V" et "W" de la page "HKM GMN" donc en dehors de la zone d'archivage. L'apparition d'une lettre "A" dans cette colonne pour marquer l'archivage devrait suffir. Bien sûr, le ré-archivage doit alors "écraser" l'ancienne ligne erronée sur la feuille "archive".
Le tableau de la page "HKM GMN" s'étendra alors de la colonne "A" à "AI". La zone a archiver reste inchangée.

A bientôt et encore merci.
Alain

Répondre à Alain3

6

Lupin.A, le 25 oct 2006 à 00:57:34

Bonjour,

vous ajouter encore une condition qui change le tout !

je cite :

Bien sûr, le ré-archivage doit alors "écraser" l'ancienne ligne erronée sur la feuille "archive".

---------------

Attendu que la première spécification étant d'archivé à partir
de A5, maintenant il faut localiser l'archive pour réécrire.

Il faut donc un champs clé, spécifier une collonne non-vide
et toujours distinte (valeurs différentes) qui servira de
"clé primaire" pour les 2 feuilles.

Cela facilitera la requête pour localiser l'archive, elle pourra être
coder (modifier) en début de programme.

Lupin

Répondre à Lupin.A

7

Alain3, le 25 oct 2006 à 12:12:14

Bonjour,

J'ai bein recu votre dernier message, assez technique, je n'en comprend pas toutes les finesses! L'important est que vous sachiez de quoi il sagit. Je n'imaginait pas que ma dernière requête allait boulverser toute la programmation. Je tentais simplement de répondre à votre précedent message.
Faites donc pour un mieux...
Je reste à votre disposition pour d'éventuelles spécifications complémentaires.

Alain3.

Répondre à Alain3

8

Lupin.A, le 26 oct 2006 à 01:06:55
  • +1

Re :

dans tous les cas, il me semble impératif de fixer une colonne index
qui aura toujours une valeur distincte, genre un numéro qui s'incré-
mente automatiquement.

pour simplifier le travail, en exemple je pourrais rajouter une nou-
velle colonne [ a - aj ], et j'inscrirais le numéro de ligne de l'archive.
C'est à dire qu'au moment d'écrire l'archive sur le feuille archive,
il y aurait aussi sauvegarde du numéro de ligne de le feuille archive
sur la feuille source qui donnerait l'adresse en cas de mise à jour
de l'archive "écraser".

cette solution vous semble elle acceptable ?

Lupin

Répondre à Lupin.A

9

Alain3, le 26 oct 2006 à 16:08:19

Bonjour,

Je comprend mieux ce que vous voulez dire et je suis daccord avec votre proposition.

Merci.

Alain3.

Répondre à Alain3

10

Lupin.A, le 27 oct 2006 à 00:13:43

Bonjour,

Alors voici ce que ça donne :

Lo code a placer derrière la feuille :

Option Explicit
'
Const Cod_Archive = "A"

Const FeuilleTrav = "HKM GMN"
Const FeuilleArch = "Archivage"
'

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim Region As Range, Position As Long, Temps As Date
    Dim Adresse As String, Plage As String, NbrArc As Long
    Dim Valeur As Variant
    
    Application.ScreenUpdating = False
    Position = Range("J2:J65535").End(xlDown).Row
    Set Region = Application.Intersect(Range("U1:U" & Position), Target)
    
    If Region Is Nothing Then
        'MsgBox "La cible n'est pas dans la plage visé."
    Else
        'MsgBox "La cible est dans la plage visé."
        Temps = Target.Value
        If (Temps > "08:00:00") Then
            Valeur = Range("Ai" & Target.Row).Value
            Valeur = Mid(Valeur, (Len(Cod_Archive) + 1))
            Valeur = Val(Valeur)
            If (Valeur > 0) Then
                Valeur = Range("AJ" & Target.Row).Value
            Else
                Valeur = 0
            End If
            Application.EnableEvents = False
            Plage = "J" & Target.Row & ":V" & Target.Row
            Range(Plage).Select
            With Selection
                .Copy
                Adresse = CopieVersArchive(Valeur)
                If (Adresse <> "") Then
                    Range("AJ" & Target.Row).Value = Adresse
                    Adresse = Mid(Range("Ai" & Target.Row).Value, (Len(Cod_Archive) + 1))
                    If (Adresse <> "") Then
                        Range("Ai" & Target.Row).Value = Cod_Archive & (Adresse + 1)
                    Else
                        Range("Ai" & Target.Row).Value = Cod_Archive & "1"
                    End If
                Else
                    Range("AJ" & Target.Row).Value = ""
                End If
            End With
            Application.CutCopyMode = False
            ActiveCell.Offset(1, 0).Select
            Target.Select
            Application.EnableEvents = True
        End If
    End If
    Application.ScreenUpdating = True
    
End Sub
'

Function CopieVersArchive(ByVal PlgTmp As Variant) As String

    Dim Plage As String, Position As Long
    
    Position = Sheets(FeuilleArch).Range("A4:A65535").End(xlDown).Row + 1
    
    If (PlgTmp = 0) Then
        Plage = "A" & Position
    Else
        Plage = PlgTmp
    End If
    
    Sheets(FeuilleArch).Range(Plage).PasteSpecial
    Plage = "A" & (Position + 1)
    Sheets(FeuilleArch).Select
    ActiveSheet.Range(Plage).Select
    Sheets(FeuilleTrav).Select
    If PlgTmp = 0 Then
        CopieVersArchive = "A" & Position
    Else
        CopieVersArchive = PlgTmp
    End If

End Function
'



si vous tenter de faire un copier coller sur une cellule de la colonne U l'évènement est déclenché et ça plante, normal il n'y as pas de gestion d'évènement ce qui est très lourd...

si vous devez arrêter la macro, vous aurez besoin les évènements
seront désactivé, vous aurez besoin de ceci pour réactiver :

Sub ActiveEvenement()
    Application.EnableEvents = True
End Sub
'


et pour désactiver le déclenchement des évènements :

Sub DesactiveEvenement()
    Application.EnableEvents = False
End Sub
'


Colonne [ AI ] , la lettre A codé dans la constante [ Cod_Archive ]
suivi d'un nombre indiquant le nombre de fois archivé.

Colonne [ AJ ], adresse (lettrechiffre) de la ligne archivé

amusez-vous :-)

Lupin

Répondre à Lupin.A

11

Alain3, le 27 oct 2006 à 19:36:37

Bonsoir,

Encore merci pour votre aide!
Une petite question avant d'essayer votre programmation.
1. Derrière quelle feuille dois-je intéger le programme.
a. hkm gmn ou archive.
b. je suppose que je peux copier coller votre programmation dans outils/macro/visual basic editor?

Alain3.

Répondre à Alain3

12

Lupin.A, le 28 oct 2006 à 01:04:39

Bonjour,

Le code doit être placé derrière la feuille HKM GMN

a.)
n.b. Valider le nom des feuilles en debut de code,
le compilateur (interprèteur) est sensible à la casse.

b.)
pour copier coller, soyez vigilent lors de saut de ligne de l'editeur du forum, celle-ci devrait attérir en rouge dans l'éditeur de VBA.

dans l'éditeur VBA, on retrouve une fenêtre de code à droite
et 2 fenêtres à gauche, celle du haut donne la liste des objets
du projet. On peut y retrouver 4 types d'objets

Feuilles (Sheets)
Classeur (ThisWorkbook)
Fonction (Module)
Module de classe (ClassModule)

il faut repérer l'objet Feuille HKM GMN, effectuer un double-clic
l'éditeur ouvre alors la fenêtre de droite sur la feuille de code
correspondante à l'objet.

c.)
les deux petites routines pour activer/désactiver les évènements
doivent être placé dans un module pour être accessible du menu
Excel ->> //Outils/Macro/Macros...

bon courage

Lupin

Répondre à Lupin.A

13

Alain3, le 28 oct 2006 à 16:09:47

Bonjour,

J'ai placé le programme derrière la feuille" HKM GMN".
Au premier essai, rien ne s'est passé avec une heure de déclenchement inférieure à 08:00. Avec une heure de déclenchement supérieure à 08:00, le programme répond: erreur de compilation, erreur de syntaxe. Le programme plante après avoir sélectioné la zone à copier. J'ai remarqué dans la programmation un close conditionnelle temps" si 08:00 alors..." Quid?

Au deuxième essai, j'ai corrigé la casse de début de programme
et FeuilleArch = "Archivage" est devenu FeuilleArch="ARCHIVE" comme dans le programme. Là, le programme ne se plante plus, mais rien ne se passe?

Bien amicalement,

Alain3

Répondre à Alain3

14

Lupin.A, le 28 oct 2006 à 16:19:39

Re:

voilà, ce qu'il faut comprendre :

effectivement j'ai omis de modifier le nom de la feuille d'archivage,
méa culpa, toutes mes excuses !

une fois que le programme a planté, il est presque sur que les
évènements sont désactivés à cause de la ligne :

                  Application.EnableEvents = False


il vous faut réactiver les évènements du classeur en utilisant la routine :
Sub ActiveEvenement()
    Application.EnableEvents = True
End Sub
'

celle-ci doit être coller dans un module pour être accessible du menu Excel.

Menu Excel ->> //Outils/Macro/Macros.../ActiveEvenement

Lupin

Répondre à Lupin.A

15

Alain3, le 29 oct 2006 à 20:09:40

Bonsoir,

La macro de réactivation fonctionne.
Après avoir transformé "Archive" en "ARCHIVE" dans la programmation, le débogueur s'arrête à: (Feuille ARCHIVE) comme montré ci-plus bas et donne comme code: "erreur de compilation variable non définie".

Le programme s'arrête après la sélection de la zone à copier.

Function CopieVersARCHIVE(ByVal PlgTmp As Variant) As String

Dim Plage As String, Position As Long

Position = Sheets(FeuilleARCHIVE).Range("A4:A65535").End(xlDown).Row + 1.

Bien cordialement,

Alain3.

Répondre à Alain3

16

Lupin.A, le 30 oct 2006 à 12:09:34

Re:

alors voilà, il ne faut pas modifier les noms de constante :

Function CopieVersARCHIVE(ByVal PlgTmp As Variant) As String

Dim Plage As String, Position As Long

Position = Sheets(FeuilleARCHIVE).Range("A4:A65535").End(xlDown).Row + 1.

est et doit rester :

Function CopieVersArchive(ByVal PlgTmp As Variant) As String

Dim Plage As String, Position As Long

Position = Sheets(FeuilleArch).Range("A4:A65535").End(xlDown).Row + 1

c'est plutôt à la définition de constante qu'il faut modifier le nom
de la feuille :

en début de code vous avez l'expression suivante :
Const FeuilleTrav = "HKM GMN"
Const FeuilleArch = "Archivage"
'
deviendra plutôt :

Const FeuilleTrav = "HKM GMN"
Const FeuilleArch = "ARCHIVE"
'

Lupin

Répondre à Lupin.A

17

Alain3, le 2 nov 2006 à 11:42:26

Bonjour,

Désolé de n'avoir pas pu donner réponse immédiatement.

Les changements demandé à votre précedent message ont été apportés, mais le programme plante et une demande de débogage apparaît, qui me renvoie à: Scheets(FeuilleArch).Range(Plage).PasteSpecial.

Bien à vous,

Alain3

Répondre à Alain3

18

Lupin.A, le 2 nov 2006 à 23:42:01

Re:

je crois ce qui sera plus simple, tester mon exemple

dans votre environnement, chez moi c'est nickel

http://www.oricom.ca/lupin/util/archiver.zip
ce lien n'est que temporaire, désolé :-(

qu'arrive-t-il chez vous et si ça plante, vérifier la
version exacte de Excel !

Excel 2002 10.2614.2625

Vérifier les options régionales, qu'elles sont-elles ?

En fait, adresser une feuille à partir d'une feuille est toujours
plus délicat que de l'adresser à partir d'un module.

Lupin

Répondre à Lupin.A

19

Alain3, le 5 nov 2006 à 13:52:18

Bonjour,

Et merci pour "le pied à l'étrier".
Votre page fonctionne bien, la mienne pas encore.
Je vérifie quelle discordance il y a entre les deux.

Encore merci pour votre professionnalisme.

Alain3.

Répondre à Alain3

20

Lupin.A, le 5 nov 2006 à 14:24:01

Bonjour,

Tout le plaisirs est pour moi :-)

Je sais que si l'instruction :
Sheets(FeuilleArch).Range("A4:A65535").End(xlDown).Row + 1
ne fonctionne pas bien !

assurez-vous que de A1 à A5 les cellules soient non-vide sur la feuille archive et modifier par :

Sheets(FeuilleArch).Range("A1:A65535").End(xlDown).Row + 1

Lupin

Répondre à Lupin.A

21

Lupin.A, le 5 nov 2006 à 14:39:16

Suite :

en tentant de modifier la ligne :

Const FeuilleArch = "Archivage"

pour :

Const FeuilleArch = "Archive"

la routine à planté exactement au même endroit que vous !

J'ai donc réinitialiser le nom de la constante en le modifiant :

Sous VBE :
//Menu/Édition/Remplacer

FeuilleArch
Par
FeuilleArchive

Une fois le nom de la constante remplacer dans tous le programme

je m'assure que le compilateur est bien accroché sur le nom de la
constante en modifiant la casse d'une lettre :

ex :

de Const FeuilleArchive = ...

je modifie

à Const FeuilleArcHive = ...

Dans le programme le nom doit suivre automatiquement sans
autre interventions.

je vous fais grace du pourquoi et du comment, sachez simplement
que le compilateur (l'interprèteur) a une mémoire !

Lupin

Répondre à Lupin.A

22

titi14200, le 19 fév 2008 à 11:44:00

Bonjours,

voila je souhaiterais faire pour mon boulot une macro qui me paraît similaire...
je souhaiterais savoir si il est possible de creer une macro pour archiver toutes les données d'une ligne dans laquelle une cellule est assignée à une date de RDV et que cette dernière est dépassée.
je m'explique, je suis artisan et dans le cadre de mon emploi je prend mes RDV sur excel dans un tableau en assignant une ref un nom une adresse et un numéro de tel sur chaque ligne de rdv mais je n'ai pas toujours le temps d'aller à mon RDV et je voudrais que tous mes rdv louppés soient enregistrés dans une feuille annexe et ainsi reprendre un RDV avec les personnes concernées...
Est-ce possible???

Répondre à titi14200

23

titi14200, le 19 fév 2008 à 17:48:07

Déjà est-il possible de faire apparaitre la date du jour sur excel car une simple comparaison je saurais faire mais je n'arrive pas à le faire à partir de la date du jour sans avoir à la rentrer manuellement?

Merci de vos réponses

Répondre à titi14200

24

 René, le 29 fév 2008 à 08:47:56

Bonjour,

j'ai un tableau avec deux feuilles à plusieurs colonnes.
dans la première feuille j'ai une colonne pour mettre un "x"
et je voudrais que dans la deuxième feuilles vienne s'ajouter
la ligne ou j'ai mis mon "x" mais pas en sautant les lignes.
comment puis-je faire.
si vous voulez je peux vous envoyer par mail un exemple du tableau.
à bientôt

René

Répondre à René